見出し画像

モーションRIGのこと(その4)

前回までの記事で、移動と回転のコントローラーを使った、初心者向けのRIG作成についてお話いたしました。今回は仕上げとして、やや複雑な機構を組み込んだ、中級者向けのRIG作成について紹介いたします。なお、この記事は以前作った資料を元に作成しており、操作や機能面で、前提となる部分をかなり端折っておりますので説明不足の部分もありますのでご了承ください。

リバースフットRIG

っていうのが適当かは判らないのですが、爪先が制御上の上位に位置する足のIK構造です。前回までのRIG構造だと、足首まではきっちり固定できるのですが、爪先で踏ん張っているようなモーションを作ることは困難かと思います。なので、爪先コントローラーの階層を上位に置いて制御する、ということを行います。これは前回少しだけ紹介した、モデルのボーン構造とは階層の順位を変えて、特殊な制御を行う、というものの一例となります。

名称未設定 1 のコピー

少々分かりにくいですが、リバースフットRIGの構造は上図のようにしたいと思います。爪先を回転させると、踵がそれに連動して動く、という仕組みです。

名称未設定 1 のコピー

今回作成する、リバースフットRIGの階層構造は上図のようになります。新規で作ったロケーターに拘束する場合、ダミーオブジェクト、またはロケーターの下位(子供)に配置して、直接はコンストレイントを結んでいない上位オブジェクト(親)を操作することで、親側の位置を基準に子供を回転するなどのことが可能となります。このケースでは、IKのエンドエフェクタが足首にあるため、コントローラー操作の起点が足首にありますが、このコントローラーの上位(親)に爪先のダミーロケーターを配置していて、足首の制御下にいないため、足首をいくら動かしても、爪先は固定されたまま、となります。

名称未設定 1 のコピー

上図を見てもらうと、踵のコントローラーを回転させても、つま先がしっかり固定されていることが判ると思います。つま先が固定されているので、結果的に足首の位置も上昇し、行き場を無くしたIKコントローラーが動くことで膝が曲がっています。モーション作ってる人なら判ると思うのですが、この仕組みがないとアニメーション作るのが結構大変ですよね。このように、ちょっと凝ったRIGを使う場合、このような”迂回”によって、コントローラーを使いやすくする、ということが常套手段となるので、頭の片隅に置いてもらえればと思います。

画像4

プロシージャル環境というか、昨今ノードエディタを採用しているツールが増えているので、割と入りやすいと思いますが、ハイパーグラフを見ながら、効果を確認しつつ、RIG制作をしていくのが良いと思います。
個人的には、RIG制作は階層構造とコンストレイントが重要だと思っています。複雑なドリブンキーやエクスプレッションは本職のリガーさんにお任せするとしても、簡単なRIGであれば、自分で作ることが出来た方がプロが作ったRIGの構造もなんとなく理解できますし、模倣したり応用することもできるでしょう。

画像5

今回ご紹介した構造は、獣足RIGへの拡張も可能です。獣足は、足の甲に当たる部分が人間よりも大きく、足首っぽく見える部分が爪先なので、この構造を利用して作成すると、人体RIGと変わらない操作感でアニメーション制作が可能です。左のドラゴンで使用されているRIG(フリー素材)は、一見特殊なオリジナルボーンなのですが、個々の要素は人間と共通です。獣足は先ほどのリバースフットRIGの応用ですし、翼も手首までは人体と同じ。翼は進化して人間の「指」になっているので、指のRIGと同じで特に問題ないです。ここで言うと、人体には無い尻尾(カーブベースのTail専用RIGを使うこともある)、翼の翼膜(左では移動コントローラーを使って動かしている)、ブレスを吐くときなどに使う喉の膨らみを制御するコントローラーなどは、階層構造的にちょっと工夫が必要と思います。

いずれにせよ、特殊なボーン構造を持つキャラクターが出てきたとしても、要素ごとに切り出し、それと「近い」ボーン構造に当てはめて、その応用としてRIG作成するのが良いかと思います。なお上図のドラゴンは、標準的なポーズをバインドポーズにしていますが、ゲームの場合、変な初期値が入るのを避けたいので、このようなキャラクターだった場合も、人間と同じ、手足が真っ直ぐのびたポーズ(いわゆるAポーズやTポーズ)で制作するのが良いのではないでしょうか。

RIGの階層構造について

