カテゴリー「Maya様 Scripting」の12件の記事

2016年12月15日 (木)

タイムスライダの選択領域を取得。

Maya のタイムスライダで、現在選択されている領域のスタートフレームとエンドフレームを取得したかったんです。 のメモ。


↓ これです。 この赤い領域のフレーム範囲が欲しい。

Mayatimeslider




MELバージョン:
$rangeArray = `timeControl -q -rangeArray $gPlayBackSlider`;
print ( "MEL ver : すたあと: " + $rangeArray[0] + "  えんど:" + $rangeArray[1] );

こういうことらしい。 timeControl コマンド-rangeArray フラグをオンにすると、結果が array として得られるんですね。 array の 0 個目がスタートフレーム、1 個目がエンドフレームということですね。 gPlayBackSlider というのが、UI 上のタイムスライダを表している、ということなんでしょうね。


Mayatimesliderstartendmel


こうやればできるよ、と人に教えてもらっただけなので、あとはもう、マニュアル見たり、実行した時の挙動を見て理解していくしかありません。いつものパターンですね。 これで合ってますか? 何か間違いがあったらご指摘ください。






Pythonバージョン:
import maya.cmds as mc
import maya.mel
aPlayBackSliderPython = maya.mel.eval('$tmpVar=$gPlayBackSlider')
rangeArray = mc.timeControl( aPlayBackSliderPython, q=True, rangeArray=True)
print ( "Python ver : すたあと: " + str(rangeArray[0]) + "  えんど:" + str(rangeArray[1]) );


うーむ、これでいいのかなあ・・・・。 一応、望んだ挙動にはなっています。 ただ、eval とか使ってる3行目が、なんかわかりにくいというか、美しくないというか、気に入らないですよねえ。 タイムスライダの取得ってこんな風にやるしかないのでしょうか? このコードは、マニュアルに載っていたものをただパクっただけです。 

http://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/CommandsPython/timeControl.html

一番下の、サンプルコードの中からパクりました。 グーグルで検索してみても、どうやらみなさんこの書き方をしているように見えなくもない。 うーん、なんか美しくない気がする。 もっといい書き方があれば是非教えて下さい。




俺にこの timeControl コマンドを教えてくれた人から、「スタートとエンドを取得していったい何をするの?」 と聞かれましたが、そりゃもう、いろいろです。 独自のお作法・手順を盛り込んだ自作 PlayBlast スクリプトを使うこともあるんですが、時間選択範囲だけを PlayBlast したい時とかね。 あとは、単純に、選んだ領域をシーンのプレイバックのスタートエンドに一発で設定したいとかね。 独自のアニメーション Bake スクリプトなんかにも使えそうですね。色々です。





.



| | コメント (0) | トラックバック (0)

2016年3月18日 (金)

scriptJob で複数行。

なんのことはないメモです。


scriptJob の話 を書いたことがありますが、 userSetup.mel とかに記述しておいて、シーンを開くたびにこのスクリプトを実行しろ、とかやるやつですね。


で、今日、ちょっと困りましてね。 Maya を起動した時に、自分で使いやすいように毎回やる操作ってのがあるわけで、そういうのを scriptJob に記述して自動化したいわけですが、1行で済むコードの場合はダブルクォーテーションでそのコードをくくればいいだけでした。 でも複数行に渡るようなコードの場合は、どう書くんだろう? という疑問が出てきましてね。


で、scriptJob のヘルプを見たら、例文として載っていたので、これでいいんだろうな、上手く行っているように見えるな、というメモです。



これは俺の userSetup.mel の一部なんですが、

Sjmultiline_2


上の方は、1行で書けるコードですね。 シーンを開くたびに Infinity をオンにしろ、とか書いてあります。前の記事で書いたやつです。


その下、緑色の印で囲ってある部分が、今回書いている 「複数行の場合」 ですね。 なんのことはない、global proc でプロシージャを宣言してそのプロシージャを呼べばいい、というだけのことのようでした。 これで上手く行っているように見えます。


1行の場合は、ダブルクォーテーションで囲って、その中にコードを書きますね。 複数行の時は、ダブルクォーテーションの代わりにプロシージャ名を書いておき、そして同じ userSetup.mel の中でそのプロシージャを記述しておく、ということですね。 同じファイル内にプロシージャつまりサブルーチンを書いておいてそれを呼び出している、ということですね。 サブルーチンは何行に渡って書いても良いわけですね。 うん。これでいいんじゃねえの。

誰かに聞いたわけでもなく、やってみて、なんか大丈夫そうというだけのアレですので、突っ込みがあれば是非お願いします。







余談ですが上記の例では、新規シーンを開くたびにカメラの farClipPlane を 1000000 に変えろというプロシージャを書いてますね。 今やっている仕事が、シーンの広さがかなり広くて、Maya さまのデフォルトの farClipPlane の 10000 じゃ範囲外になってしまってシーン全体が見えないんですよ。 なので新規シーンとかやるたびに、いちいち全カメラの farClipPlane の値を入力し直していたんです。 これがめんどくさくて、自動化したかった。 全カメラってのは、Top や Side など主に ortho カメラです。



