BACKBONE RIG&TA EXPERTS

matrixその②~matrix接続方法~

2018/06/25

BACKBONEの福本です。
matrix続きです。
まだまだ続きます。

matrixその①~事例紹介~


matrixには、matrix、inverseMatrix、parentMatrix、parentInverseMatrix、worldMatrix、worldInverseMatrixなどがあります。
それぞれのmatrixを見て行きましょう。
※心が折れそうな方は『matrix接続方法』まで飛ばして下さい。

例えば、下図の階層の場合、

◆localMatrix
Joint自身のmatrixです。

 

parentMatrix
parentとは日本語で「親」。
すなわち、Joint の 親(E)までの階層(A~E)のmatrixを掛けた値です。
matrixを掛け算する際は、上の階層へ順番に上がって「matrix」を掛けていきます。
この場合の掛け算の順番は 「E.matrix」×「D.matrix」×「C.matrix」×「B.matrix」×「A.matrix」 となります。

 

worldMatrix
Jointまでの階層(A~EとJoint自身)のmatrixを掛けた値です。
matrixを掛け算する際は、上の階層へ順番に上がって「matrix」を掛けていきます。
この場合の掛け算の順番は 「Joint.matrix」×「E.matrix」×「D.matrix」×「C.matrix」×「B.matrix」×「A.matrix」  となります。
すなわち「Joint.matrix」×「joint.parentMatrix」と同じです。

 

InverseMatrixは上記の逆です。

◆『localInverseMatrix』
Joint自身のinverseMatrix(逆Matrix)です。

 

◆『parentInverseMatrix』
Joint の 親(E)までの階層(A~E)のinverseMatrix
(逆Matrix)を掛けた値です
inverseMatrixを掛け算する際は、上の階層から順番に下がって「inverseMatrix」を掛けていきます。
この場合の掛け算の順番は「A.inverseMatrix」×「B.inverseMatrix」×「C.inverseMatrix」×「D.inverseMatrix」×「E.inverseMatrix」 となります。

 

◆『worldInverseMatrix』
Joint の 親(E)までの階層(A~E)とJoint自身のinverseMatrix(逆Matrix)を掛けた値です。
inverseMatrixを掛け算する際は、上の階層から順番に下がって「inverseMatrix」を掛けていきます。
この場合の掛け算の順番は「A.inverseMatrix」×「B.inverseMatrix」×「C.inverseMatrix」×「D.inverseMatrix」×「E.inverseMatrix」 × 「Joint.inverseMatrix」となります。
すなわち「Joint.parentInverseMatrix」×「joint.InverseMatrix」と同じです。
 

Mayaでmatrixの演算を行うにはmultMatrixノード を使用します。
演算した結果は、decomposeMatrixノードを介してTranslateやRotateの値に分解して出力します。
Multiplyは日本語の意味で『掛ける』、decomposeは『分解する』です。

 


さて、実際にセミナーで使用したデータでmatrixを接続してみましょう。
と、その前に。
先ずはmatrixの使い方をご紹介します。
色んな試行錯誤を経て、この手法に辿り着きました。
少し泥臭い手法ですが、下記の通りに行えば、どんな状況下であれ簡単にmatrixを繋ぐことができます。

matrix接続方法

①『制御される側』のノードを複製します。
②『制御する側』のノードに①をペアレント化します。
③ multMatrixノードを作成します。
④  ②でペアレント化したノードのmatrixの値を取得して、multMatrixのmatrixIn[0]にsetAttrを行います。
※値に変化が無い場合は不要です。
⑤『制御される側』と『制御する側』の共通の親を探します。
⑥『制御する側』から共通の親までの各ノードのmatrxをmultMatrixのmatrixIn[◎]に順番に繋げていきます。
⑦  共通の親まで辿ると、共通の親は飛ばします。
⑧  次は『制御される側』の親ノードまで、各ノードのinverseMatrxをmultMatrixのmatrixIn[◎] に順番に繋げていきます。
⑨  decomposeMatrixを作成します。
⑩  multMatrixのmatrixSumとdecomposeMatrixのinputMatrixを繋げます。
⑪  decomposeMatrixのoutputRotate、outputScale、outputShearを制御される側のノードのrotate、scale、shearに繋げます。
※ブランチで繋いで下さい。
※translateは別処理を行います。後ほどご紹介します。
⑫  完成。

『制御する側(ctrlA)』と『制御される側(cubeA)』が同じ軸、位置の場合~

[構成要素]
・コントローラ(ctrlA)とジオメトリ(cubeA)がsameAxisという共通の親ノードに格納されている。
・コントローラ(ctrlA)とジオメトリ(cubeA)が同じ軸、位置である。
・コントローラの親ノード(ctrlA_space)はコントローラ(ctrlA)と同じ軸、位置である。
・ジオメトリの親ノード(cubeA_space)はジオメトリ(cubeA)と同じ軸、位置である。
・青:Z軸、赤:X軸、緑:Y軸
①上記の「matrix接続方法」を用いて、ctrlAでcubeAを制御します。
NodeEditorでmultMatrixノードを作成します。

 

制御される側のノードを複製します。
この場合、制御されるのはcubeAなので、cubeAを複製します。

 

③複製したcubeAを、制御する側のノード、この場合ctrlAにペアレント化します。

 

④複製したcubeA1のアトリビュートを確認すると、制御する側であるctrlAと同じ軸であるため、値に変化がありません。
従い、multMatrixへのsetAttrは不要です。

 

⑤次に、ctrlAとcubeAの共通の親を探しましょう。
どちらとも、sameAxisの階層内に格納されているので、共通の親はsameAxisとなります。
ctrlAからsameAxisまでの各ノードのmatrxをmultMatrixのmatrixIn[◎]に順番に繋げていきます。
まず、ctrlAのmatrixをmultMatrixのmatrixIn[0
]に繋げます。

 

⑥次に、ctrlAの親のctrlA_spaceのmatrixをmultMatrixのmatrixIn[1]に繋げます。

 

(補足)ctrlA_spaceを制御する必要がない場合は、ctrlA_spaceのmatrixを繋げる必要はありません。
その場合、ctrlA_spaceのmatrix情報を取得してmatrixIn[1]にsetAttrを行います。
コネクションを外すとmatrixIn[1]に登録されたctrlA_spaceのmatrix情報が消えてしまうため、必ずsetAttrが必要となります。

 

⑦共通の親は飛ばしてよいので、次はcubeAまで下がっていきます。
下がる場合は、inverseMatrixを繋げます。
cubeA_spaceのinverseMatrixをmultMatrixのmatrixIn[2]に繋げます。

 

⑧後はこれらの結果をcubeAに繋げるだけです。
NodeEditorでdecomposeMatrixノードを作成します。
※MatrixNodesプラグインをロードしていないと作成されません。
multMatrixのmatrixSumをdecomposeMatrixのinputMatrixに繋げます。

 

⑨decomposeMatrixのoutputRotate、outputScale、outputShearをcubeAのrotate、scale、shearに繋げます。


⑩ctrlAのtranslateとcubeAのtranslateを直接繋げます。
※今回のケースでは、decomposeMatrixのoutputTranslateとcubeAのtranslateを繋いでも構いません。同じ結果となります。
translateだけ別処理にする理由は後ほど。

 

⑪完成です。
sameAxisノード階層内でのローカルmatrixを使用したコンストレインの出来上がりです!

 

制御する側、される側の軸が違う場合も上記の方法で対応できます。
つづく。

 

※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。