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

第1回では『流流』の紹介と、リグとモーションについて筆者の大まかな考えを述べました。今回から具体的な解説に踏み込んでいきますが、初心者向けのカジュアルな内容です。コーヒーを片手に気楽にお読みください。

記事の目次

    Lee

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

    X(旧Twitter):@leedoppo

    はじめに

    改めましてこんにちは、Leeと申します。私がプライベートでコツコツ作り続けているオリジナル3Dキャラクター『流流』をCGWORLD vol.295(2023年3月号)で取り上げていただいたのをきっかけに、今回、本誌では書ききれなかった内容をWeb記事で連載する運びとなりました。

    第1回記事で紹介したものからモデル、リグ共にバージョンアップした『流流』。本連載は新バージョンに沿って解説する

    本連載では、

    自分のキャラクターを動かしてみたい人
    これからリグとモーションを勉強したい人

    を主な対象に、3DCGキャラクターのリギングとモーションについて解説していきたいと思います。モデルは作ってみたけどその先がわからない、難しそうでなかなか手が出せない……そのような初心者さんの目線に立って基本的な部分から解説します。

    使用ツールはMayaですが、単なるオペレーションの説明ではなく考え方を中心に、Mayaユーザー以外の方でも読める内容を目指しています。

    本記事を導入として、世の中に数多くある有益な書籍、記事、動画などにステップアップして知見を広げていただければと思います。経験者にとっては技術的に目新しい内容はないかもしれませんが、私の制作事例と考え方が少しでも参考になれば幸いです。

    Topic 1:キャラクターが生まれる理由

    この記事を読んでくれているあなたは、少なからず3DCGキャラクター制作に関心があるのだと思います。そこで今一度、自分はどうしてキャラクターを作るのか考えてみてください。

    ユーザーにキャラクターを操作してもらいたい、作品中で活躍する姿を見てもらいたい、アバターになりきって自ら演じたい……つまり「動かしたい」からではないでしょうか。たとえ静止画作品だとしてもポージングでキャラクターの魅力を表現するはずです。全てのキャラクターは動かすためにつくられるといって良いでしょう。

    私は仕事柄、誰かのポートフォリオを拝見する機会が多いのですが、せっかくのキャラクターモデルがバインドポーズ(T/Aスタンス)のままだったり、ほぼ素立ちで撮影された作品紹介をしばしば目にします。

    これ、非常にもったいないと感じます。どんなにこだわってモデリングされていても魅力半減です。逆に、見せ方さえ良ければ多少のモデリングの粗は補えてしまうのです。

    • ▲バインドポーズ
    • ポーズをつけた

    Topic 2:リギングを始める前に

    リギングとは

    リギングとは、モーション制作のための準備(セットアップ)工程のひとつです。

    ▲3Dキャラクターの大まかなワークフロー。リギングはモデリングとモーションの中間工程に位置する。モデラーやアニメーターが兼任する場合もあれば、スキニングからまとめてセットアップを担う専門のリガーがいる場合もある

    キャラクターのスケルトン作成、スキニング、リギングまでの工程をまとめて「セットアップ」と呼びます。

    フロー図の通りキャラクター制作とは連続的な工程であり、担当外であっても前後工程の知識は無関係ではありません。モデラーやアニメーターもセットアップについて理解しておくことで、よりクオリティが高く扱いやすいデータを作ることができるようになります。

    なお、本連載ではリギング以降の解説を行うため、スケルトンにスキンバインドされたモデルがある前提で進めます。

    リグの計画

    リグによってキャラクター操作の効率化はできても、ジョイントのない部分は変形できません。動かしたい箇所はジョイント配置の時点で考慮しておく必要があります。リギング途中でスケルトンに変更を加えることはもちろん可能ですが、場合によっては非常に面倒な作業になります。

    良いリグは良いジョイント配置から。ジョイントが正しく設定できたら、セットアップ工程の半分は達成できたと言っても良いでしょう。

    ▲流流のスケルトン。ごくシンプルな構成。ベンドやストレッチは想定しておらず、補助骨は腕と脚にのみ追加している

    リグは道具なので使用目的に沿って設計されるべきです。つまりキャラクターがどんな使われ方をするか、どのように動かしたいのかを考えてみます。

    例えば、流流は様々な格闘アクションを演じさせるためのキャラクターモデルです。アクティブなポーズが無理なく作れるような可動性が必要になります。

    また、アニメっぽいルックながら地に足のついた堅実な演技をイメージしていたため、カートゥーンキャラクターのようなスケール機能は省き、何より私自身が気楽にアニメーションを作成できるよう、コントローラ数もなるべく減らしてシンプルにしました。

    ▲流流のリグ。有識者からすれば特筆すべきこともないローテクなリグだが、自身が使いやすければ問題ない。フェイシャルリグはもともとジョイントセットアップだったが、バージョンアップと共にブレンドシェイプメインに作り替えた

    細かい機能は後からでも追加できます。いざとなれば最初から組み直しても良いです。初心者であれば最初からあれもこれもと詰め込んで挫折するよりも、まずはシンプルでも良いので1体完成させてみることが重要だと考えています。

    むしろ多機能すぎるリグは制作コストだけでなく使用者の心的ハードルやモーション作業の負荷も上げてしまいます。機能追加を検討する際は、その機能の使用頻度や重要度をよく考えるべきです。

    一例として、流流が腕をブンブン振り回す動きを作るために即席の外部リグをつけ足したことがありました。筆者が大好きなドニー・イェンがアクション映画でよくやる動きのオマージュなのですが、普段こんなモーションを作る機会はなかなかないと思います。つまりリグの標準機能としては不要ということになります。

    ▲即席の外部リグで円運動の半径や回転数を制御しやすくした例。アニメーターにとってもこの程度のリギング知識は必須と言える

    ただし、ここで言う使用頻度は絶対的なものではなく、モーションの演技内容、キャラクター設定、アニメーターの制作スタイルなどで欲しい機能は変わります。だからこそリギングの計画が重要と言えます。

    Topic 3:キャラクターの構成要素

    下の画像は、ゲームなどのリアルタイム向けキャラクターの一般的な構造です。第1回でも簡単に解説しましたが、大事なところなので改めて整理します。

    リアルタイム向けキャラクターの構造例。左からジオメトリ、バインドスケルトン、中間スケルトン、リグ

    リアルタイム向けモデルでは実行環境(ゲームエンジンなど)に不要な部分を切り分けられるよう、各構造を分けて制作します。Mayaで組んだリグ構造そのままが実行環境で再現できるわけではないので、余分なデータで容量を喰ってしまわないようにします。

    大まかには出力グループとそれ以外に分かれ、出力グループにはジオメトリとデフォーマとなるバインドスケルトンやモーフ情報が含まれます。その他の要素は出力グループに含めないように注意します。

    スケルトン

    リギングを解説するには専門用語は避けられません。ツールや文化によって表記がバラつくことも多いため、本連載における用語を定義します。

    まずは骨格について。ツールによって構成要素が異なるので呼び名が紛らわしい部分でもあります。Mayaにおける骨格の最小単位がジョイントです。ジョイントはその名の通り関節の機能をもつ球状の見た目をしたオブジェクトです。

    2つのジョイントをペアレント(親子付け)すると、親から子に向かってボーンが描かれます。いわゆる骨らしい見た目ですがボーンに実体はなく、実際に動かすのはジョイントの方です。

    複数のボーンが連なった部分をジョイントチェーン、キャラクター全身のジョイントの集合体をスケルトンと呼びます。

    ▲スケルトンの命名

    リグ

    アニメーション作業で直接操作するオブジェクトをコントローラと呼びます。そして、複数のコントローラや様々な制御用ノードで構成されたキャラクターを動かすためのしくみをリグと呼びます。

    コントローラ自体をリグと呼ぶ場合も珍しくありませんが、ここでは明確にコントローラとリグを使い分けて説明していきます。

    • ▲アニメーターが直接操作し、キーを設定するオブジェクトがコントローラ。それらが集まった制御構造全体をリグと呼ぶ
    • ▲ハンドリグ、フェイシャルリグなど、部位別のまとまりをリグと呼ぶ場合もある

    Topic 4:FKとIK

    スケルトンを動かす方法には、大きく分けて以下の2つがあります。

    FK

    Forward Kinematics(順運動学)」の略称。各ジョイントの角度を指定して制御する方法です。可動式フィギュアを想像するとわかりやすいでしょうか。例えば腕のポーズを作る場合は肩→肘→手首→指と根元から順にジョイント角度を決めていきます。

    ▲FKのアニメーション補間は弧を描く。人体の関節運動に近いので自然な動きを作りやすく、腕を振るなどの回転運動に適している。各関節を制御するため、ポーズを決めるまでの手数やポーズ修正の手間はどうしても増えてしまう

    IK

    Inverse Kinematics(逆運動学)」の略称。スケルトンの先端のジョイント位置を決めると、そこに至るジョイント角度が自動計算されます。腕にIKをセットアップした場合は、手首の位置を基に肘と肩のジョイント角度が決まります。

    ▲IKのアニメーション補間は直線的な動き。ポーズが素早く作れる、IKの先端(足先など)の位置を空間に固定しやすいなどのメリットがある反面、IKで滑らかな曲線運動を作るにはFKよりも多くのキーが必要で、CGならではの硬い動きになりやすい

    基本的には上記どちらかの方式、あるいは両方切り替えられるかたちでコントローラをセットアップすることになります。

    Topic 5:コントローラ

    コントローラとなるオブジェクトには「NURBSカーブ」を使います。稀にメッシュやロケータをコントローラとして使用しているリグも見かけますが、表示/非表示の容易さ、軽さ、選択しやすさなどからNURBSカーブを使うのが間違いありません。

    本題のカーブの作り方については、[Create → NURBS Primitives]から生成できるカーブプリミティブのほとんどはコントローラ用途として使いづらいため、別の方法で作成することになります。世に配布されているNURBSカーブ生成ツールを利用するのが手っ取り早いですが、自力で任意の形状を作る方法を説明します。

    ▲NURBS Primitives内のCircle、Squareカーブ。プリミティブで使いやすいのはこの2つのみ

    バラバラのカーブをまとめる

    プリミティブの「Square」をアウトライナで見ると、4つのカーブに分かれています。

    コントローラとして扱うためには1つのオブジェクトにまとめたいです。以下の手順で複数カーブを1つのカーブにまとめることができます。

    ▲ 【1】アウトライナの[Display → Shapes]にチェックを入れて、アウトライナでシェイプノードが表示されるようにします
    ▲ 【2】分割された各カーブのシェイプノード[○○○Shape1]を[Ctrl]キー+クリックで複数選択→最後に一番親のTransformノードを選択
    【3】MELのコマンドラインに「parent -s -r」と記述してEnterで実行すると、別々のTransformノード配下に分かれていたシェイプノードが同じ親Tranformノードの子にペアレントされる。不要になった空のTranfromtノードは削除し、再びアウトライナの[DisplayShapes]のチェックを外して完了

    ポリゴンメッシュと同じ形状のカーブを作る

    次に、ポリゴンメッシュに沿ってカーブを形成する手順を説明します。例としてCube形状のカーブオブジェクトを作ってみます。

    ▲【1】[CreatePolygon PrimitivesCube]でガイドとなるCubeのポリゴンメッシュを作る
    ▲【2】[Create → Curve Tools → EP Curve Tool]でEPカーブツールオプションを開き、Curve degree(カーブの次数)を 1 Linear に設定する
    ▲【3】Cubeの全ての辺をなぞるように頂点スナップ([V])しながらエディットポイントを打つ。一筆書きでなく、同じ頂点を複数回通っても問題ない
    ▲【4】必要なポイントを打ち終わったら[Enter]でツール終了。カーブが生成される。ガイドのCubeは不要なので削除する。少々手間はかかるものの、このやり方で任意形状のカーブオブジェクトを作ることができる

    毎回作るのは大変なので、作成したカーブオブジェクトは今後も使い回せるように別シーンで保存しておくと良いでしょう。

    配色でもっと使いやすく

    最後にカーブに色をつけます。カーブを選択し、[Attribute Editor○○○ShapeObject DisplayDrawing Override]の[Enable Overrides]にチェックを入れ、色を指定します。

    ただ見た目をカラフルにするのではなく、リグの使い勝手を意識します。FKメインのコントローラは赤色、IKメインのコントローラは青色、複合コントローラは黄色……といったように一貫性をもったルールで配色しましょう。

    ▲着色したNURBSカーブ。Indexカラーだけでも十分な種類が選べる。色にこだわる場合はRGBで細かく指定しても良い。筆者の場合、目に優しいペールトーン中心の配色が好み

    Topic 6:ペアレントとコンストレイント

    リギングとは「AでBを操作する」という設定の積み重ねのようなものです。例えばコントローラでジョイントを動かせるようにするために両者の追従設定が必要になります。その方法は様々ですが、まずは以下の2つを覚えてください。

    ペアレント

    今さら……と思われるかもしれませんが、ペアレント(親子付け)はリギングでは非常に重要なので改めて正しく理解してください。

    ペアレントとは、あるTransformノードを別のTransformノードの子にする、つまり階層化することを言います。アウトライナ上でMMB(マウス中ボタン)ドラッグ、または子にするTransformノード(複数選択可)→親にするTransformノードの順に選択して[EditParent](または[p]キー)でペアレントできます。基本ですね。親のTransform(位置、向き、スケール)は子に伝達します。

    • ▲pCone1(円錐)の子にpTorus1(円環)をペアレントした
    • ▲親のpCone1を動かすと子のpTorus1も追従する

    ワールド空間とローカル空間

    ペアレントに関するもう1つの大事な要素、座標系について説明します。

    ワールド空間はシーン原点を基準にした座標系です。一方、ローカル空間は階層の親ノードの原点と軸を基準にした座標系です。親をもたないオブジェクトのローカル空間=ワールド空間になります。ちなみにアトリビュートエディタに表示されているのはローカル空間の値です。

    親(pCone1)を動かした状態でアトリビュートエディタで子(pTorus1)の値を見ると、親を動かす前と値が変化していないことに注目してください。親に対して子の姿勢が変化していないため、値は変化しないというわけです。これら座標系の違いはリギングにとって超大事な要素です。

    • ▲ワールド空間ではシーン原点を基準にTransformの値が決まる
    • ▲ローカル空間では親を基準に子の値が決まる。例えば親とまったく同じ原点、軸にいる子のローカル空間値は画像のように全て0(Scaleは1)になる

    コンストレイント

    ペアレントによって子を制御できることはわかりました。しかし Topic 3:キャラクターの構成要素で説明した通り、出力グループに含まれるバインドスケルトンとリグは必ず階層を分ける必要があります。階層に縛られない制御方法が必要です。

    その1つがコンストレイントです。Constraint(拘束)の名の通りオブジェクト同士を一定の法則で拘束するMayaの機能です。コンストレイントを設定するには、拘束元(ターゲット)となるオブジェクト→被拘束オブジェクトの順に選択し、Animation/Riggingメニューセットの[Constrain]から設定したコンストレイントを選択します。

    拘束方法にはいくつか種類があるので、使い分けてリギングします。

    Parent:位置と向きを拘束
    Point:位置を拘束
    Orient:向きを拘束
    Scale:スケールを拘束
    Aim:他オブジェクトの方向に拘束

    ※各詳細は公式ヘルプで丁寧に図解されています。

    コンストレイントのオフセット保持

    普通にコンストレイントを設定すると、被拘束オブジェクトはターゲットオブジェクトの姿勢に完全一致します。これを利用して位置合わせができて便利なのですが、オブジェクト同士の相対関係を維持したまま拘束したい場面もあります。その場合は各コンストレイント項目のオプションの[Maintain offset]にチェックを入れてコンストレイント実行します。

    Topic 7:リギング練習

    木人椿(流流が使用している中国武術の鍛錬器具)のセットアップを通して、シンプルなFKコントローラの作り方を説明します。

    • ▲木人椿のデザイン画。流流の祖父の部屋に置かれている設定
    • ▲今回リギングするモデル。今回は3本の腕をセットアップする

    コントローラ作成

    木人椿の腕を制御するリグを作りましょう。まずはコントローラとなるNURBSカーブを作ります。今回はCubeを使います。

    ひとまず作ったカーブの名前を「Con_R_Arm」にリネームします。ノード命名規則は次回でまとめる予定です。

    ▲腕のコントローラとなるカーブオブジェクト。リギングしながらリネームする癖をつけておくと作業も捗る。未来の自分のためにもシーン整理に気を配ろう

    オフセットノード作成

    「Con_R_Arm」を選択した状態で[Ctrl+G]でグループ化し、作られたTransformノードを「Off_R_Arm」にリネームします。

    Off_R_Arm
    └ Con_R_Arm

    という構成になります。親の「Off_R_Arm」のおかげで、親を動かしている限り子の「Con_R_Arm」のローカル値を常に 0 に保つことができます。値を相殺=オフセットする役割なので「オフセットノード」と呼びます。そして、コントローラとグループノードの組み合わせを「コントローラセット」と呼びます。全てのコントローラは必ずこのペアで存在するようにします。

    ▲親のオフセットノードによって子のコントローラのローカル値は 0 に保たれる。こうして全コントローラの初期値を 0 にしておくことで、モーション作業時に簡単に初期ポーズに戻しやすくなるメリットがある

    姿勢合わせ

    制御したいジョイントにコントローラセットの姿勢を合わせます。このとき、コントローラ(Con)ではなく親のオフセット(Off)ごと合わせることに注意してください。

    姿勢を合わせるノード(オフセット)→合わせる対象(ジョイント)の順に選択し、[ModifyMatch TransformationsMatch Translateion/Match Rotation]で移動と回転を一致させます。カーブのエディットポイントを編集して木人椿の腕の形状に合わせてやると、もっと使いやすくなるかもしれません。このへんはお好みです。

    カーブ形状が整ったら、R_Armのコントローラセットを複製し、他2本の腕にも同様に姿勢合わせします。

    • ▲Arm1のジョイント「Jnt_R_Arm」に姿勢を合わせたコントローラセット
    • ▲3本の腕にそれぞれコントローラセットを配置した状態

    接続

    各コントローラと対応するジョイントをコンストレイントで接続します。

    Con_R_Arm→Jnt_R_Arm
    Con_L_Arm→Jnt_L_Arm
    Con_C_Arm→Jnt_C_Arm

    と、それぞれ順に選択してオリエントコンストレイントを実行し、ジョイントの回転をコントローラに拘束します。

    ▲コントローラーでジョイントを動かせるようになった

    これで3本の腕をFK制御できるようになりました。これが最もシンプルなFKコントローラのセットアップになります。

    今回のまとめ

    今回はここまでになります。以下、内容を整理します。

    キャラクターは動かすためにつくる!
    リグを組み立てる前に計画しよう!
    リアルタイム向けキャラクターは出力体とリグを分ける!
    リギングに必要な基本知識を理解しよう!
    まずはシンプルなリグからはじめよう!

    次回からいよいよボディリグの構築が始まります。ややこしい手順が増えますが、初めての方でも理解できるようになるべく簡単にまとめていきますので、引き続きどうぞよろしくお願いします。

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

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