っていうかね、シーンが広いと、pers カメラや自分で作成した普通のカメラで far clip plane を超えて見えなくなってしまうのは分かるんですが、なんで ortho カメラからも見えなくなってしまうんですか Maya さま? これ、すんげえ扱いづらいじゃないですか。  

ortho つまり Top や Side とかのカメラですよ。 これ、普通はレンダリングに使うカメラじゃなくてね、シーン全体の様子を把握するためにある 「神の視点」 的な特殊なカメラなんだから、シーンの広さに関係なく、常にシーン内のオブジェクトを表示して欲しいわけですよ。 でも ortho カメラには 10000 などという far clip plane が設定されていて、そしてそのカメラは 20000 の高さにあったりする。 20000の高さで far clip が 10000 だから、地表近くにある 10000 以下の大きさのオブジェクトはもう、見えなくなってしまうわけですよ。 だからわざわざ far clip をいじる必要が出てくる。そしてそれを自動化するために、scriptJob とかなんとかやらなければいけなくなる。 なんなんですかね。もう。

XSI 村にある Top や Side などの ortho カメラは、シーンの大きさによってブツが見えなくなるということはありませんでした。常に見えていました。 それが普通に使いやすい状態だと思います。 Mayaさまは頭おかしいです。 うそです Maya さまごめんなさい。






あ、関係ないけど、おらの田舎でちょっと謎に思っていたこと・・・

Xsicamfarplane

これは ortho ではなく、通常のレンダに使うようなカメラのデフォルト値ですね。 Far Plane が 32768。 うん、この数字は昔から疑問に思っていたんだ。  32768 ってずいぶんキリがいいですねw なんの数値ですかw  


いや、きっと意味というか由来があるんだろうけどねw





.

| | コメント (2) | トラックバック (0)

2016年3月 8日 (火)

アウトライナで勝手に検索フィールドがアクティブで激怒。の続き。

アウトライナを MEL で作成すると、いくつでも作成できる代わりに、なぜか検索フィールドがアクティブな状態になって表示されやがるので激怒しますという話を前回書きました。  解決するには、アウトライナウインドウを作った後にそのウインドウを setFocus コマンドでアクティブにしてあげれば、とりあえず検索フィールドのアクティブは外れるよ、と教えてもらった話でした。


↓このように書けばよいと。

--------------------------------------------

window -t "Outliner" fuckinOutliner;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus fuckinOutliner;


----------------------------------------------


しかしその後、問題が発覚しました。

このやり方だと、アウトライナが複数開けない


↓こんなエラーが出てしまいます。

// Error: line 1: Object's name 'fuckinOutliner' is not unique. //

あ~ そうか、ウインドウの名前を fuckinOutliner などとハードコーディングしちゃってるからですね・・・。 この名前でウインドウを作っちまうと、閉じない限りその名前でウインドウが存在するわけで、そして2個目以降も同じ名前でウインドウを作ろうとするからユニークネームにならず、エラーになるんですね。 なるほど・・・・ 勝手に1とか付けて解決してくれないのですね Maya さま。

ん~ これじゃ意味無いですね。そもそも、Mayaさまのインターフェースから普通にアウトライナを出すと、1つしかできないというのが元々の問題ですからね。 スクリプトでやれば複数いけるよ、ということでわざわざこんなスクリプト書いているわけですからね。 検索フィールドのアクティブ問題が解決したのはいいけど、アウトライナが複数開けなくなっちまったんでは、本末転倒ですからね。

ってことで、またおじさまに相談したのですが、いつものように一刀両断あっさり解決。  なるほど、ウインドウの名前をスクリプトに書いてしまわずに、window コマンドの戻り値を使えばいいんですね。

--------------------------------------------
{
string $w = `window -t "Outliner"`;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus $w;

}
----------------------------------------------

なるほど~ window コマンドの戻り値(ウインドウの名前)を変数に格納しておいて、あとで setFocus する時にこの変数を指定してやればいいわけですね。 なるほど~

※ 追記 { } を足しました  これあったほうがいいね。スコープっていうの? 変数の有効範囲が{ } に限定されるから、他のスクリプトと競合しなくていい。

なんか俺、いまだに mel の戻り値がよくわからんのですよ・・・・そのアクサングラーヴっていうの? ヘンな記号で全部囲うと戻り値が得られるんですよね。 いつもピンと来てないなあ・・・。 window コマンドの場合は、なるほど、ドキュメントを見ると、ウインドウの名前が戻り値になると書いてありますね。

http://help.autodesk.com/cloudhelp/2015/ENU/Maya-Tech-Docs/Commands/window.html

うーん、いつまで経っても慣れねえな・・・・ もっと書かないとダメだよなあ。 書いて書いて書きまくって自分用に調教するのが、Mayaさまと生きていくための唯一の道だと思う。


