本連載は、筆者のオリジナルキャラクター『流流(るる)』を題材に、リアルタイム向けのシンプルなリグとモーション制作について紹介します!
今回から全身のリギングが始まります。初めての方には複雑そうに見えるかもしれませんが、どれも前回で話した基本要素の組み合わせや応用なのでご安心を。
Topic 1:命名規則
『未来の自分を信用するな』
いきなり辛辣な出だしですみません。これは昔、筆者が先輩から言われた言葉です。
皆さんはこのようなシーンデータに見覚えはありませんか?
ひどく散らかったシーンデータ……その「locator1」、何のために作ったのか1か月後に思い出せるでしょうか? 自分が作ったデータと言えど時間が経てば細かいことは覚えていないものですし、他人から引き継いだデータならなおさらです。
3DCGの中でもリギングは多くのノードやアトリビュートを取り扱う工程なので、効率良く、正確に作業を進めるためにはシーンデータの整理整頓が必要不可欠です。そして整理整頓の第一歩は名前付けのルール、命名規則です。
一貫性のある命名規則があると、次のような利点があります。
・オブジェクトの名前付けに毎回悩まない。
・仕様を知らない人が見ても、ノードの役割が何となく想像できる。
・スクリプトで扱いやすい。
本記事で定義するルールを以下にまとめますが、あくまで本記事上のルールであり、絶対ルールではありません。大事なのは一貫性です。
基本ルール
1. 大前提としてMayaでは2バイト(全角)文字厳禁です。シーン内はもちろん、プロジェクトフォルダやシーン名でもサポートされていませんので注意しましょう。
参考:Autodesk Support
2. 各単語の表記は「アッパーキャメルケース」。例えば「OneInchPunch」のように単語の先頭を大文字にして繋げる記法です。
3. 各ノード名は、下記のような最大3パーツをアンダースコアで連結した構造とします。
[A.ノード識別子]_[B.位置識別子]_[C.部位名]
例) Con_L_Hand
A.ノード識別子
ノードの種類や役割を示す識別子です。全てのノードにつける識別子なので、基本3文字の省略表記で短くまとめています。
- Grp
グループ。ノード群をまとめる親ノード。
- Con
コントローラ。アニメーションで直接触るノード。
- Off
オフセット。コントローラのローカル座標をリセットするノード。
- Jnt
インフルエンスジョイント。バインド対象。
- Drv
ドライバー。何かの追従対象となるTransformノード。
- Dvn
ドリブン。何か他のノードに追従するTransformノード。
- 上記以外(ikHandleなど)
省略表記せず、ノードのデフォルト名を使用する。
B.位置識別子
(キャラから見た)オブジェクトの位置情報を示す識別子です。基本1文字で表記します。この識別子自体を省略する場合もあります。
- C
中央
- L
左
- R
右
C.部位名
1. キャラクターの部位を英語表記します。
例)〇Head ×Atama
2. 連続する部位は、末尾に数字をつけます。
例)Spine1、Spine2、……
3. バリエーションは、末尾に大文字アルファベットをつけます。
例)WeaponA、WeaponB、……
4. 特殊な機能をもつ場合は、部位名に続けて表記します。
例)右腕のポールベクター:ArmPV
Topic 2:キャラクター構造のおさらい
前回のキャラクター構造図をもう一度見てください。
バインドスケルトン(Bind Skeleton)と 中間スケルトン(Middle Skeleton)の2つスケルトンがあることに注目してください。筆者の場合、バインドスケルトンに直接リギングするのではなく、中間スケルトンを中継してバインドスケルトンを制御するかたちに組むことが多いです。流流も同じ構造でリギングしています。
こんな回りくどいセットアップをするのには、以下のような理由があります。
・IKハンドルなど、ゲームエンジン上で不要なノードが出力体に含まれるのを防ぐ。
・リギング中に意図せずジョイントが壊れた場合に出力体への影響を抑えられる。
・リグが簡単に取り外せる(中間スケルトンとの接続を切るだけ)。
要は「出力体はなるべく安全に、シンプルな状態にしておきたい」という思想です。
……ただ、本記事は初心者向けの手引きが目的なので、説明や工程の簡略化を優先し、バインドスケルトンに直接リギングする方針で進めます。
次の Topic からいよいよリグを組み立てていきます。リギングは地味な話が多くなってしまいますが、初心者の方は一連の流れを何となく把握してみよう、くらいの気持ちで、気負わず読んでくださいね。
Topic 3:一括制御用リグの作成
最初にキャラクター全身を制御するためのコントローラを作ります。原点位置「Con_C_Root」を作成し、オフセットノード「Off_C_Root」にペアレントします。オフセットって何だっけ?という人は、前回のリギング練習を見返してください。
Off_C_Root を選択して[Ctrl+G]で、親に Transformノード「Grp_Rig」を作成します。今後、リグに関するノードはこのグループにまとめていきます。
もうひとつ、全身制御用のコントローラセット「Center」を追加します。位置はお好みですが、わかりやすく Hip の高さに配置します。キャラクターを空中でクルクル回転させるときなどにあると便利なコントローラです。
ちなみにこのコントローラの必要性については諸説ありますが、筆者は使う機会が多いので解説しました。
できたら Root の子にペアレントします。
さらに、上半身制御用のコントローラセット「Waist」を作成します。最も使用頻度の高いコントローラになるため、見やすく使いやすいかたちで作成すると良いでしょう。
Center と同じように Hip の位置に合わせた後、Center の子にペアレントしてください。これで一括制御用のリグはひと通りセットアップ完了です。
Topic 4:体幹のリギング
基本はFKセットアップ
身体の正中線上に位置する Hip、Spine、Neck をリギングします。前回の木人椿リグと同じようにシンプルな「FKリグ」を作成します。
Hip のコントローラセットを作り、Hip ジョイントに姿勢を合わせたら Con_C_Wasit の子にペアレントします。
コントローラとジョイントをコンストレイントで接続します。Hip は回転で制御したいので、OrientConstraint を使用します。[Con_C_Hip → Jnt_C_Hip]の順に選択してコンストレイントを設定したら、コントローラを動かして動作確認します。
同じ要領で残りの Spine、Neck もFKセットアップします。ひと通り作成できたら Hip~Neck のコントローラセットを直列にペアレントしてください。
お尻だけ動かせるようにしよう
Con_C_Hip を動かすと、当然ですが子階層の Con_C_Spine1 以下も全て動いてしまいます。ただ、お尻を振ったり骨盤の角度を調整するときなど、Hip だけ動かしたいことが多くあります。
親離れのときがやってきました。Spine1 以下のリグを Hip から切り離して並列にします。これで親子関係から解放された Hip と Spine のリグは、お互いに干渉せず独立して動かせるようになります。
Spine1 のリグは動かなくなりましたが、ジョイントは変わらず動いてしまいます。
Jnt_C_Spine1 はコントローラに対して「位置」が拘束されていないため、親の Jnt_C_Hip の影響を受けて位置が動いてしまうのです。ややこしいですね。
位置も拘束するために、PointConstraint も追加で設定してしまいましょう。あるいは、設定済みの OrientConstraint を削除し、ParentConstraint を再設定してもOKです。これで Jnt_C_Spine1 は「位置」「方向」両方がコントローラ(Con_C_Spine1)に拘束された状態になり、Hip の影響をまったく受けなくなりました!
もう1つ問題が残っています。
Hip の親階層にある一括制御用リグ(Waist、Center、Root)の位置を動かすと Hip のコントローラが置き去りになります。これも先ほどの Spine1 の例と同じで、ジョイントが「方向」しか拘束されていないためです。Hip も PointConstraint 追加、または ParentConstraint へ置き換えましょう。
回りくどい説明で申し訳ありません。
今度こそ、これで体幹のリギングは完了になります。
Topic 5:頭のリギング
Head のコントローラセットを作成し、Head ジョイントの位置に合わせ、OrientConstraint でジョイントを拘束します。普通のFKセットアップです。
いったん、スケルトン階層と同じく Head を Neck の子にペアレントします。
頭を安定させよう
人体で最も重い部位は頭です。重いものには慣性が強く働き、外力の影響を受けにくくなります。逆に言えば、頭がフラフラ不安定だと不自然なモーションに見えてしまうということです。
しかし Head が Neck の子になっているため、頭が首の角度に影響を受けてしまいます。この状態で頭を安定させるようモーションを作るのは、非常に手間がかかります。
第1回でお伝えした通り、リグを作る目的は作業効率化です。面倒なことはリグの力で解決しましょう。
Head のコントローラセットを Neck から取り外し、Center の子にペアレントし直してください。これで首から下の傾きに影響を受けなくなりますが、首から下を動かすと頭のコントローラが置き去りになってしまいます。
コントローラの 位置 だけは首に追従してほしいので、コンストレイントで位置を拘束します。
まず、Con_C_Neck の子にTransformノード「Dvr_C_Head」を作成し、Con_C_Head の姿勢に合わせます。これが Head リグの位置参照ノードになります。
次にTransformノード「Dvn_C_Head」を作成し、Off_C_Head と姿勢を合わせてから子に Off_C_Head をペアレントします。[Dvr_C_Head → Dvn_C_Head]の順に選択し、PointConstraint で位置を拘束します。
Head コントローラの「位置」だけが首に追従し、方向は変化しないのを確認してください。
これは親オブジェクトを基準とした座標系=「Local空間」ではなく、原点を基準とした座標系=「World空間」で制御できるようになったことを意味します(厳密には「Center」のローカル空間とも言えます)。
ただし、宙返りのモーションを作る場合など、最初に直列ペアレントしていたときのようなLocal空間で制御したい場面があります。どちらの制御方法も選べるようなスイッチングをセットアップする方法も説明したいのですが、ややこしい話が続くので、いったん飛ばして次の工程に進みます。
Topic 6:脚のリギング
モーションを作る上で超重要な下半身をリギングします。
脚は左右ありますが、記事では左側のみ説明します。脚は基本的に地面と接地しているので、位置を固定しやすい「IKリグ」を使用します。FKリグとの違いについては、前回のFKとIKの説明を参照してください。
Leg1~Leg2~Foot のジョイントチェーンに対して「IKハンドル」を設定することで、IKで動くようになります。IK設定の前に以下を確認してください。
Check1. ジョイントチェーンが回転軸に沿った同一平面上にあるか?
IKチェーンとなる3つのジョイント(脚なら Leg1~Leg2~Foot)が、曲げたい軸に沿って同一平面上に配置されているかが重要になります。
大抵のキャラクターモデルは身体の正面(+Z)に膝を向けた状態でセットアップするので、膝はX軸を中心に回転することになります。つまり Front ビューから見て、3つのジョイントが真っ直ぐになっているかどうか?です。
Check2. 関節を曲げたい方向にジョイント優先角度が設定されているか?
IKは終点の位置を基に各ジョイントの角度が算出されます。今回は膝の関節について「こっちに曲がってほしい」とあらかじめ設定しておく必要があります。それが「ジョイントの優先角度(Preferred Angle)」です。
設定方法は簡単です。まず膝のジョイント「Jnt_L_Leg2」を選択し、曲げたい方向に適当な角度回した後、[Riggingパネル → Skeleton → Set Preferred Angle]を実行するだけです。
アトリビュートエディタで「Jnt_L_Leg2」の情報を開き、[Joint → Preferred Angle]に値が入っていることを確認してください。流流のスケルトンの場合、RotateZ に優先角度が設定されています。設定すべき角度・方向がわかっているなら手入力でもOKです。
脚のIK設定
脚のジョイントチェーンにIKを設定します。[Riggingパネル → Skeleton → Create IK Handle]で設定オプションを開き、「Curent solver」を「Rotate-Plane Solver」に設定してください。
そのまま[Jnt_L_Leg1 → Jnt_L_Foot]の順に選択すると IKハンドル(ikHandle)というノードが作られます。IKハンドルを動かすことでIKチェーンを操作できます。
命名規則に従い、IKハンドルを「ikHandle_L_Leg」とリネームしておきます。
IKハンドルを直接動かしてモーションを作ることも可能ですが、IKハンドルにはパラメータが多く、視覚的にも扱いづらいため、他部位と同じようにNURBSカーブのコントローラを介して制御できるようにします。
脚IKのコントローラセットを作成し、コントローラ「Con_L_LegIK」の子にIKハンドルをペアレントします。IKハンドルを誤って直接選択してしまわないように、非表示にしておきましょう。
ついでに爪先もセットアップします。Toe のFKコントローラセットも作成し、ジョイントを OrientConstraint 設定します。IKハンドルと同じように「Con_L_LegIK」の子にペアレントしてください。
仕上げに脚リグを Con_C_Center の子にペアレントします。スケルトンの階層とは違い、Hip ではなく Center の子にペアレントするのが重要です。
さらに Con_L_LegIK に Jnt_L_Foot を OrientConstraint して、足首から先を回転制御できるようにします。これで1つのコントローラに脚IKの移動と足首の回転、2つの機能をもたせることができました。
ここまでできたら、同じように右脚のリグも作成します。
左右の脚リグができたら動作確認です。「Con_C_Waist」を動かしてみると、脚リグを Center の子にペアレントした理由がわかります。
ポールベクターの設定
このままでは膝の向きが制御しづらいので、IKの関節方向を制御するコントローラを作成します。その設定に Pole Vector Constraint を使用するため、このコントローラを自体を「ポールベクター」と呼びます。
ポールベクターとなるコントローラセットを作成し、膝(Leg2)のジョイントに位置合わせします。膝が正面に向いていない場合は向きも合わせます。
Leg2 の正面方向にコントローラセットを移動して関節から離します。この距離に明確な決まりはありませんが、近すぎても離れすぎても扱いづらいです。おおよそ大腿骨(Leg1~Leg2)の長さより少し遠いくらいの位置で良いと思います。
ポールベクターの位置が決まったら、IKハンドルをポールベクターにコンストレイントします。[Con_L_LegPV → ikHandle_L_Leg]の順に選択し、Pole Vector Constoraint を設定します。このとき、脚が動いてしまう場合はポールベクターの配置に問題があるので、IKの正面側に配置できているか再確認しましょう。
挙動が確認できたら、ポールベクターの設定は完了です。
今回のまとめ
長くなってきたので今回はここまで。
・命名規則を決めよう
・基本はFKセットアップ
・Local空間、World空間を使いこなそう
・IKのしくみを理解しよう
次回はボディリグの仕上げを目指します。引き続きどうぞよろしくお願いします。
※記事のご感想、リクエストなどお待ちしています!
Lee
ゲーム会社でコンシューマタイトルの開発に携わる傍ら、自主制作ゲームの進捗やCG作品などをTwitterで日々ゆるく発信している。インディーゲーム『ヤマふだ!』シリーズのグラフィック全般を担当。
X(旧Twitter):@leedoppo
TEXT_Lee
EDIT_小村仁美 / Hitomi Komura(CGWORLD)