クリーク・アンド・リバー社の社内CGスタジオであり、ゲームの3DCGグラフィックス制作を中心に手がけているCOYOTE 3DCG STUDIO。本連載では、同社のTAチームによる制作に役立つ技術TIPSを紹介していく。
TEXT_山本智人 / Tomohito Yamamoto(COYOTE 3DCG STUDIO)
EDIT_三村ゆにこ / Uniko Mimura(@UNIKO_LITTLE)
はじめに
おはこんばんちわ、COYOTE 3DCG STUDIOテクニカルアーティストの山本です。
前回は、Matrixに関する簡単な考え方とシンプルな実例をMayaを用いて紹介しました。今回はMatrix実用編として、「リグの親空間切り替え機能」をMatrixを使って実現する方法の一例を紹介します。
ただ「親空間の切り替え機能」を実装する手段として、必ずしもMatrixを使用する必要はありません。ポピュラーな方法として、「コンストレイントのブレンド値の操作によって実現する方法」があり、そちらの方がわかりやすくシンプルな実装になると思います。今回の記事では「Matrixの理解を深める」という趣旨に基づき、Matrixを使った親空間切り替え手法について解説していきます。
Results:結果を先に
CASE 01:親空間の切り替え
親空間となるMatrixをそれぞれ自身のオフセットマトリクスに乗算しますが、乗算する対象に「Choiceノード」を使用することで、親空間を切り替えられるようにします。
CASE 02:「移動成分」、「回転成分」個別の切り替え
移動成分と回転成分用にChoiceノードを用意し、Transform・Rotateそれぞれに接続させます。
Step 00:「親空間切り替え」とは何だろう
そもそも「親空間切り替え」とは何のことでしょう。
シンプルに、このようにノードを階層構造で組むと......
親ノードの移動や回転の制御を受けることは自明だと思います。要はこれを......
このように切り替えたい、ということです。
実際のアニメーション作業では、手首の位置や頭の向きを維持した状態で、腰の位置や背骨のシルエットを変えたいといった局面は頻繁にあります。しかし場合によっては、逆に背骨や腰の位置や向きの変化に合わせて「親子階層」的な挙動をしてほしいことがあり、状況によってその挙動を切り替えたい場合が多くあります。この「親空間切り替え機能」は大体のケースでアニメーターさんから要望をいただきます。
例えば、
①「敵と対峙しているとき」のモーションでは、常に相手の方向を向きながら構えるポーズが要求されます。この場合は、頭と腕は胴体の回転をあまり拾ってほしくないのですが......
②「攻撃を受け、きりもみ回転して吹き飛ばされる」といったアニメーションを要求される場合は、体の動きに合わせて頭も腕も一緒に回転してほしいわけです。
このように実際のアニメーション作業では、状況に合わせて複雑に「親空間」を切り替えながら作業を進めます。
Step 01:親空間の切り替え機能を実装してみよう
まずはシーンを準備しましょう。
このようにカーブノードを3つ用意して、それぞれ「A_ctrl」、「B_ctrl」、「C_ctrl」と名前を付けます。
階層構造はこのようなかたちにします。 オフセットの移動値をもたせるためのノードを用意し、それぞれ「A_ctrl_offset_trns」、「B_ctrl_offset_trns」、「C_ctrl_offset_trns」と 名前を付けます。
シンプルに「A_ctrl」の親空間として「B_ctrl」のMatrixを接続してみましょう。こちらの方法は、前回の記事で紹介した通りなので詳細は省略します。
各ノードはこんな感じになります。[multMarix1] の [Matrix In [0] ]には、オフセットのMatrixをあらかじめ設定しておきます。
動きはこんな感じです。ちょうどParent Constraintをかけた状態と同じかたちになります。では、ここの制御に「C_ctrl」のMatrixの乗算を差し込み、切り替えられるようにしてみましょう。
1-1:「A_ctrl」のオフセット値をもたせた、「multMatrixノード」の接続を用意
「B_ctrl」のノード接続を用意した手順と同じかたちで、「C_ctrl」のMatrixを乗算させたノード群を用意します。
1-2:切り替え制御用に「A_ctrl」に列挙型アトリビュートを用意
親空間の切り替え操作をするために、「A_ctrl」に切り替え用アトリビュートとして「Parent Space」などと名前を付けた列挙型アトリビュートを追加します。
リストの中身は「B_ctrl」、「C_ctrl」などとするのがわかりやすいと思います。
1-3:「Choiceノード」に親空間Matrixを接続
NodeEditor上で「Choiceノード」を作成します。
Inputアトリビュートにそれぞれ「B_ctrl」、「C_ctrl」からの「multMatrixノード」を接続します。
1-4:「A_ctrl」に追加した列挙型アトリビュートを「Choiceノード」に接続
作成したChoiceノードに、「A_ctrl」の列挙型アトリビュート「Parent Space」を接続します。
これで、「Choiceノードの何番目を選択するか」を指定できます。このとき、Choiceノードの接続順と列挙型アトリビュートの順番を揃えておく点に注意が必要です。ずれていると、狙ったノードへ親空間が切り替わらなくなってしまいます。
1-5: Choiceノードの結果を「decomposeMatrixノード」、「A_ctrl_offset_trns」に接続
Choiceノードの結果を「decomposeMatrixノード」に繋ぎ、「decomposeMatrixノード」から「 A_ctrl_offset_trnsノード」へ結果を繋ぎます。
すると......
このようにアトリビュートを切り替えることで、任意の親空間へ制御を切り替えることができました。
Step 02:「移動成分」、「回転成分」個別での親空間切り替えを実装してみよう
ひとまず親空間の切り替えを実装することができましたが、「移動成分」、「回転成分」などまとめて切り替える制御になっています。 実際のモーション作業では個々に切り替えたい場合が多く、このままでは不都合があります。 ではどのように実現すればよいのでしょうか。
これも、「移動成分用」、「回転成分用」でそれぞれChoiceノードを用意して切り替えられるようにすると、わりと簡単に実現できます。
2-1:「移動成分用」、「回転成分用」にアトリビュートを追加する
先ほどの「Parent Space」アトリビュートをリネームし「Pos Parent Space」などとして、移動成分用のアトリビュートとします。 次に「Pos Parent Space」という名前で同じように列挙型アトリビュートを用意して、回転成分の親空間切り替えアトリビュートを用意します。
2-2:回転成分用にchoiceノードを追加
回転成分の切り替え用にChoiceノードを新しく追加し、接続を構築します。
2-3:それぞれのアトリビュートを接続
「移動成分用Choiceノード」、「回転成分用Choiceノード」をそれぞれ「A_ctrl」のTransform・Rotateアトリビュートに接続します。
結果を見ると......
できました! ハラショー!
Step 03:まとめ
Matrixを上手く操作できると、任意のTransformを継承させることができるようになります。特に今回紹介した「親空間の切り替え」の技術は、実際にモーション作業で運用されるリグでは重宝される機能の1つだと思います。
ただこの機能実装に使われる手法としては、冒頭でお話ししたように「コンストレイントのブレンドで実現する場合」が多いかもしれません。モノは試しで、この辺りの実装をMatrixを使って試してみると、よりMatrixに対する理解度や親近感が増すように思うのでオススメです!
......え、親近感は増さない? あぁ......そうですか......。
次回は「Matrxを使ったポーズとモーションのミラー」を取り上げてみたいと思います。以前、当社のブログでも紹介したトピックスになりますが、こちらの記事では「Matrixを使ってQuaternionを左右反転させる」という方式を採っています。本連載では、純粋に「Matrixの計算とベクトル」でアプローチしていく予定です。
では、今回はこのへんで。 サヨナラ! サヨナラ! サヨナラ!!
Profile.
-
山本智人/Tomohito Yamamoto(COYOTE 3DCG STUDIO)
ゲーム開発会社にてグラフィックアーティストとして、モデリング・モーション・エフェクト・UIなどオールラウンドのグラフィック制作を経験後、テクニカルアーティストに転身。現在は株式会社クリーク・アンド・リバー社 COYOTE 3DCG STUDIOにて、社内外問わずアーティストのDCCツールサポートや制作パイプラインの提案・作成・運用を行う。特にアニメーション制御やモーション制作周りのテクニカルサポート・リガーとして様々なプロジェクトに従事