あるいは Maya さまを使わないというのが、Maya さまと生きていく道なのかも知れない。使わなければいいんだ。 Mayaさまがそこに居て下さってもかまわない。使わなければ。




ともかくこれでアウトライナをいくつでも出せるし、かつ検索フィールドがファッキンアクティブになってしまうという問題も解決できました。 調教がまた一歩前進した。 わーい

Fuckoutliner

| | コメント (0) | トラックバック (0)

2016年2月21日 (日)

アウトライナで勝手に検索フィールドがアクティブで激怒。

アウトライナを複数出したくて、色々方法はあるみたいですが、俺はスクリプトでやってます。


こんな感じの mel です。

---------------------------------------
window -t "Outliner";
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
---------------------------------------

これをホットキーに割り当てて起動すれば、フローティングのアウトライナがいくつでも開けますね。 


そもそも、普通にインターフェース上からアウトライナを開こうとすると、tear Off copy しない限り同時に1つしか開けないという仕様がアフォなんですがね Maya 様。 しかも、2つめのアウトライナを開こうとすると、エラーを出すとか何も起こらないとかいう挙動ならまだマシなんだけど、そうではなく、こともあろうに今まで開いていたアウトライナを別のビューとかに勝手に切り替えやがるんですよね。 俺の作業レイアウトを壊さないで下さい Maya 様。 っていうか今すぐ氏んで下さい。



でもまあ、上記のようにちょっとスクリプト書けばできるんだから許します。




ただね、このスクリプトで起動したアウトライナには問題がひとつあってね。 起動後、アウトライナ上の検索フィールドが勝手にアクティブになっているんですよ。 

Fuckol1

なぜ? そこを勝手にアクティブにする意味わかんないです Maya様。 しかも、普通にメニューから選んだアウトライナや、Tear Off Copy したアウトライナはそんなことないんですよ。 スクリプトで起動したときだけ、検索フィールドがアクティブになってるように見えます。意味わかんないです Maya様。


これがどう困るのかというとですね。 アウトライナを出した直後って、現在選択中のオブジェクトにジャンプするために、f キーを押すこと多いじゃないですか。 しかしこの f キーの入力は、現在アクティブになっている検索フィールドの中に行ってしまうわけです。 つまり選択中のオブジェクトにジャンプするのではなく、f という文字列を検索したことになっちまうわけです。

Fuckol2


もうね、この f は fuck の f ですね。 ファックしやがってください Maya様。 このファッキンディックレスアスホール野郎。


分かっちゃいるけど何度も繰り返してしまうこのミスオペレーション。このため、スクリプトでアウトライナ出した直後はまずどこかをクリックするみたいな、ヘンな手グセが付いてしまって来ているよ俺。 俺の手にいやらしい習慣を刷り込まないで下さい Maya様。





という相談を、いつものように空調屋のおじさまに持ちかけてみたところ、嘔吐デスクに質問してくれて、そしたらこんな答えが返ってきた。


スクリプトにちょっと書き足してください、と。
--------------------------------------------
window -t "Outliner" fuckinOutliner;
frameLayout -labelVisible false -h 400 -w 280;;
string $panel = `outlinerPanel`;
string $outliner = `outlinerPanel -query -outlinerEditor $panel`;
showWindow;
setFocus fuckinOutliner;
----------------------------------------------

これを実行すると、

Fuckol3

よしゃー 検索の入力フィールドのアクティブ外れたー

それでいいんだ 苦労かけやがって Maya様


アウトライナを出現させた後、そのアウトライナのウインドウ全体を setFocus でアクティブにすることによって、検索フィールドのアクティブを解除する、という方法なのですね。 苦しいですね Maya様wwwww  最初から、謎の検索フィールドアクティブをやめればいいじゃないですかwwwww 


なんでそういう風に作っちゃったのかなあ。 いや、意図はしてないんでしょうねおそらく。 他の何かの都合で入力フィールドをアクティブにするように書いたコードを、アウトライナのコマンドが起動されたときも呼ばれるようになってしまってこうなった、とか、そういう感じ? どうでしょうね。


ま、なんとかなったんだからよしとしますけど、
これ、嘔吐デスクの公式な回答ですからねw
苦しいw
フラッグシップソフトウェアでしょ。
ヒーローソフトウェアでしょ。
他の村を廃村にしてこれ1本で行きたいんでしょ。

なんかこの苦しい感、可愛くなってきちゃいそうで困るw




追記:
この書き方だとアウトライナが複数開けないことが判明しますた。 解決方法を新たな記事に書きますた。

.

| | コメント (0) | トラックバック (0)

2015年7月 1日 (水)

起動時にスクリプトを実行して下さい。の改良。scriptJobで行こう。

前に書いた記事2つ、やはりまだ不具合があるわけですよ。



起動時にスクリプトを実行して下さい。っていうか設定記憶して下さいMaya様

↑ この記事では userSetup.mel に mel スクリプトを記述すればいいらしいぜ、という話でした。 グーグル検索して分かったことを再メモしただけですね。


