BACKBONE RIG&TA EXPERTS

matrixその①~事例紹介~

2018/05/07

ご無沙汰しております。
BACKBONEの福本です。
前回の投稿からしばらく空いてしまいましたので、今週連投します。
今回はmatrixについてのご紹介です。

『matrix』は日本語では『行列』、
超ザックリ説明しますと「座標変換するため」に使用します
はい、これだけでは何のことかサッパリですね。
サッパリで構いません。
まずは『matrixの使い方』を習得し、慣れる事から始めましょう。
複雑なリグを設定しようとすると深い理解が必要ですが、基本的な使い方だけでもある程度対応できます。
使っていると何となく理解出来てきますので、
最初から理解しようとして心が折れるよりは、使って慣れてから折れましょう。

さて、matrixですが何が便利なのでしょうか?

私が使っていて特に便利だと感じることは、

・コンストレインノードを使用せずに必要最小限のコネクションで制御できる。
・影響させる階層や軸、ノードを自由に変更できる。

です。
では「どのような箇所で使用しているか」ですが、一例として足首のコントローラを挙げてみます。
例えば下図のように、足首に対してローカル軸でジョイントを設定したとします。

ジョイントと同じローカル軸でコントローラを作成し、ジョイントとコントローラをparentConstraintとscaleConstraintで繋ぎます。

コントローラを回転してみると、ジョイントはローカル軸に回転します。

コントローラを1軸でスケールしてみると、ジョイントはローカル軸の方向にスケールがかかります。

コントローラとジョイントを同じローカル軸で設定しているので、あたりまえの挙動ですね。
それにしても、ローカル軸のコントローラでは非常に使い辛そうです。
足首は、地面に対して『平行』に動いて欲しいですよね?

では次に、ワールド軸でコントローラを作成してみましょう。
ワールド軸のコントローラを作成し、ジョイントとコントローラをparentConstraintとscaleConstraintで繋ぎます。

コントローラを回転してみましょう。
地面と平行にワールド軸で回転しています。良い感じです。

次にコントローラを1軸でスケールしてみましょう。
地面と平行にスケールがかからず、ジョイントがローカル軸の方向にスケールがかかります。
非常に使い辛そうです。

ワールド軸の方向への結果にするにはどう対処すればよいでしょうか?
scaleコンストレインからscaleアトリビュートへのコネクションへ変更しても結果は同じです。
shear成分を考慮しないとこの問題は解決できません。
そこでmatrixの出番です。
matrixをうまく繋ぎ合わせることで、この問題を解決することができます。
セミナーでご紹介しました手法で(後ほど再度ご紹介します)matrixを繋いでみてください。
下図の結果となります。

コントローラはワールド軸、ジョイントはローカル軸とお互い異なる軸ですが、
コントローラの軸の結果がジョイントに反映されています。
このように、matrixを使用すると『制御する側』と『制御される側』とで軸が異なる場合でも、
同じ結果を反映させることができます。
※shearに値が入るのでゲームエンジンへの出力時には注意が必要です。


次に、もう少しマニアックな事例をご紹介します。
下図、matrixを使用してデフォームに追従するジョイント(コントローラ)を作成してみました。

 

このサンプルシーンの構造を説明しますと、灰色のジオメトリは青色のジョイントにバインドされており、

緑のジオメトリは青色と黄色のジョイントにバインドされています。※skinClusterを2つ持たせています。

そして、黄色のジョイントはサーフェイス(非表示にしています)に追従するように設定されており、
サーフェイスは青色のジョイントにバインドされています。

一見サイクルが起こりそうな仕組みですが、不要なmatrixの値をskinClusterのbindPreMatrixで相殺させることで、
サイクルが発生しない仕組みを構築しています。こちらも後ほどご紹介します。

少し長くなりましたが、このようにmatrixを使用すると必要最小限のコネクションで、
必要な機能を
ロジカルに構築することができます。
さて、前置きはこの辺にしておいて本題に入りましょう!
つづく

 

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