本連載は、筆者のオリジナルキャラクター『流流(るる)』を題材に、リアルタイム向けのシンプルなリグとモーション制作について紹介していきます!
第1回では『流流』の紹介と、リグとモーションについて筆者の大まかな考えを述べました。今回から具体的な解説に踏み込んでいきますが、初心者向けのカジュアルな内容です。コーヒーを片手に気楽にお読みください。
Lee
ゲーム会社でコンシューマタイトルの開発に携わる傍ら、自主制作ゲームの進捗やCG作品などをTwitterで日々ゆるく発信している。インディーゲーム『ヤマふだ!』シリーズのグラフィック全般を担当。
X(旧Twitter):@leedoppo
はじめに
改めましてこんにちは、Leeと申します。私がプライベートでコツコツ作り続けているオリジナル3Dキャラクター『流流』をCGWORLD vol.295(2023年3月号)で取り上げていただいたのをきっかけに、今回、本誌では書ききれなかった内容をWeb記事で連載する運びとなりました。
本連載では、
・自分のキャラクターを動かしてみたい人
・これからリグとモーションを勉強したい人
を主な対象に、3DCGキャラクターのリギングとモーションについて解説していきたいと思います。モデルは作ってみたけどその先がわからない、難しそうでなかなか手が出せない……そのような初心者さんの目線に立って基本的な部分から解説します。
使用ツールはMayaですが、単なるオペレーションの説明ではなく考え方を中心に、Mayaユーザー以外の方でも読める内容を目指しています。
本記事を導入として、世の中に数多くある有益な書籍、記事、動画などにステップアップして知見を広げていただければと思います。経験者にとっては技術的に目新しい内容はないかもしれませんが、私の制作事例と考え方が少しでも参考になれば幸いです。
Topic 1:キャラクターが生まれる理由
この記事を読んでくれているあなたは、少なからず3DCGキャラクター制作に関心があるのだと思います。そこで今一度、自分はどうしてキャラクターを作るのか考えてみてください。
ユーザーにキャラクターを操作してもらいたい、作品中で活躍する姿を見てもらいたい、アバターになりきって自ら演じたい……つまり「動かしたい」からではないでしょうか。たとえ静止画作品だとしてもポージングでキャラクターの魅力を表現するはずです。全てのキャラクターは動かすためにつくられるといって良いでしょう。
2023年上半期まとめ #流流 pic.twitter.com/2ALBZu9KXf
— Lee (@leedoppo) June 30, 2023
私は仕事柄、誰かのポートフォリオを拝見する機会が多いのですが、せっかくのキャラクターモデルがバインドポーズ(T/Aスタンス)のままだったり、ほぼ素立ちで撮影された作品紹介をしばしば目にします。
これ、非常にもったいないと感じます。どんなにこだわってモデリングされていても魅力半減です。逆に、見せ方さえ良ければ多少のモデリングの粗は補えてしまうのです。
Topic 2:リギングを始める前に
リギングとは
リギングとは、モーション制作のための準備(セットアップ)工程のひとつです。
キャラクターのスケルトン作成、スキニング、リギングまでの工程をまとめて「セットアップ」と呼びます。
フロー図の通りキャラクター制作とは連続的な工程であり、担当外であっても前後工程の知識は無関係ではありません。モデラーやアニメーターもセットアップについて理解しておくことで、よりクオリティが高く扱いやすいデータを作ることができるようになります。
なお、本連載ではリギング以降の解説を行うため、スケルトンにスキンバインドされたモデルがある前提で進めます。
リグの計画
リグによってキャラクター操作の効率化はできても、ジョイントのない部分は変形できません。動かしたい箇所はジョイント配置の時点で考慮しておく必要があります。リギング途中でスケルトンに変更を加えることはもちろん可能ですが、場合によっては非常に面倒な作業になります。
良いリグは良いジョイント配置から。ジョイントが正しく設定できたら、セットアップ工程の半分は達成できたと言っても良いでしょう。
リグは道具なので使用目的に沿って設計されるべきです。つまりキャラクターがどんな使われ方をするか、どのように動かしたいのかを考えてみます。
例えば、流流は様々な格闘アクションを演じさせるためのキャラクターモデルです。アクティブなポーズが無理なく作れるような可動性が必要になります。
また、アニメっぽいルックながら地に足のついた堅実な演技をイメージしていたため、カートゥーンキャラクターのようなスケール機能は省き、何より私自身が気楽にアニメーションを作成できるよう、コントローラ数もなるべく減らしてシンプルにしました。
細かい機能は後からでも追加できます。いざとなれば最初から組み直しても良いです。初心者であれば最初からあれもこれもと詰め込んで挫折するよりも、まずはシンプルでも良いので1体完成させてみることが重要だと考えています。
むしろ多機能すぎるリグは制作コストだけでなく使用者の心的ハードルやモーション作業の負荷も上げてしまいます。機能追加を検討する際は、その機能の使用頻度や重要度をよく考えるべきです。
一例として、流流が腕をブンブン振り回す動きを作るために即席の外部リグをつけ足したことがありました。筆者が大好きなドニー・イェンがアクション映画でよくやる動きのオマージュなのですが、普段こんなモーションを作る機会はなかなかないと思います。つまりリグの標準機能としては不要ということになります。
腕のFKで頑張って動かしても良いんだけど、こうやるとアニメカーブ1本で制御できるので回転数や緩急を調整しやすいです pic.twitter.com/LtZYPPevwY
— Lee (@leedoppo) October 2, 2023
ただし、ここで言う使用頻度は絶対的なものではなく、モーションの演技内容、キャラクター設定、アニメーターの制作スタイルなどで欲しい機能は変わります。だからこそリギングの計画が重要と言えます。
Topic 3:キャラクターの構成要素
下の画像は、ゲームなどのリアルタイム向けキャラクターの一般的な構造です。第1回でも簡単に解説しましたが、大事なところなので改めて整理します。
リアルタイム向けモデルでは実行環境(ゲームエンジンなど)に不要な部分を切り分けられるよう、各構造を分けて制作します。Mayaで組んだリグ構造そのままが実行環境で再現できるわけではないので、余分なデータで容量を喰ってしまわないようにします。
大まかには出力グループとそれ以外に分かれ、出力グループにはジオメトリとデフォーマとなるバインドスケルトンやモーフ情報が含まれます。その他の要素は出力グループに含めないように注意します。
スケルトン
リギングを解説するには専門用語は避けられません。ツールや文化によって表記がバラつくことも多いため、本連載における用語を定義します。
まずは骨格について。ツールによって構成要素が異なるので呼び名が紛らわしい部分でもあります。Mayaにおける骨格の最小単位が「ジョイント」です。ジョイントはその名の通り関節の機能をもつ球状の見た目をしたオブジェクトです。
2つのジョイントをペアレント(親子付け)すると、親から子に向かって「ボーン」が描かれます。いわゆる骨らしい見た目ですがボーンに実体はなく、実際に動かすのはジョイントの方です。
複数のボーンが連なった部分を「ジョイントチェーン」、キャラクター全身のジョイントの集合体を「スケルトン」と呼びます。
リグ
アニメーション作業で直接操作するオブジェクトを「コントローラ」と呼びます。そして、複数のコントローラや様々な制御用ノードで構成されたキャラクターを動かすためのしくみを「リグ」と呼びます。
コントローラ自体をリグと呼ぶ場合も珍しくありませんが、ここでは明確にコントローラとリグを使い分けて説明していきます。
Topic 4:FKとIK
スケルトンを動かす方法には、大きく分けて以下の2つがあります。
FK
「Forward Kinematics(順運動学)」の略称。各ジョイントの角度を指定して制御する方法です。可動式フィギュアを想像するとわかりやすいでしょうか。例えば腕のポーズを作る場合は肩→肘→手首→指と根元から順にジョイント角度を決めていきます。
IK
「Inverse Kinematics(逆運動学)」の略称。スケルトンの先端のジョイント位置を決めると、そこに至るジョイント角度が自動計算されます。腕にIKをセットアップした場合は、手首の位置を基に肘と肩のジョイント角度が決まります。
基本的には上記どちらかの方式、あるいは両方切り替えられるかたちでコントローラをセットアップすることになります。
Topic 5:コントローラ
コントローラとなるオブジェクトには「NURBSカーブ」を使います。稀にメッシュやロケータをコントローラとして使用しているリグも見かけますが、表示/非表示の容易さ、軽さ、選択しやすさなどからNURBSカーブを使うのが間違いありません。
本題のカーブの作り方については、[Create → NURBS Primitives]から生成できるカーブプリミティブのほとんどはコントローラ用途として使いづらいため、別の方法で作成することになります。世に配布されているNURBSカーブ生成ツールを利用するのが手っ取り早いですが、自力で任意の形状を作る方法を説明します。
バラバラのカーブをまとめる
プリミティブの「Square」をアウトライナで見ると、4つのカーブに分かれています。
コントローラとして扱うためには1つのオブジェクトにまとめたいです。以下の手順で複数カーブを1つのカーブにまとめることができます。
ポリゴンメッシュと同じ形状のカーブを作る
次に、ポリゴンメッシュに沿ってカーブを形成する手順を説明します。例としてCube形状のカーブオブジェクトを作ってみます。
毎回作るのは大変なので、作成したカーブオブジェクトは今後も使い回せるように別シーンで保存しておくと良いでしょう。
配色でもっと使いやすく
最後にカーブに色をつけます。カーブを選択し、[Attribute Editor → ○○○Shape → Object Display → Drawing Override]の[Enable Overrides]にチェックを入れ、色を指定します。
ただ見た目をカラフルにするのではなく、リグの使い勝手を意識します。FKメインのコントローラは赤色、IKメインのコントローラは青色、複合コントローラは黄色……といったように一貫性をもったルールで配色しましょう。
Topic 6:ペアレントとコンストレイント
リギングとは「AでBを操作する」という設定の積み重ねのようなものです。例えばコントローラでジョイントを動かせるようにするために両者の追従設定が必要になります。その方法は様々ですが、まずは以下の2つを覚えてください。
ペアレント
今さら……と思われるかもしれませんが、ペアレント(親子付け)はリギングでは非常に重要なので改めて正しく理解してください。
ペアレントとは、あるTransformノードを別のTransformノードの子にする、つまり階層化することを言います。アウトライナ上でMMB(マウス中ボタン)ドラッグ、または子にするTransformノード(複数選択可)→親にするTransformノードの順に選択して[Edit → Parent](または[p]キー)でペアレントできます。基本ですね。親のTransform(位置、向き、スケール)は子に伝達します。
ワールド空間とローカル空間
ペアレントに関するもう1つの大事な要素、座標系について説明します。
ワールド空間はシーン原点を基準にした座標系です。一方、ローカル空間は階層の親ノードの原点と軸を基準にした座標系です。親をもたないオブジェクトのローカル空間=ワールド空間になります。ちなみにアトリビュートエディタに表示されているのはローカル空間の値です。
親(pCone1)を動かした状態でアトリビュートエディタで子(pTorus1)の値を見ると、親を動かす前と値が変化していないことに注目してください。親に対して子の姿勢が変化していないため、値は変化しないというわけです。これら座標系の違いはリギングにとって超大事な要素です。
コンストレイント
ペアレントによって子を制御できることはわかりました。しかし Topic 3:キャラクターの構成要素で説明した通り、出力グループに含まれるバインドスケルトンとリグは必ず階層を分ける必要があります。階層に縛られない制御方法が必要です。
その1つがコンストレイントです。Constraint(拘束)の名の通りオブジェクト同士を一定の法則で拘束するMayaの機能です。コンストレイントを設定するには、拘束元(ターゲット)となるオブジェクト→被拘束オブジェクトの順に選択し、Animation/Riggingメニューセットの[Constrain]から設定したコンストレイントを選択します。
拘束方法にはいくつか種類があるので、使い分けてリギングします。
・Parent:位置と向きを拘束
・Point:位置を拘束
・Orient:向きを拘束
・Scale:スケールを拘束
・Aim:他オブジェクトの方向に拘束
※各詳細は公式ヘルプで丁寧に図解されています。
コンストレイントのオフセット保持
普通にコンストレイントを設定すると、被拘束オブジェクトはターゲットオブジェクトの姿勢に完全一致します。これを利用して位置合わせができて便利なのですが、オブジェクト同士の相対関係を維持したまま拘束したい場面もあります。その場合は各コンストレイント項目のオプションの[Maintain offset]にチェックを入れてコンストレイント実行します。
Topic 7:リギング練習
木人椿(流流が使用している中国武術の鍛錬器具)のセットアップを通して、シンプルなFKコントローラの作り方を説明します。
コントローラ作成
木人椿の腕を制御するリグを作りましょう。まずはコントローラとなる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 に保つことができます。値を相殺=オフセットする役割なので「オフセットノード」と呼びます。そして、コントローラとグループノードの組み合わせを「コントローラセット」と呼びます。全てのコントローラは必ずこのペアで存在するようにします。
姿勢合わせ
制御したいジョイントにコントローラセットの姿勢を合わせます。このとき、コントローラ(Con)ではなく親のオフセット(Off)ごと合わせることに注意してください。
姿勢を合わせるノード(オフセット)→合わせる対象(ジョイント)の順に選択し、[Modify → Match Transformations → Match Translateion/Match Rotation]で移動と回転を一致させます。カーブのエディットポイントを編集して木人椿の腕の形状に合わせてやると、もっと使いやすくなるかもしれません。このへんはお好みです。
カーブ形状が整ったら、R_Armのコントローラセットを複製し、他2本の腕にも同様に姿勢合わせします。
接続
各コントローラと対応するジョイントをコンストレイントで接続します。
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)