で、userSetup.mel に記述するんだぜという話自体には何も問題はなかったのですが、問題が出たのは、この記事の中で、グラフエディタの Infinity をオンにするということをやった後ですね。 

Maya様は、グラフエディタで Infinity の表示をオンにしてるのに、起動するたびにこれを勝手にオフにしやがるので(2015以降では記憶してくれるようになったそうです)、ならば起動するたびにスクリプトを実行してオンにしてやれと思ったわけですよ。 ということで、Infinity をオンにするスクリプトを userSetup.mel に書きました。

しかしここで問題発生。 Maya 起動直後、まだ UI がロードされてないタイミングでこのスクリプトが実行されているらしく、「グラフエディタで Infinity をオンにしろ」 というスクリプトを書いても 「グラフエディタなんてものはねえよ(まだロードされてないから)」 というアフォな事態が起こっていたようなのですね。



そこで、ちゃんと UI がロードされるまでスクリプトの実行を待ってもらおうということで、evalDeffered コマンドというものがあるということが判明したので、書きました。 

それがこの記事 ↓

ちょっと待ってから実行。


これで解決したかのように見えました。


・・・・しかし、また問題が・・・・


これ、確かに起動時は Infinity をオンにしてくれるわけですが、起動時だけなんですね。 その後、新規シーンを実行したり、既存のシーンを開いたりすると、Maya様はまたご親切にも Infinity をオフにしやがって下さるのですよ。 本当に毎回毎回、懇切丁寧にありがとうございます Maya 様!! \(゚∀゚)\


ということで、起動時にどうこうするというのは忘れて、新規シーン実行時、あるいは既存のシーンを開いた時にスクリプトが実行される方法を探ったのです。 XSI ではセルフインストール型のスクリプトに event を記述すればできますね。 これに相当するものを探していたのです。


そしたら偶然それを見つけた気がしまして、なじみの空調屋さんに検証をお願いしちゃったりして、なんとか解決した気がするというのが本記事です。 ああ前振りがなげえ。


ってことで、scriptJob コマンド です。

「新規シーンの時に、このスクリプトを実行」 「既存シーンを開いたら実行」 「選択しているオブジェクトが変わったら実行」 みたいに、指定したイベントが起こった時にスクリプトを実行させるものですね。 これを userSetup.mel に記述します。 そしたら、起動後、新規シーン後、既存シーン開いた後、全ての状態でちゃんと Infinity オンに出来ました。やっとの思いで。 長い道のりだった。


Infinity をオンにするコマンドは

scriptJob -event "SceneOpened" "animCurveEditor -edit -displayInfinities true graphEditor1GraphEd;";

こうなりますね。


SceneOpened というイベントが検知された時、つまりシーンが開かれた時に、それに続く animCurveEditor コマンドが実行されるということになります。 

新規シーンの場合は、「空っぽのシーンという既存シーンを開く」 という考え方になるようで、この SceneOpened でカバーされます。つまり、SceneOpened とだけ記述しておけば、新規シーンの時も既存シーンのときも、続くコードが実行されます。

一方、SceneOpened の代わりに NewSceneOpened と書くと、新規シーンの時だけ実行され、既存シーンを開くときは実行されないので注意が必要です。



SceneOpened や NewSceneOpened 以外にどんなイベントがあるのかは、

scriptJob -listEvents;

を実行すればズラズラと出てきますが、まあ、ドキュメントにも全部載っている みたいだからそっち見たほうがいいのかな。

関係ないけど、mel で -listなんちゃら ってオプションで表示させる時って、結果が改行もされずズラズラと長ったらしく表示されますよね。 これわかりにくいです Maya 様。 いつもテキストエディタにコピペして、スペースを改行に変換するとかアフォなことをやっているのですが、なんかもっと簡単にパッと全体を見れる方法ないものですかね。





ってことでもはや evalDeffered コマンドも使いません。この scriptJob コマンドだけで上手く行っているように見えます。しばらくこれで運用してみます。

scriptJob いいなあ。 XSI のイベントより遥かに手軽ですね。 XSI の方はセルフインストール型で記述することによってただのスクリプトではなくプラグインとして認識させて云々みたいな知識が必要だけど、Maya様のこれは、俺みたいにほとんど分かってない人間でも、こんな簡単な1行を書くだけで一応は出来ちゃうっぽい(分かってない故の落とし穴がたくさんありそうだが・・・)。 さすが Maya様です。ありがとうございます。





ちなみに Infinity だけじゃなく Buffer Curve も起動するたびにオフにされてしまうので、同じく scriptJob コマンドでオンにしてあげてます。

scriptJob -event "SceneOpened" "animCurveEditor -edit -showBufferCurves true graphEditor1GraphEd;";



あと、俺の Maya 様は、HeadsUp Display でワールド原点に軸が表示されちゃうんだよなあ。これデフォルトでこうでしたっけ? 邪魔なので、それをオフにするコードも scriptJob でやってます。