キャラクターモデルのボーン構造と、アニメーションRIGの構造は似ているようで結構違います。キャラクターモデルは比較的理解しやすい、一部並列はありますが、基本的には直列繋ぎ(人体の構成が元になっているのでイメージしやすい)になっていると思うのですが、RIGの階層構造は、いくつものクラスタが同時に存在する複雑な並列つなぎであり、処理の順番も考えないといけないので、イメージしずらく、なかなかすぐに理解することは難しいと思います。

スクリーンショット 2022-01-13 6.04.11 のコピー

エンジンの仕組みを理解しなくても、車の運転はできます。が、プロとして車の運転をするのであれば、最低限の構造は理解しておく必要はあるように、モーションデザイナーにとってのRIGも同様のことが言えると思います。というか、そもそもRIG設計は楽しいですし、自分のキャラクターのアニメーションを愛着持って作るためにはカスタムRIGを作ってみたいと思う人も居るかと思います。RIGが発達してなかった頃は、頻繁にジンバルロック起こしてたのを修正計算式を使ってチマチマとカーブ修正してましたが、そういった後々の手間を低減するためにも、最低限の知識は持っていた方が良いのかなと思ったりします。

上図のアウトライナは、市販のキャラクターセットアップ(映像作品用)ですが(ここまで複雑なのは自分は作れない)自分の作るようなコントローラーをシーン上で選択するタイプではなく、専用のGUIを使うタイプのようで、制御RIG自体は直接触らないこともあって、かなり複雑な作りになっているみたいです。

腕RIGの階層構造

名称未設定 1 のコピー

次は腕のRIGを作ってみましょう。腕のRIGは、足のように接地を厳しく設定する必要があまり無いため、割と簡素な構造でいいと思います(武器などを持つ場合は拡張された仕組みが必要になります)。手は足に比べると動きが細かく、また常に動いている箇所になりますので、あまり複雑にすると実際にモーションを作るときに大変だと思います。

腕に関してかなりの頻度で行うのが、移動、回転系のグローバル/ローカルの切り替えです。腕のモーションはそれ自体が複雑なものになりがちですし、武器などの外部オブジェクトを持つケースもかなり多いことを考えると基礎構造としては比較的簡素に作っておく方が、後々の拡張に於いても楽でしょう。

名称未設定 2 のコピー

基本的な動作であれば、構造的にあまり複雑にはならないと思います。が、ここに筋肉の補助ボーン、下腕部の捻れボーンなどが追加されると、結構、面倒なことになります。この辺までくると自分もよう判らないのでスルーします。

名称未設定 1 のコピー

では最初に、グローバルスペースと、ローカルスペースのIKコントローラーを作ります。グローバルスペース(ワールド制御)のIKの名前「Rig_L_Hand_Global」にし、ローカルスペースのIKの名前は「Rig_L_Hand_Local_Tra」にしましょうか。ローカルはトランス(移動)を制御するためのコントローラーになりますので、便宜上分けています。

スクリーンショット 2022-01-13 6.18.15 のコピー

グローバルスペースのコントローラー「Rig_L_Hand_Global」にアトリビュートを追加します。名前は直接日本語には変換できないので、一旦仮にL_Hand_Grobal_Grobal_Transと、L_Hand_Grobal_Grobal_Rotateという文字列にしました。アトリビュートの編集で、ナイスネームを「左グローバル移動オン」「左グローバル回転オン」と名前を変えます。ナイスネームはチャンネルボックス内で表示される名前です。分かりやすいものにした方が良いでしょう。

パラメータはintで、最小値を0.0、最大値を1.0にします。これは、OFF(0)ON(1)を2進数で切り替え設定できるという意味です。

スクリーンショット 2022-01-13 6.19.29 のコピー

グローバルとローカル双方で、腕IKのエンドエフェクタで位置コンストレイントを行うと、ikHandleのコンストレインノードに、Rig_L_Hand_Global WO、Rig_LHand_Local Tra W1というふたつのアトリビュートが出来ます。
ここをそれぞれ1(ON) 0 (OFF)1にすることで、コンストレイントを有効、 無効にできます。なお、複数のコントローラーが、ひとつの対象に対して同じコンストレイントをかけた場合、その数の分だけ割分でブレンドされてしまうので注意です。

スクリーンショット 2022-01-13 6.21.02 のコピー

ikHandleのコンストレイントノードから、ドリブンキーを作成します。ドリブンが (ikHandle L_Arm_pointConstraint1)、ドライバがグローバルコントローラー(Rig_L_Hand Global) になるドリブン側をコンストレイントのアトリビュートを指定 (Rig_LHand_Global WO、 Rig L_Hand_Local TraW1)ドライバ側を左(右)手グローバル移動オンを指定してキーを打ちましょう。

