本連載は、筆者のオリジナルキャラクター『流流(るる)』を題材に、リアルタイム向けのシンプルなリグとモーション制作について紹介します!

今回から全身のリギングが始まります。初めての方には複雑そうに見えるかもしれませんが、どれも前回で話した基本要素の組み合わせや応用なのでご安心を。

記事の目次

    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」を作成します。今後、リグに関するノードはこのグループにまとめていきます。

    ▲原点に作られたRootコントローラ。リグ全体をまとめるグループも最初に作っておき、組み上がったパーツを適宜整理していくとシーンが散らからずに済む

    もうひとつ、全身制御用のコントローラセット「Center」を追加します。位置はお好みですが、わかりやすく Hip の高さに配置します。キャラクターを空中でクルクル回転させるときなどにあると便利なコントローラです。

    ちなみにこのコントローラの必要性については諸説ありますが、筆者は使う機会が多いので解説しました。

    できたら Root の子にペアレントします。

    ▲Root の子に Center を追加。腰回りはコントローラが渋滞しがちなので、使用頻度の低い Center は控え目にした。見かけ上はキャラから離れているがピボットは中心にある

    さらに、上半身制御用のコントローラセット「Waist」を作成します。最も使用頻度の高いコントローラになるため、見やすく使いやすいかたちで作成すると良いでしょう。

    Center と同じように Hip の位置に合わせた後、Center の子にペアレントしてください。これで一括制御用のリグはひと通りセットアップ完了です。

    ▲Root、Center、Waist が直列に連なった状態

    Topic 4:体幹のリギング

    基本はFKセットアップ

    身体の正中線上に位置する Hip、Spine、Neck をリギングします。前回の木人椿リグと同じようにシンプルな「FKリグ」を作成します。

    Hip のコントローラセットを作り、Hip ジョイントに姿勢を合わせたら Con_C_Wasit の子にペアレントします。

    ▲ジョイントに姿勢を合わせた Hip のコントローラセット

    コントローラとジョイントをコンストレイントで接続します。Hip は回転で制御したいので、OrientConstraint を使用します。[Con_C_Hip → Jnt_C_Hip]の順に選択してコンストレイントを設定したら、コントローラを動かして動作確認します。

    ▲Hipジョイントが動くようになった。Hipは一番親のジョイントなので、現状はスケルトン全体が動いてしまう状態

    同じ要領で残りの Spine、Neck もFKセットアップします。ひと通り作成できたら Hip~Neck のコントローラセットを直列にペアレントしてください。

    ▲Hip~Neck のコントローラセットを直列ペアレントした様子。流流リグの場合、Spine の数は2つ

    お尻だけ動かせるようにしよう

    Con_C_Hip を動かすと、当然ですが子階層の Con_C_Spine1 以下も全て動いてしまいます。ただ、お尻を振ったり骨盤の角度を調整するときなど、Hip だけ動かしたいことが多くあります。

    ▲直列に繋がった状態では親の Hip に Spine も追従してしまう

    親離れのときがやってきました。Spine1 以下のリグを Hip から切り離して並列にします。これで親子関係から解放された Hip と Spine のリグは、お互いに干渉せず独立して動かせるようになります。

    ▲Spine1 以下の階層を Hip からペアレント解除し、並列に並べる
    ▲Hip を動かしても Spine のリグは動かなくなった。しかし……

    Spine1 のリグは動かなくなりましたが、ジョイントは変わらず動いてしまいます。

    Jnt_C_Spine1 はコントローラに対して「位置」が拘束されていないため、親の Jnt_C_Hip の影響を受けて位置が動いてしまうのです。ややこしいですね。

    位置も拘束するために、PointConstraint も追加で設定してしまいましょう。あるいは、設定済みの OrientConstraint を削除し、ParentConstraint を再設定してもOKです。これで Jnt_C_Spine1 は「位置」「方向」両方がコントローラ(Con_C_Spine1)に拘束された状態になり、Hip の影響をまったく受けなくなりました!

    ▲Hip を動かしても Spine1 が固定された。これで思う存分、尻を振れる

    もう1つ問題が残っています。

    Hip の親階層にある一括制御用リグ(Waist、Center、Root)の位置を動かすと Hip のコントローラが置き去りになります。これも先ほどの Spine1 の例と同じで、ジョイントが「方向」しか拘束されていないためです。Hip も PointConstraint 追加、または ParentConstraint へ置き換えましょう。

    回りくどい説明で申し訳ありません。

    今度こそ、これで体幹のリギングは完了になります。

    ▲一括制御用リグの移動にも付いてくるようになった

    Topic 5:頭のリギング

    Head のコントローラセットを作成し、Head ジョイントの位置に合わせ、OrientConstraint でジョイントを拘束します。普通のFKセットアップです。

    いったん、スケルトン階層と同じく Head を Neck の子にペアレントします。

    ▲Head コントローラをセットアップした。まずはスケルトンと同じ構造で、Neck の子にペアレントしてみる

    頭を安定させよう

    人体で最も重い部位は頭です。重いものには慣性が強く働き、外力の影響を受けにくくなります。逆に言えば、頭がフラフラ不安定だと不自然なモーションに見えてしまうということです。

    ▲アクロバティックなモーションでも頭の姿勢は急激に変化しない

    しかし Head が Neck の子になっているため、頭が首の角度に影響を受けてしまいます。この状態で頭を安定させるようモーションを作るのは、非常に手間がかかります。

    ▲頭は胴体の傾きに追従する状態、つまりLocal空間での制御となる。頭を安定させるには胴体の傾きを相殺するように動かす必要があり、非常に手間がかかる

    第1回でお伝えした通り、リグを作る目的は作業効率化です。面倒なことはリグの力で解決しましょう。

    Head のコントローラセットを Neck から取り外し、Center の子にペアレントし直してください。これで首から下の傾きに影響を受けなくなりますが、首から下を動かすと頭のコントローラが置き去りになってしまいます。

    ▲Head を Neck からペアレント解除し、Center の子にペアレントする
    ▲胴体を動かすと頭の方向は保たれるが、コントローラが追従しない

    コントローラの 位置 だけは首に追従してほしいので、コンストレイントで位置を拘束します。

    まず、Con_C_Neck の子にTransformノード「Dvr_C_Head」を作成し、Con_C_Head の姿勢に合わせます。これが Head リグの位置参照ノードになります。

    ▲Neck の子にTransformノードを作成した。Drv(=Driver)は追従元ノードにつける命名規則

    次にTransformノード「Dvn_C_Head」を作成し、Off_C_Head と姿勢を合わせてから子に Off_C_Head をペアレントします。[Dvr_C_Head → Dvn_C_Head]の順に選択し、PointConstraint で位置を拘束します。

    ▲Off_C_Head の親にした Dvn(=Driven)ノードを、Dvr(=Driver)に PointConstraint で位置追従

    Head コントローラの「位置」だけが首に追従し、方向は変化しないのを確認してください。

    これは親オブジェクトを基準とした座標系=「Local空間」ではなく、原点を基準とした座標系=「World空間」で制御できるようになったことを意味します(厳密には「Center」のローカル空間とも言えます)。

    ▲位置のみ拘束したため、頭は胴体の傾きに影響されない、つまりWorld空間での制御ができるようになった

    ただし、宙返りのモーションを作る場合など、最初に直列ペアレントしていたときのようなLocal空間で制御したい場面があります。どちらの制御方法も選べるようなスイッチングをセットアップする方法も説明したいのですが、ややこしい話が続くので、いったん飛ばして次の工程に進みます。

    Topic 6:脚のリギング

    モーションを作る上で超重要な下半身をリギングします。

    脚は左右ありますが、記事では左側のみ説明します。脚は基本的に地面と接地しているので、位置を固定しやすい「IKリグ」を使用します。FKリグとの違いについては、前回のFKとIKの説明を参照してください。

    ▲地面に付いた脚は足裏が地面に固定されている、とも言い換えられる。つまりほとんどの場合はIK制御が適している

    Leg1~Leg2~Foot のジョイントチェーンに対してIKハンドルを設定することで、IKで動くようになります。IK設定の前に以下を確認してください。

    Check1. ジョイントチェーンが回転軸に沿った同一平面上にあるか?

    IKチェーンとなる3つのジョイント(脚なら Leg1~Leg2~Foot)が、曲げたい軸に沿って同一平面上に配置されているかが重要になります。

    大抵のキャラクターモデルは身体の正面(+Z)に膝を向けた状態でセットアップするので、膝はX軸を中心に回転することになります。つまり Front ビューから見て、3つのジョイントが真っ直ぐになっているかどうか?です。

    • ▲3ジョイントが同一平面上にないのでNG。骨格標本を参考にするとこのように配置しがちだが、これではIKが上手く設定できない
    • ▲Frontビュー=関節の軸正面から見たときに3ジョイントが真っ直ぐ並んでいるのが適切な状態

    Check2. 関節を曲げたい方向にジョイント優先角度が設定されているか?

    IKは終点の位置を基に各ジョイントの角度が算出されます。今回は膝の関節について「こっちに曲がってほしい」とあらかじめ設定しておく必要があります。それがジョイントの優先角度(Preferred Angle)です。

    ▲Leg2 の Preferrd Angle に適切に値が入っていないと、IKを設定した関節が意図しない方向に曲がってしまう場合がある

    設定方法は簡単です。まず膝のジョイント「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設定の流れ。2つのジョイントはビューポート以外に、アウトライナでも選択できる。その場合は[Ctrl]を押しながら2つ目のジョイントを選択することになる

    IKハンドルを直接動かしてモーションを作ることも可能ですが、IKハンドルにはパラメータが多く、視覚的にも扱いづらいため、他部位と同じようにNURBSカーブのコントローラを介して制御できるようにします。

    脚IKのコントローラセットを作成し、コントローラ「Con_L_LegIK」の子にIKハンドルをペアレントします。IKハンドルを誤って直接選択してしまわないように、非表示にしておきましょう。

    ▲IKハンドルはコントローラの子にペアレントして非表示に

    ついでに爪先もセットアップします。Toe のFKコントローラセットも作成し、ジョイントを OrientConstraint 設定します。IKハンドルと同じように「Con_L_LegIK」の子にペアレントしてください。

    仕上げに脚リグを Con_C_Center の子にペアレントします。スケルトンの階層とは違い、Hip ではなく Center の子にペアレントするのが重要です。

    ▲爪先のリグまでセットアップした様子。脚IKリグ丸ごと、全体制御用リグ「Center」の子にペアレントしよう

    さらに Con_L_LegIK に Jnt_L_Foot を OrientConstraint して、足首から先を回転制御できるようにします。これで1つのコントローラに脚IKの移動と足首の回転、2つの機能をもたせることができました。

    ▲「Con_L_LegIK」1つで脚IKの制御と足首の回転ができるようになった

    ここまでできたら、同じように右脚のリグも作成します。

    左右の脚リグができたら動作確認です。「Con_C_Waist」を動かしてみると、脚リグを Center の子にペアレントした理由がわかります。

    ▲脚リグが Waist の外にいるので当然、脚リグは動かず、接地が保たれる

    ポールベクターの設定

    このままでは膝の向きが制御しづらいので、IKの関節方向を制御するコントローラを作成します。その設定に Pole Vector Constraint を使用するため、このコントローラを自体を「ポールベクター」と呼びます。

    ▲IKの計算によって自動で各ジョイントの角度が決まるため、そのままでは関節の方向を自由に制御できない

    ポールベクターとなるコントローラセットを作成し、膝(Leg2)のジョイントに位置合わせします。膝が正面に向いていない場合は向きも合わせます。

    Leg2 の正面方向にコントローラセットを移動して関節から離します。この距離に明確な決まりはありませんが、近すぎても離れすぎても扱いづらいです。おおよそ大腿骨(Leg1~Leg2)の長さより少し遠いくらいの位置で良いと思います。

    ▲関節の正対方向に配置する。スケルトン自体が歪んでいる場合は潔く作り直そう

    ポールベクターの位置が決まったら、IKハンドルをポールベクターにコンストレイントします。[Con_L_LegPV → ikHandle_L_Leg]の順に選択し、Pole Vector Constoraint を設定します。このとき、脚が動いてしまう場合はポールベクターの配置に問題があるので、IKの正面側に配置できているか再確認しましょう。

    挙動が確認できたら、ポールベクターの設定は完了です。

    ▲ポールベクターで脚IKの関節方向を制御できるようになった

    今回のまとめ

    長くなってきたので今回はここまで。

    ・命名規則を決めよう
    ・基本はFKセットアップ
    ・Local空間、World空間を使いこなそう
    ・IKのしくみを理解しよう

    次回はボディリグの仕上げを目指します。引き続きどうぞよろしくお願いします。

    ※記事のご感想、リクエストなどお待ちしています!

    Lee

    ゲーム会社でコンシューマタイトルの開発に携わる傍ら、自主制作ゲームの進捗やCG作品などをTwitterで日々ゆるく発信している。インディーゲーム『ヤマふだ!』シリーズのグラフィック全般を担当。

    X(旧Twitter):@leedoppo

    TEXT_Lee
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)