scriptJob -event "SceneOpened" "toggleAxis -o off;";



このように、起動時やら新規シーン時やら既存シーンを開いた時やらにやって欲しいことは全部、scriptJobコマンドで userSetup.mel にズラズラと記述してしまえばいいと思います。多分。




SelectionChanged イベントは、どうでしょう、重くならないかな。選択しているオブジェクトに変化があるとトリガになるわけですが、これも色々便利に使えそうですが、XSI でこれに相当することをやるとけっこう重くなってたんですよね。 選択状態を常に監視するわけですから、バックグラウンドに常駐してある程度プロセッサの処理を食ってしまっている的な感じでした。 今度 Maya 様でもやってみよう。



.

| | コメント (0) | トラックバック (0)

2015年6月 2日 (火)

俺のキー 淫サートキーフレーム

挿入したいんです。 淫サートです。



アニメーション作業中はグラフエディタ上で多くの時間を過ごすわけですが、その中でも、既存のアニメーションカーブにキーフレームを挿入するってのは実に頻繁にやる操作でして、Maya の標準のやり方だとちょっとだけ気に食わなかった。ちょっとだけね。

だからスクリプトを書いてみたんですが、別にどうというアレでもありません。ただの小スクリプト。



-------------------------------------------------------

//    俺のキー 淫サートキーフレーム
//    選択中のアニメーションカーブの現在フレームに
//    キーフレームを挿入し、そのキーフレームを選択状態にする
//    そんだけ。

OrenoKeyFrame_Insert();
global proc OrenoKeyFrame_Insert()
{
    string $selectedAnimCurves[] = `keyframe -q -selected -name`;
    if ( size($selectedAnimCurves) ) 
    {
        setKeyframe -insert $selectedAnimCurves;
         
        float $currentTime;
        $currentTime = `currentTime -q`;
        selectKey -clear;
        selectKey -time $currentTime $selectedAnimCurves;
    }
}

-------------------------------------------------------

OrenoKey_InsertKeyframe.mel


アニメーションカーブを選択して実行すると、そのカーブの現在フレームにキーフレームを挿入します。 そしてそのキーフレームを選択します。 そんだけ。 ほんとそんだけです。

Insertkey1

この 挿入したキーを選択 という状態になっていた方が俺には都合が良くてね。大抵の場合すぐにいじるのでね。 大量にアニメーションするので、こういう小さいことが意外と影響大きいわけですよ。 ホットキーに即登録しました。  選択状態にしたいというのもあるけど、実はこの 「ホットキー化したい」 というのが今回の一番の目的かもしれないw  以下の方法だとホットキーにできないんですよね。




Maya に元からある標準の方法だと、アニメーションカーブを選択した状態で、右クリック > Insert Key がありますよね。

Insertkey2

これでも全然いいんだけど、挿入したキーを選択してくれないんだよなあ。 それと、やはり右クリックはちょっとつらい。 マウスならいいけど、俺は大抵ペンタブ使うから。 それと、この右クリックからの操作は、ホットキーが割り当てられないと思うんだよな。 違います?



あと、Insert Key Tool というのもありますね。 グラフエディタの Keys メニューからアクティブにしてもいいけど、i キーを押しっぱなしにして中ボタンでドラッグしても同じですね。 i キーを押している間だけ Insert Key Tool がアクティブになる感じでしょうかね。 挿入するフレームを表す黄色い線が出て来ますね。 

Insertkey3

そしてこのやり方だと、作成したキーを選択してくれる! なかなか良いのですが、中ボタンなんですよねー ペンタブだと、中ボタンドラッグとかほんとにつらいのよ。 そこが惜しいんだよなあ。 それに、ドラッグ操作が必要で、ホットキー1発でキー挿入というオペレーションにはならないからなあ。



あと、Add Key Tool ってのもありますね。

Insertkey4

このツールも中ボタンか・・・・・

しかもこのツールは、XSI の Edit Key Tool だっけ、 shift + E のやつね、あれと違って既存のキーを動かすことは出来ないんですね。 XSI のやつは、左クリックなら既存のキーを移動できるじゃないですか。そして中ボタンではキーの挿入。 Maya のこのツールは、挿入以外の操作はできません。 うーむ、いかんな・・・・・ XSI のアレを移植してくれませんか嘔吐デスク様。 XSI を抹殺したんだからそれくらいやって下さいよ嘔吐デスク様。 

ついでに左ボタンでも挿入できるようにオプションを付けてくれないかなあ。 まあ、XSI のように左クリックが既存のキーの移動になるなら、挿入は中ボタンのままでいいけどね。




これ以外に、グラフエディタ上でのキーフレームの挿入って、方法ありますでしょうかね?





ともかく、上記の方法でちょっとしっくり来てなかったので、四苦八苦して mel 書きますた(いつものように、空調屋さんに助けて頂いてます。空調屋さんのサポート無しには生きて行けません)。 こんだけの mel で四苦八苦どころか十六苦三十二苦くらいですよ俺は。 慣れないなあこの mel の書き方というか考え方が・・・・。 

