2012/07/27

Matrixで遊んでみる!

Mayaには以前から行列関係のノードは備わっていたんですが、2013からは新たに整理された様子です。
matrixNodesというプラグインが用意され、これをロードすることで4つのMatrix系ノードが追加されます。
NodeEditorで見てみると、併せてMatrixと名のつくノードは11種類あるようでした。


Matrixが何なのかという部分については、
あまり考えないで、どちらかというと感じたほうがよいと言われています。
じゃないと丸刈りの漢に蹴飛ばされるそうです。
Don't think you are... Know you are.

…今回はこれらMatrix系ノードについてゆるゆると書いてみたいと思います。




addMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/addMatrix.html
行列のリストを渡すと一つに足しあわせてくれるようです。



composeMatrix
トランスレートやローテートなどの値を入力すると、行列の形で返してくれます。
decomposeMatrixはその逆で、行列の値を入力するとxformチャンネルちっくなので返してくれます。




fourByFourMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/fourByFourMatrix.html
16コの数値(具体的にはfloat)を与えると、そのまま行列にして返してくれます。



holdMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/holdMatrix.html
なんかキャッシュをとってくれるんですか?よくわかりまてん



inverseMatrix
行列を入力すると、逆行列を返してくれます。
4*4行列の逆行列なんて人力で挑むのはなかなかアレなので素敵ですね。
http://www.ee.t-kougei.ac.jp/tuushin/lecture/math1/matrix/node29.html
http://www.cg.info.hiroshima-cu.ac.jp/~miyazaki/knowledge/tech23.html



multMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/multMatrix.html
行列のリストを渡すと掛けあわせてくれるようです。
addMatrixの知り合いですね。



passMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/passMatrix.html
これよくわかってないんですが…
「キャッシングせずに、一定の値で行列を乗算する」ノードです。えへ。



pointMatrixMult
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/pointMatrixMult.html
入力したマトリクスとXYZ値を掛けあわせて、XYZ値を返してくれます。


transpooseMatrix
転置行列を返してくれます。
http://ja.wikipedia.org/wiki/%E8%BB%A2%E7%BD%AE%E8%A1%8C%E5%88%97


wtAddMatrix
http://download.autodesk.com/global/docs/maya2013/ja_jp/Nodes/wtAddMatrix.html
ウェイトをかけられた行列のリストを足しあわせてくれるようです。
addMatrixの知り合いでしょうか。



では最後にちょっと、
マトリクスをどう使うかという簡単な例を紹介したいと思います。

シーンにcubeを作ります。
そしてなにかの子階層に移動します。ここではてっとりばやくグループ化します。

NodeEditorを開いて、tabキー>decと打ちます。たぶんこのへんで候補が「decomposeMatrix」だけになると思います。
decomposeMatrixノードを作成します。

pCube1ノードにaddAttributeで以下のアトリビュートを追加します。
  • WST
(WorldSpaceTranslateの略です)
DateTypeはvectorを指定してください。

それではノードをつないでいきます。
まずpCube1の World Matrix を decomposeMatrix の InputMatrix につなぎます。
見えない場合は InputSelectionウィンドウで以下のような設定にしてみてください。


input / outputが見えない場合は設定をこのように
つぎに、decomposeMatrix1ノードの OutoputTranslate を、pCube1の WST につなぎます。

作業はこれで終了です。確認してみましょう。
アトリビュートエディタを開いて、pCube1を移動してみます。

WSTをみると、Translateと連動して動くと思います。ここでは値も同じはずです。
では、
pCube1の上位階層のノードを動かしてみてください。

pCube1のTranslate値は動きませんが、WSTの値は動くのが確認できます。
上位階層を動かしても、ローカル空間に入ってしまっているpCubeは、Translate値的には動きません。がワールド上では実際動いています。
WSTに入っている値は、常にワールド座標系でのトランスレートの値になっているはずです。
(試しにロケータを作ってペアレントコンストレインなどすれば確認できます)


結果としてコンストレインを使えば同様のことができると言えそうですが、
ノードグラフを見るとコネクションの量は一目瞭然。Riggingで大量にコントローラをつけた時の
計算の速さ=操作感の軽さに差が出てきます。
ここではWSTということでTranslateしか作りませんでしたが、回転やスケールも一手間で追加できます。


このように、decomposeMatrixノードを使うと、
ローカル座標系から空間座標系など座標系の変換を行うことができますよ、というサンプルでした。
Matrix系ノードを使うとほかにも面白いことができるようなので、気になる人はぜひ遊んでみてください。

【20170909追記】
Maya2017以降とかではParentコンストレインも十分高速らしく、Matrixノード使えばいいというわけでもないそうです。



■参考リンク





ノードリファレンス @maya2013オンラインヘルプ
※各ノードのページは英語です。


Maya Matrix覚書 @ヲドリテヒヅル


行列 @maya2013オンラインヘルプ

xformコマンド @maya2013オンラインヘルプ

2 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. コメントありがとうございます!お返事遅れてすいません……
    画像は隙を見つけて差し替え直したいと思います。

    返信削除