« 涙のMayaさまペアレント。 | トップページ | ダブルクォーテーションの中にダブルクォーテーション。 »

2017年7月 3日 (月)

選択中のオブジェクトからコンストレインを取得。したい。

ちょっとしたスクリプト書くにも、もうヒーヒー言ってますよ。いまだに。
調べても、これぞ!ってのがすぐ見つからないんだよなあ。




コンストレイン関係のスクリプト、XSI 時代にもさんざん書いたので、自分の仕事を楽にするためにちょっとしたものを色々書きたいんです。



まずは最も基本、 「このオブジェクト、コンストレインされていたら、そのコンストレインを取得せよ」 ってのをやりたいんですが、 こんなんでいいのでしょうか?



Python:
---------------------------------------
import maya.cmds as mc
sel = mc.ls(sl=1)
for obj in sel:
    constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )
    if constraints == None: print( obj + " -- no fuckin' constraints on this.")
    else:
        for cns in constraints:
            print( cns  + " -- cns type : " + mc.nodeType(cns) )
---------------------------------------

ほとんど根拠ないです。 ひと様のスクリプトを見たり、今まで教えてもらったりしたことを元に、こう書いてみたら、一応ちゃんと動いているように見えるというだけです。 オブジェクトを選んで実行すると、そのオブジェクトが誰かにコンストレインされていた場合、そのコンストレインおよびコンストレインの種類を表示するというものです。



これで合ってますか?
詳しいお方、是非突っ込みを入れてくれませんか?
コンスト取得したいなら、それじゃおかしいよ、とか。
こうやった方がいいよ、とか。






constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )

↑ ここが特によく分かってません。

xxx.parentInverseMatrix[0] ってのが、ほんと、コピペしただけで全然意味がわかってない。コンストレインの取得にはこういう風に書くんだとかって、どっかマニュアルとか誰かのブログに書いてありませんでしょうか? [0] はなんで 0 番目なんでしょうか。 1 じゃいけないんですか。

根拠ないコピペじゃ、ここから発展させてツールを書くのが非常に厳しいですからね。 ちゃんと理解したいなあ・・・・。






試しに、意味がわかってない parentInverseMatrix[0] を取っ払って

constraints = mc.listConnections( obj, type="constraint" )


このように書いてみたんですけどね。このオブジェクトの、コネクションをチェックしろ。コンストだけな。 って感じでパッと見は合ってそうに見えてしまう俺はどシロート。


で、ポイントコンストレインを1個だけ持っている(コンストされている)オブジェクトを選んで実行した結果がこれです。 ↓

Cns

なんで6個・・・・?

1個のポイントコンストレインを持つオブジェクトなんですが、listConnection コマンドの結果は6個も返ってきています。しかも名前は全部同じ。 意味がわかりません。


最初のスクリプトなら、ちゃんと1個だけのコンストレインが返ってきます。 ためしに同じオブジェクトに、例えばペアレントコンストレインも与えると、ポイントコンスト1個、ペアレントコンスト1個の合計2個がちゃんと返ってきます。 


だから、意味不明の parentInverseMatrix[0] がなにやらいい仕事をしてくれているようですが、意味が分かってないゆえに、ある場合ではエラーになっちゃったり、そしてその原因を突き止められなかったりしそうです。 だから意味を知りたい。



こういうの、どっかに説明書かれてませんか?
Maya でバリバリいろんなツールを書いているお方、どこでどうやって調べたのですか? 
教えて下さい m(_ _)m











大昔、XSI でスクリプトを書き始めた時も、大いに苦労したんだよなあ。日本語の情報はまずないので、海外のユーザフォーラムに入り浸って、がんばって英語で質問書いたりしてたんだよなあ。  今もそれをやればいいのか?  AREA のフォーラムとかで質問すれば、丁寧に教えてくれる人もいるかな?


この数年で、数回はそんなことしたこともありますが、あんまり丁寧には教えてもらえなかったなあ。 「そんなのスクリプトでやる必要ない。メニューのここを選べば一瞬でできる」 とかね。 いや、そういう問題じゃないから!  ミス防止のための自動化ツールとか大量処理のツールを作りたいんだから、GUI から操作する方法を知りたいわけじゃないの! みたいなこともよくあったw  「MEL 書けば簡単にできるよ」 くらいの話で終わったり。 簡単なら書き方教えてよw  っていうか書いてよw

大昔の XSI ユーザフォーラムは、すんげえ助け合い精神があったので多くの人が教えてくれたり助けてくれたりしたものですが、この数年 Maya でそれをやろうとしても、あんまり反応良くなくてくじけそうになりますねw  また頑張ってトライしてみるか・・・・英語読んだり書いたり、すんげえ時間かかるんだよなあ。







.

|

« 涙のMayaさまペアレント。 | トップページ | ダブルクォーテーションの中にダブルクォーテーション。 »

コメント

こんばんは。
node editorでコンストレイントされたnodeを選択してpointConstraint nodeとコネクションされているアトリビュートを見てみると、

Translate x
Translate y
Translate z
ParentInverseMatrix[0]
RotatePivot
RotatePivotTranslate

の計6つがコネクトされているかと思います。
シンプルな方の記述文だと、pointConstraint nodeとコネクトされているアトリビュートがあればその数のぶんだけ返すようになってるので、
6つ分返ってくるのだと思います。

ParentInverseMatrix[0]で探索するように記述した文では、コンストレイントされているか知りたいnodeのParentInverseMatrix[0]がpointConstrain nodeとコネクトされているかどうかを
調べているだけなので、一個だけ返ってくるのだと思います。
[0]っていうのは単にインデックスです。

ちなみに、ParentInverseMatrixというのは日本語だと親の逆行列という意味です。
maya内部では、コンストレイントするときにこの行列同士をかけ合わせて計算してます。
pointConstraintの場合、子のParentMatrixと親のParentInverseMatrix同士を掛け合わせて計算しているためこのようなアトリビュートが存在してます。
。。。私も詳しいことはこれくらまでしかわかりません。。申し訳ないです

投稿: | 2017年8月 8日 (火) 03時46分

すみません、打ち間違えが、、
>子のParentMatrixと親のParentInverseMatrix
これ逆でした。。
補足ですが、ParentMatrixていうのは親のローカル空間内(親の位置を原点とした空間)での移動,回転,スケール,移動値のベクトルの値を4*4の行列で表現したものです。
ParentInverseMatrixはその逆行列です(反転した値)

DFさんのブログに詳しく載っています!
https://dftalk.jp/?p=8779

投稿: | 2017年8月 8日 (火) 17時30分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 選択中のオブジェクトからコンストレインを取得。したい。:

« 涙のMayaさまペアレント。 | トップページ | ダブルクォーテーションの中にダブルクォーテーション。 »