だって、 setKeyframe コマンドの戻り値は、セットされたキーフレームの だそうですよ。 数かよ。 セットされたキーフレームをオブジェクトとして、そのコレクションとして返してくれよなあ。 オブジェクトとしてキーが取得できていれば、最後に選択するのも簡単だし、他にも色んなことができると思うわけですよ。 

それと比べてこのスクリプトでは、新規キーを選択するために、キーの生成に使った setKeyFrame コマンドとは全く関係なく、「このアニメーションカーブの現在フレームのキーフレームを選択しろ」 というコマンドを書いています。 生成されたキーかどうかは関係ないんですね。 こんな風に、「続く何かをやろうと思ったら、前の結果や戻り値とは無関連の方向からまた取得し直す」 みたいな、この一方通行感がね、なんだかね。 

Maya人には、結果が同じだからそれでいいジャマイカと言われます。 オブジェクトモデルでスクリプトを書いた経験の無い方には、オブジェクトとしてブツが取得できて、そのメソッドやプロパティでいじっていく感じを伝えても、「それのどこが便利なの? mel の方式で何でもできるんだから、何も不自由ないじゃない?」 と言われてしまいます。 そうですか。そうですよね。 でもなあ、ひとつ端緒をつかめばそこから芋づるでオブジェクトを次々に取得できて、前の結果を活かして次の操作をするって、とてもロジカルだし便利だと思うんだけどなあ。コードの再利用性も高くなってると思うんだな。


って、プログラマでも何でもない俺が知った風なことを言うと、本職の人からすんげえツッコミが来そうなのでやめておこうw



ま、ホットキーも登録したし、これで思う存分挿入できるね
すっこんぱっこん入れるぞー






.

| | コメント (0) | トラックバック (0)

2015年5月30日 (土)

ちょっと待ってから実行。

先日書いた起動時にスクリプトを実行する云々の記事 なんですがね起動時にスクリプトが上手く実行されてませんでした。すいません


Maya を起動し直しても、Infinity がオフになったままなんですね。あれえ? ちゃんと効いてないじゃない? ダメねえ Maya さま。 

と思ってスクリプトエディタのログを見てみると、お前がコマンドの中で指定してるグラフエディタとかいうオブジェクトなんてねえんだよこのヴォゲ!  とかいうエラーが出てました。




どうやら、スクリプトが走った時点で Maya の UI がまだロードされておらず、グラフエディタと言われてもそんなもの無いから困る、ということみたい。


ってことで困ったときの空調屋さん。いつもお世話になります。


evalDeferred 
ってコマンドを使えばいいんですって。

http://download.autodesk.com/global/docs/maya2014/en_us/Commands/evalDeferred.html

なるほど、実行を延期するコマンドなんですね。

今回の場合、

evalDeferred "animCurveEditor -edit -displayInfinities true graphEditor1GraphEd";

このように書くと、animCurveEditor コマンドの実行を、Maya が起動し終わってアイドル状態になるまで待ってくれるようです。



ってことでこれで上手く行きました。わーい



よし、ついでに Infinity だけじゃなくてバッファカーブの表示オンも書いちゃおうぜ

evalDeferred "animCurveEditor -edit -showBufferCurves true graphEditor1GraphEd";

userSetup.mel にこの1行を追加ね。 これでいつでもバッファカーブを見れる状態がデフォルトになる。 良いじゃないですか。 ピシピシ調教してやるぜ Maya 様。






っていうかそもそもなんで起動するたびに設定忘れちゃうんですか Maya 様あなたやはり Baka 様ですか Maya 様


追記:
また不具合ありました。

解消方法 ↓ 
起動時にスクリプトを実行して下さい。の改良。scriptJobで行こう。

.

| | コメント (0) | トラックバック (0)

2015年5月28日 (木)

起動時にスクリプトを実行して下さい。っていうか設定記憶して下さいMaya様。

メモメモ 忘れちゃうからメモ



Maya 起動時に自動的にスクリプトを実行して欲しい。どうしたらいいんですか。 こうするんですって。



C:\Users\ユーザー名\Documents\maya\バージョン\scripts


というフォルダに


userSetup.mel


という名前の mel ファイルを作り、その中に実行して欲しいスクリプトを mel で書けば良い。 だそうです。




↓ここに書いてあった

http://monawiki.wiki.fc2.com/wiki/起動時にスクリプトを実行


http://me.autodesk.jp/wam/maya/docs/Maya2009/index.html?url=PC_Run_MEL_commands_whenever_Maya_starts_up.htm,topicNumber=d0e79112




ってことで、俺はまずこの1行を仕込みましたよ。


animCurveEditor -edit -displayInfinities true graphEditor1GraphEd;


グラフエディタの Infinity をオンにする1行です。
そんだけ。

Grapheditorinfinity