スクリーンショット 2022-01-13 6.22.04 のコピー

グラフエディタを開いて、該当するアトリビュートのアニメーションを打ちます。[ターゲット0]ターゲットウェイト、RIG LHand Global.左手グローバル移動オン0フレーム目に0、1フレーム目に1を打ち、[ターゲット1]ターゲットウェイトRIG_L_Hand_Global 左手グローバル移動オン0フレーム目に1、1フレーム日に0を打ちます。
Rig L Hand Global WOのチャンネルではRIG_LHand_Global.左手グローバル移動オン0フレーム目に0、1フレーム目に1を打ちます
Rig L Hand Local Trans W1のチャンネルではRIG_L Hand_Global.左手グローバル移動オン0フレーム目に1、1フレーム目に0うちます。
Rig_LHand Local Rot W1のチャンネルではRIG_L Hand_Global.左手グローバル移動オン0フレーム目に0、1フレーム目に1を打ちます。

ひと通り設定したら、 IKコントローラーに戻って、 オン/オフアトリビュートを使うと、コントローラーがローカルとグローバルで入れ替わります。次はローカルの設定にうつります。

名称未設定 1 のコピー

先ほど作った、ローカル移動のコントローラーの近くに、拳のローカル移動を設定するコントローラーを作ります。ローカルスペースの回転コントローラー名は「Rig_L_Hand_Local_Rot」にします。階層構造については前述した「腕RIGの階層構造」の部分を参照してください。

スクリーンショット 2022-01-13 6.27.41 のコピー

グローバルのコントローラーから直接手首のボーンに回転コンストレイントを結び、ローカルの方は、ローカル構造体(ローカル移動の下の階層に回転を制御するロケーターを作る)と、手首のボーンを回転コンストレイントで結びます。

スクリーンショット 2022-01-13 6.30.22 のコピー

手首ボーン側にあるコンストレインノード (L_Hand_orientConstraint1)にグローバルとローカルの切り替えアトリビュートを追加(Rig LHand Global WOE. Rig L Hand Local Rot W1)します。

画像17

ドリブンキーの設定をする。このコンストレイントノードをドリブン(Rig_L_Hand Local Rot W1と、Rig LHand Global W2)にし、ドライバを回転のコントローラーにし、左手グローバル回転オンを結んで、キーを打ちます。

スクリーンショット 2022-01-13 6.31.23 のコピー

ドリブンキーの設定をします。このコンストレイントノードをドリブン(Rig_L_Hand Local Rot W1と、Rig LHand Global W2)にし、ドライバを回転のコントローラーにし、左手グローバル回転オンを結んで、キーを打ちましょう。

スクリーンショット 2022-01-13 6.31.56 のコピー

移動と同様にグラフエディタを開いて、該当するアトリビュターゲット [0]ターゲットウェイトRIG_L_Hand_Global.左手グローバル回転オン0フレーム目に0、1フレーム目に1を打ちます。
RIG_L_Hand_Global.左手グローバル回転オン0フレーム目に1、1フレーム目に0を打ちます。
Rig_ L Hand Global WOのチャンネルでは、RIG_L_Hand_Global. 左手グローバル移動オン0フレーム目に0、1フレーム目に1を打ちます。

Rig_LHand Local Rot W1のチャンネルではRIG_L Hand_Global.左手グローバル移動オン0フレーム目に1、1フレーム目に0を打ちます。ひと通り設定したら、 IKコントローラーに戻って、 オン/オフアトリビュートを使うと、コントローラーがローカルとグローバルで入れ替わります。

名称未設定 1 のコピー

上図の部分で、グローバル制御とローカル制御を切り替えられます。ドリブンキーを使うと、複雑なアニメーションが簡単な操作によって作ることができます。

さて、4回にわたって紹介したRIG制作について。RIGについてはあまり書籍や情報がなく、自分も色々手探りで作ってきました。今回のRIGについても昔友達が作ったものを解析して、自分の環境に合わせて独自のカスタマイズにしたものになります。色々苦労したこともありますが、その分、理解が進んだ側面もあるので、まずは作ってみて、あれこれ改造して、ゲームデザインやその他要素に合わせたチューニングを行うことが大事なのではないでしょうか。

というわけで、長々とありがとうございました。

この記事が気に入ったらサポートをしてみませんか?