Step 04:Matrixのかけ算には順序がある
ここで、Matrixの計算で注意すべき点として「計算の順序がある」ということです。
例えば......
1.0 + 2.0 = 3.0
2.0 × 3.0 = 6.0
4.0 ÷ 5.0 = 0.8
上記の計算は計算順序を変えても結果は変わりませんが、
AさんのMatrixを計算した際に使用した上記の図では、Matrixの計算順序が変わると、結果は大きく異なってしまうため、必ず「子→親」の方向にかけ算をしていかねばなりません。
同様に、逆に親空間を打ち消す場合は「親→子」の方向にかけ算しなくてはなりません。 なれないと混乱するかもしれません。 しかし少し考えてみると当然なんですよね。なぜなら、Outlinerでの親子付け操作をイメージしてみてください。
親子付けの順番を変えてしまうと結果は大きく異なりますね。 理屈はこれとまったく同じです。
「Matrixの計算順序に決まりがある」と言われてしまうと、小難しい印象が先だってなかなか覚えられそうにないかもしれませんが、「Outliner上の操作と同じ」と考えるとどうでしょう。単純にOutliner上でのノード操作による親子関係の操作オペレーションだったら、そこまで間違うことはないのではないでしょうか。
要は「物の見方・捉え方」なんですね。
Step 05:でも本当に? 実験してみよう
ここまで理屈を説明してきましたが、本当にそうなんですかね? 百聞は一見にしかず、実際にMayaで試してみましょう。
1:Matrixのかけ算でペアレント挙動
まず「Matrixのかけ算」で仮想的に階層構造に入れていく、すなわち「ペアレント挙動」を実際にやってみましょう。
まず、原点位置にロケータ [localor1] を置き、少し離したところにもう1つロケータ [localor2] を配置します。少し離したところのロケータを原点位置のロケータの子階層に入れたような挙動を実現してみたいと思います。
NodeEditorを出し、まず「multMatrix」ノードを作成します。
[locator2]のMatrixアトリビュートをmultMatrixノードの [Matrix In[0]] に接続し、[locator1]のMatrixを [Matrix In[1]] に接続します。ここで、ちょっと小技を使います。
アトリビュートを接続したmultMatrixノードをいったん複製し、古い方は削除します。
こうすることで、今接続したMatrixの値を [Matrix In[0]] に残した状態で接続を解除することができます。通常では「setAttr」コマンドなどを使って、スクリプトから値を設定しないとオフセットの値として設定できないのですが、このオペレーションだと少しだけ楽ができます。(;^_^A
※Maya 2022までで同様の操作が可能であることは確認済み
ここで残したMatrixの値は、[locator2]が保持しているオフセット値として残したいので、このようにノードに情報を残しました。
改めて [locator1] のMatrixを [Matrix In[1]] に接続し、[locator2] のOffset Matrixと [locator1] のMatrixのかけ算を計算させるようにします。
次に「decomposeMatrix」ノードを作成して、multMatrixノードの計算結果と接続させます。decomposeMatrixノードはMatrixから「移動」、「回転」、「スケール」、「シア」成分などを分解し、抽出するためのノードです。
decomposeMatrixノードから [locator2] に対して、「移動」、「回転」、「スケール」、「シア」の成分を接続させます。そして [locator1] を動かすと......
このようにペアレント挙動が実現します。
2:Inverse Matrixのかけ算で階層解除
今度は「階層挙動の打ち消し」を行なってみましょう。
同様にロケータを2つ生成しますが、今度は [locator2] を [locator1] の子階層に入れてみます。
この状態だと(同然のことながら)[locator1] を動かすと、つられて[locator2]は移動・回転します。
ここで、先ほどと同様にNodeEditorから「multMatrix」ノードを作成します。
今度は、Matrixではなく「worldMatrix」のアトリビュートをmultMatrixノードに接続します。worldMatrixアトリビュートはその名の通り、そのノードのグローバルMatrixを返します(内部的には最上位階層までさかのぼって、順に自身のMatrixをかけていった結果を返しています)。
先ほどと同様にオフセットとしてMatrixを残し、今度は [locator1] のMatrixではなく「inverseMatrix」を接続して......
decomposeMatrixと接続して、「移動」、「回転」、「スケール」、「シア」を[locator2]に接続します。
[locator1] を動かすと......
動かない! ハラショー!
3:計算順序を変えてみると......?
では、実際に計算順序を変えてみるとどうでしょうか。最初に行なった「Matrixのかけ算」の例で試してみます。
もともとの接続では、[locator1] のオフセットがMatrix In[0] に来ていましたが、
これをMatrix In[1] に変えて接続を構築してみます。
[locator1] を動かすと......
うーん。全然挙動がちがいます。
このように、計算順序はそのロジックに合わせておかないと、制御が上手くいかないということがわかりました。
Step 06:まとめ
今回は、Matrixに関する初歩的な概念の紹介に留まりましたが、今までMatrixに対して難しい印象を抱かれていた方々が、多少なりともMatrixに対して親しみを感じていただければ幸いです。
電車に乗ったときに「今、電車のMatrixが乗算されたな」とか、あるいは電車を降りたときに「電車のInverseMatrixが乗算されたな」などと、「身のまわりのMatrix」を感じることができるでしょう!
えっ? そんなことはない?......あぁ......そう、ですか。
さて次回からは、今回紹介したMatrixの知識を使って、Matrixの制御をリグやアニメーション作成に応用した例を紹介したいと思います。
では、今回はこのへんで。 サヨナラ! サヨナラ! サヨナラ!!
Profile.
-
山本智人/Tomohito Yamamoto(COYOTE 3DCG STUDIO)
ゲーム開発会社にてグラフィックアーティストとして、モデリング・モーション・エフェクト・UIなどオールラウンドのグラフィック制作を経験後、テクニカルアーティストに転身。現在は株式会社クリーク・アンド・リバー社 COYOTE 3DCG STUDIOにて、社内外問わずアーティストのDCCツールサポートや制作パイプラインの提案・作成・運用を行う。特にアニメーション制御やモーション制作周りのテクニカルサポート・リガーとして様々なプロジェクトに従事