なんでこの設定覚えておいてくれないんですか Maya 様。 起動するたびにオフにリセットされちゃってるじゃないですか Maya 様。 おかげで起動時にスクリプト走らせる方法とか調べものが増えるじゃないですか Maya 様。 設定ひとつ覚えてられない貴方はもしかして Maya 様ではなくて Baka 様なのではないですか Maya 様。


追記:
2015 からは、この Infinity のオンオフはシーンと共に保存されるようになったそうです。 この記事で使っている Maya 様は 2014 です。



スクリプトはこれで合ってるかな・・・? スクリプトエディタで Echo All Commands をオンにして、実際にグラフエディタ上で Infinity オンの操作をし、ログされた1行をコピペしたものです。 最後の graphEditor1GraphEd の部分は、対象になるグラフエディタを指定していると思われるので、ここが常にこの書きかたでOKなのかが不明ですね。



追記:

スクリプトが上手く実行されてませんでした。
対処方法 → 
http://junkithejunkie.cocolog-nifty.com/blog/2015/05/post-f602.html




.

| | コメント (0) | トラックバック (0)

2014年6月12日 (木)

何個?。

Maya 様で、現在選択しているオブジェクトの数をパッと調べる方法、ありませんかね?


やっぱ、Heads Up Display ってことになりますか?

Count1

この Object Details ってのをオンにすると、どうやら選択している数が表示されるように見えますね。


もちろんこれでいいのですが、ただ、余計な情報もいっぱい表示されてて、邪魔なんですよねー。 しかもこの Heads Up Display って、文字がすんげえ読みにくくない?  なんかこう、字が小さくて、ボールド体みたいになってて、読めないんですよ。 表示に使うフォントとか変えられないのかね?


XSI だと、右上に常に出ているんですよね。

Count2

これはビューポートに干渉しないから、見づらくなったりはしない。 Maya でもこういう感じでどっかにひっそりと表示されてればいいのになーって思いました。




っていうかさ、Maya様って全体的に、ほんと、目的のオブジェクトを正確に選ぶのがすげえ難しいと思うんですよ。 例えばキャラクタアニメーションやってて、手足のコントローラをつかもうとすると、必ず間違えて違うコントローラをつかんでしまう、とか。 髪の毛など多関節の揺れ物のコントローラを複数つかんで回転のキーを打ったら、実は頭部の裏にある変なものも選択していて要らん物に回転のキーを打ってしまった、とか。


だから、選択しているオブジェクトの数がパッと見れるだけでも、現在の選択状態が正しそうかどうかくらいは、なんとなく分かるので助かるんですよね。 あれっ 4つ選んでるぞ、 この髪の毛の房はコントローラ3つのはずだから、何か余計なもの選んでるな? とか。


そもそも Maya の選択がし易ければ、つまり Mayaでセレクトのミスが少なければ、現在選んでいるオブジェクトの数なんて知りたいとも思わないかもしれないですね。 選択でいつもストレスがあるから、選んでいるブツの数なんていう間接的な手段で情報を得ようとしちまうんだな、きっと。





まあともかく、そんな気分でどうでもいいスクリプトを書きました。

(mel)
-------------------------------------------------------
// 何個?  選択中のオブジェクトの数を数えるだけ。(一応、リストアップもするけど)

nanco();
global proc nanco(){
    string $oSels[] = `ls -sl`;
    string $Display1 = "";
    string $Display2 = "";
    $count = size( $oSels );
    
    for ( $i=0; $i<$count; $i++ )
    {
        $Display1 += $oSels[$i];
        if ( $i != $count-1 )
        {
            $Display1 += ", ";    
        }      
    }

    if ( $count == 1 )
    {
        $Display2 = "  [ " + $Display1 + " ]";
    }
    else if (  $count != 0 )
    {
        $Display2 = "  [ MULTI ]";
    }
    print ( "[ " + $Display1 + " ]\n" );
    print ( "何個? : " + $count + $Display2 + "\n" ); 
}

-------------------------------------------------------

Nanco.mel


実行すると、現在選択しているオブジェクトの数をログします。 そんだけ。 一応、スクリプトエディタ内にオブジェクト名のリストアップもしてます。

Count3

いやーほんと、どうでもいいスクリプトですねw


しかも、無駄の多い、シロート丸出しのコードなんじゃないでしょうか。まあいいや。 何個か知りたいんですよ俺は。





選択しづらいと言えば、グラフエディタの中もそうなんだよなあ・・・・ 目的のキーとか、接線ハンドルとか。  ががっとドラッグすると、いつも余計なものが含まれてしまう。 だから Ctrl とか Shift とかを使って、ひとつひとつ、慎重に選択に追加していく感じになる。 モーション作業中は、これで気持ちが殺がれてしまうんですよ。  何がいけないんだろう? なぜこんなに選択しづらいのか、選択する時に Maya 様はどう振舞おうとしているのか、知りたいですね。 どういう挙動をするから俺は気に入らないのか、を分析したいのです。それさえ見えてくれば、良くない状態を上手く避けられるクセが付けられると思うんだけど、なかなか見えて来ないんだ。 Maya さま。



マニピュレータの軸も選択というか、ドラッグしづらいですよねえ。 例えばローテーション用の丸いマニピュレータ、X だけを回転させたくて赤い部分をドラッグするわけですが、クリックする位置がちょっとズレているのか、XYZ 全部回っちゃったり、あるいは選択が外れちゃったり、そういうのしょっちゅうあります。 キーーーっとなります。 なぜこうもやりづらいのか、クリックする位置なのか、リリースするタイミングなのか、などなどこれも法則が見えてくればいいんだけど、見えてこないなあ。









Maya は、普通のモーション仕事ならまあ問題なくできるくらいにはなりましたが、だからと言って鼻歌歌いながらスイスイやってるわけじゃないです。 キーーーーっとなりながら、胃を痛めながら、モニタをぶん投げながら、苦しんでやってます。 生命の危険すら感じます。




追記:
コメント欄で、中島さんがステキな MEL を書いてくれました。選択中のオブジェクトの数を表示するカスタム Heads Up Display です。 中島さん、感謝します(゚∀゚)

.

| | コメント (11) | トラックバック (0)

2014年6月11日 (水)

SAC for Maya様。

SAC 必要なんです。俺には。 アニメーションを他のオブジェクトに複製するツールです。

XSI 版は、やはり古いな・・・・ 2007年らしい。
http://junkithejunkie.cocolog-nifty.com/blog/2007/11/sac_b2b3.html



(mel)
-------------------------------------------------

//    SAC
//    最初に選んでいるオブジェクトのアニメーションを、2個目以降に選んでいるオブジェクトにコピーする
string $sels[] = `ls -sl`;
copyKey -time ":" -hierarchy none -controlPoints 0 -shape 1 $sels[0];
pasteKey -option replaceCompletely;
-------------------------------------------------

SACforMaya.mel




アニメーションのあるオブジェクトをひとつ選びます。 次にアニメーションをコピーしたい行き先のオブジェクトをいくつでも選びます。 その状態でスクリプトを実行すると、最初のオブジェクトのアニメーションが、2つ目以降のオブジェクトにコピーされます。 そんだけです。


いやほんと、だからどうだというアレではありません。 XSI でずっと使ってきた SAC と同じ感覚でアニメーションをコピーしたかったというだけです。 標準のアニメーションコピペが面倒だなーとか、ペーストのオプションで replace とか merge とか気にするのかったるいなーとか感じたので、SAC っぽい感じにしようとしただけなんです。 全然大したものではありません。





コピー元のオブジェクトでアニメーションされていないチャネルは、コピー先では何もいじらないようですね。 

例えば、位置のキーはあるけれど回転のキーが無いオブジェクトAをコピー元にしたとします。 一方、コピー先であるBには位置のキーも回転のキーもあります。 

この状態で実行すると、Aの持つ位置のアニメーションは、Bの位置のアニメーションを上書きします。 Bがもともと持っていた位置アニメーションは跡形も無く消え、Aと同じアニメーションになるということです。 一方、Aは回転アニメーションを持っていないため、Bがもともと持っている回転アニメーションをいじりません。 Aに合わせて回転アニメーションを消し去ったりはしないということです。 結果Bは、自分がもともと持っていた回転アニメーションはそのまま残り、位置アニメーションのみAに合わせて上書きされます。







スクリプティング的には、よく分からないまま人に聞きながら書いちゃったんですが、一応ちゃんと動いているように見えるなあ。 落とし穴あるかなあ。 何か気づくことあれば、どうかご指摘下さい。


copyKey コマンドでは、 -controlPoints 0 -shape 1 あたりがよく意味分からんのだよな。  それ以外は、 タイムレンジの指定が数値ではしていなくて ":" (コロン)のみなのでこれは全部のキーを表し、階層の下位のオブジェクトは無視して今選ばれているオブジェクトのみを対象にする。 そしてコピーするアニメーションは選択しているブツのうちゼロ番目(つまり最初の1個)から取ってくると書かれていますよね。 そういうつもりで書きました。

pasteKey コマンドでは、-option replaceCompletely ってのが、元のアニメーションをまるっきり置き換えてしまうというオプションですね。 ただし前述のごとく、コピー元のオブジェクトでキーが無いチャネルは、無視するようですね。  そしてこの書き方だと、コピー元のオブジェクト自身にもペーストしちゃってますね。 まあ問題ないですよね。




とかなんとか。




まだまだ恥ずかしいくらいの初心者ですよ、ええ。 必死で自分のブログにメモですよ。


でも mel は初心者レベルでスルーしてしまいたい気分だなあ・・・。python に走った方が良さそうに見えるんだよなあ。




XSI村で話しでいだ JScript なまりは、ここでは通用しねのがな・・・・ mel はなんだが変だすけやりっとねんだげどな・・・










.

| | コメント (0) | トラックバック (0)

より以前の記事一覧