『古代の谷』 に登場するロボットのアニメートとリギング

こんにちは、Jeremiah Grant と申します。Epic Games の Technical Product Manager として、エンジンのアニメート機能を担当しています。このブログ記事では、 UE5 早期アクセス プロジェクト 『古代の谷』 のラストで登場する巨大ロボット『古きもの』(The Ancient One)を題材に、リギングとアニメートで使用する考え方、実装、ツールについて解説します。古きものは Aaron Sims Creative Company との強力なコラボレーションによって生み出されました。そのデザインは Nanite と Unreal Engine 5 早期アクセスからアニメートの威力を 100% 引き出し、アニメーションやリギング システムの限界を押し上げます。

ぜひ詳しくご覧ください。
 

ブループリントを構築する

古きものの構想では、Nanite を利用してクリーチャーの幾何学的詳細を高めることを想定していました。そのため、デザインとワークフローで考慮すべきことが、いくつも発生しました。このロボットのデザインは、 スケルタル メッシュ や従来のスキニングに頼らずに、高解像度の Nanite メッシュを強固に連結し、それを ブループリント でスケルトンにアタッチしています。つまり、連結するすべての要素に独自のメッシュが必要で、さらに混乱を避けるためには適切な組織化が不可欠です。

この組織化の課題に対処するために、わかりやすい命名スキームとフォルダ構造という、レベルの構築と似たアプローチを採用しました。それぞれのメッシュ要素が特定の命名パターンに従い、それはスケルトンを構成するボーンの名前に対応しています。ジオメトリとマテリアルも、頭、鎖骨、脚など、ボディの領域ごとにフォルダで組織化し、プロジェクトの構造をナビゲートしやすく維持しました。このアプローチを採用したことで、 BP_AncientOne の簡潔な関数でジオメトリをスケルトンにアタッチする方法をすばやく導き出せました。さらに、新しいジオメトリとボーンを追加した際は、同じ関数によって自動的にアタッチできます。

この AttachMeshesToRig 関数は、ブループリントの BodyParts が含むすべての子コンポーネントに対して、反復的に Attach Component to Component を使用します。また、リグに新しいジオメトリを追加するために、ジオメトリを UE にインポートし、[BodyParts] コンポーネント配下にドラッグしました。
BP_AncientOne の Attach Meshes to Rig 関数。

スケルトン

このスケルトン自体は MetaHuman から派生したもので、同じ基本階層を活用しつつ、指の数を減らし、ツイストなどの補正ボーンを削除しました (AncientOne_skeleton_Skeleton)。そして Maya でスケルトンのプロポーションを適切に変更し、Unreal でシンプルなキューブでスキニングして、Nanite メッシュをアタッチできるようにスケルタル メッシュを生成しました。ベースに MetaHuman のスケルトンを使用しているため、UE で MetaHuman のコントロールリグをすぐに利用してアニメートを開始できます。また、このロボットは MetaHuman と同じプロポーションで構築してからエンジンでスケーリングしたので、アニメーションやスケルトンに大きな影響を与えずにキャラクターを簡単にイテレーションできます。この方法は、環境のスケーリングやキャラクターの操作を模索する際に、大きな柔軟性を発揮します。
メッシュをすべてアタッチした古きもののスケルトン。

コントロールリグ

現在の UE5 早期アクセスでは、スタティック メッシュや Nanite メッシュを コントロールリグ エディタでビジュアル化できません。そこでコントロールリグを常に評価するために、リグをレベルに配置してからコントロールリグに変更を加え、リグのテストを行いました。リグの変更はコンパイルによって更新と伝播が実行されるため、5000 万もの三角ポリゴン メッシュのリグに関するパフォーマンスを、リアルタイムでビジュアル化し、テストできます。 
左:レベル エディタ。右:コントロールリグ エディタ。
このロボットのコントロールリグを制作する際は、MetaHuman プロジェクトのコントロールリグから出発して、いくつかの変更を加えました:AncientOne_Body_CtrlRig。まず、リグの階層構造とプレビュー メッシュを、新しいジオメトリに更新しました。リグの階層構造は、右クリックして [Refresh Hierarchy] を選択し、適切なスケルタル メッシュを選ぶことで更新できます。これによりスケルタル階層が更新したものと置き換わりますが、コントロール、スペース、カスタム ボーンなど、残りのリグ階層はできる限りそのまま維持します。

コントロールリグには、Setup Event、Forward Solve、Backward Solve という 3 つのモードがあります。MetaHuman のリグでは、Setup Event でコントロールをすべてインポートしたリグ階層に適合させ、このリグを再利用できるようにしました。この方法は、まずボーンの初期値を読み取り、コントロールのオフセット トランスフォームを設定して、最後にスケルトンの適切な位置にコントロールを配置します。これはユーザーが生成するグラフなので、極ベクターの位置の定義、FK コントロールと IK コントロールの配置、グラフの後の処理で使用する初期値の設定など、複雑なアクションを実行できます。

MetaHuman のコントロールリグは左右対称のキャラクターなので、非対称のロボットに合わせるために少々調整を加えました。まず Setup Event グラフで Setup Left Arm セクションを複製し、フィールドに適切な情報を入力してから、それをグラフに接続します。さらに、Setup Event で最初に設定した変数を参照するように、Forward Solve と Backward Solve グラフの指のボーンを参照するアイテム コレクションを変更しました。この方法により、多くの箇所を変更することなく、キャラクターの開発で参照する指の数を簡単に変更できました。
IK、FK、極ベクター コントロールを配置した、左脚の Setup Event。
MetaHuman のベース コントロールリグに加えた変更以外にも、直接アニメートする装甲板のコントロールを追加しました。今回、アニメーション チームから受けた特別なリクエストは、腕のデフォルトを FK ではなく、IK にすることでした。これは arm_l_fk_ik_switchleg_l_fk_ik_switch など、IKFK ブール コントロールの Initial ブール値を変更するだけで、非常に簡単に達成できました。 

古きものには、プロシージャルな駆動が求められる内部メカニズムとモーションがたくさんあるため、アニメーターの作業量を減らし、シネマ品質のゲームプレイに必要なアニメーション コンテキストで、プロシージャルなアニメーションをテストできました。また、今回は MetaHuman のリグを拡張してキャラクターの自動駆動要素を追加するのではなく、プロシージャルに駆動するメカニズムを、すべて個別のコントロールリグに分割しました:AncientOne_Mechanics_CtrlRig。そして、このコントロールリグを、スケルタル メッシュの [Asset Details (アセット詳細)] で [Post Process Anim BP] 設定に割り当てたポスト プロセス アニメーション ブループリントに追加しました (AncientOne_Post_AnimBP)。ポスト プロセス アニメーション ブループリント の評価は、レベル シーケンスやステート マシンなど、他のすべてが処理された後で実行されます。そのため、リグをシーケンサーでアニメートしているかどうか、発砲アニメーションを再生しているかどうかにかかわらず、すべてのプロシージャル アニメーションが再生されます。
 
プロシージャルにアニメートされた、アーム ピストン、歯車、腰のアーマーなど。

Unreal Engine 5 早期アクセス では、コントロールリグに関数が導入されました。これにより、関数でリグのビヘイビアを異なるパーツに分割することで、このロボットの例では肩と胸のピストンのように、非常に簡単に再利用できます。

関数で構造化する方法について clavicle_pistons 関数に注目しましょう。この関数はアイテム コレクションを 2 つ受け取り、1 つはピストンの始点ボーン、もう 1 つはピストンの終点ボーンに対応します。内部処理では、始点と終点の各ボーンを名前で照合し、お互いが向かい合うように設定しています。ループによってすべてのアイテムを処理した後で、この関数は最終ポーズを返し、その後でリグ グラフの次のノードに処理が移ります。この関数を他のピストン グループでも再利用することで、グラフが短く、読みやすくなり、問題が発生しても 1 か所の修正で解決できます。
実際、この AncientOne_Mechanics_CtrlRig が含むピストン関数は、リグを構成するそれぞれのピストン グループで再利用されています。
このピストン関数は、受け取ったパフォーマンスに応じてポーズを調整する、グラフのわかりやすい例です。つまり、腕のアニメート状態に基づいてピストンのポーズを自動で決定します。他にも、コントロールリグ グラフで使用しているユースケースとして、core_gears 関数に注目しましょう。この関数は、中心の歯車とディスクに対して、時計のような振動運動をプロシージャルに実現しています。Accumulated Time ノードが生成した時間を別のノードに渡すことで、回転を駆動し、Sin ノードで振動運動を発生させています。さらに、このビヘイビアをより高度に制御するため、Accumulated Time ノードの Speed 値に渡す gear_weight 変数を公開し、このビヘイビアの無効化やブレンド オフをブループリントから設定できるようにしています。たとえばこのサンプルでは、古きものが敗北したときに、この変数を使用して歯車のモーションをブレンド オフしています。
このように core_gears 関数は、アートの方向性に合わせて歯車のモーションをプロシージャルに制御しています。

シーケンサーでのアニメート

『古代の谷』 の開発では、UE5 早期アクセスで古きもののパフォーマンスを、できるだけ多くアニメートさせるよう、常に心掛けました。幸いなことに、Unreal Engine のノンリニア アニメーション ツールである シーケンサー が最近大幅に進化したため、その威力をどこまで引き出せるのかを、このプロジェクトで確認できました。
 
進化を続けるユーティリティ セットを活用し、レベル エディタでアニメーション リグを操作します。

このロボットのアニメーション制作では、まず最初にレベル シーケンスをレベルに作成し、そこに 「BP_AncientOne」 を追加しました。ここで注意すべき要点は、このロボットを環境に配置し、スケールする際には、コントロールリグではなく、ワールドの [Details (詳細)] パネルからアクタ トランスフォームを利用していることです。次に、適切な配置を維持するように、シーケンサーにキーを設定しました。この方法によって、アニメーションのパフォーマンスに影響を与えずに、キャラクターのスケールを操作できます。さらに、そのアクタの位置とアニメーションが常に相対的になり、ゲームプレイ アニメーションやシネマティックの両端で原点を中心とした相対的な位置を維持します。これにより、レベル シーケンスとアニメーション ブループリント間で、前後のブレンドがシームレスになります。

レベル シーケンスの設定が完了したら、次にアニメートを開始します。コントロールリグのボディ アニメーション リグをシーケンサーに追加する際は、 BP_AncientOne で [+Track] をクリックし、[Control Rig] -> [Asset-Based Control Rig] -> [AncientOne_Body_CtrlRig] を順に選択します。コントロールリグのトラックを追加すると、レベル エディタ モードからアニメーション モードに自動で切り替わります。または、ビューポート上部のツールバーから「走っている人のアイコン」のクリックして、手動で切り替えることもできます。レベル シーケンスでトラックを展開すると、キーを設定できるコントロールのリストが表示され、さらに操作やアニメートを設定できるコントロールもビューポートに表示されます。
 
シーケンサーでロボットを設定する方法。

ここまでで、ロボットに適用するレベル シーケンスの基本的な設定方法を解説したので、次にゲームプレイ アニメーションのレベル シーケンスについて詳しく確認しましょう。これらのシーケンスは次のフォルダーから利用できます:/AncientBattle/Characters/AncientOne/Animations/SourceSequences/。レベル シーケンス 「SEQ_Robot_Fire」 を開くと、ワールドの適切な位置にロボットを読み込み、このレベル シーケンスを変更することで攻撃のアニメーションを調整できます。.

注記:新規レベルでソース シーケンスを開くと、原点ではなく、メイン レベルのスポーンする位置にロボットを読み込みます。このオフセット トランスフォームはレベル シーケンスのキーで設定されています。

UE5 早期アクセスで導入された新しいアニメーション ユーティリティは、アニメーション モード ウィンドウのツール欄から利用できます。ここからビューポートを Select Only Controls モードにすばやく変更できるので、他のワールド オブジェクトに影響することなく、レベル エディタ上のコントロールをはるかに簡単に選択できます。さらに、新機能であるポーズ ライブラリ、Tween ツール、Snapper ツールも、ここから利用できます。これらの詳細については 「UE5 EA Documentation (Unreal Engine 5 早期アクセス ドキュメント)」 をご覧ください。特にポーズ ライブラリは、このプロジェクトの開発で重宝しました。この機能を利用すると、ハンド ポーズはもちろん、アイドルのような全身ポーズさえも、アニメーターがコントロールリグ ポーズを今後の使用に備えて作成しておけます。このポーズは、どのコントロールに影響するかを格納しているので、セレクション セットとして使用すれば、頻繁に操作する複数のコントロールをすばやく選択できます。こうしたポーズはアセットとして保存されるため、別のレベル シーケンスでも同じポーズを適用できます。たとえばイントロのシーケンスでアイドル ポーズを調整した際には、別のレベル シーケンスにポーズを保存してから貼り付けることで、アイドル ポーズを異なるアニメーション ステートで、すばやく更新できました。
このポーズ ライブラリは、UE5 に導入された新しいアニメーション ユーティリティのひとつです。
レベル シーケンスにも 4.26 で新機能が追加され、 Linked Animation Sequence と呼ばれています。この Linked Animation Sequence を使用すると、レベル シーケンスを保存する度に、スケルタル アニメーション シーケンスを自動で更新できます。つまり、シーケンサーでアニメートすることで、アニメーション ブループリントで使用するアニメーションを、行ったり来たりせずに自動でベイクできます。以上が、このロボットのゲームプレイ アニメーション シーケンスをすべて作成する際に利用した主な手法です。 

Linked Animation Sequence を作成する場合は、シーケンサーでアクタ (ここでは [BP_AncientOne] ) を右クリックして、 [Create Linked Animation Sequence] を選択します。このプロンプトでアニメーション シーケンスを保存する場所を指定します。このリンクを作成してから、レベル シーケンスと新しいアニメーション シーケンスを必ず保存します。
シーケンサー アクタのトラックから Linked Animation Sequence を作成できます。
リンクしたアニメーション シーケンスに移動する場合は、シーケンサーでアクタを右クリックしてから [Open Linked Animation Sequence] を選択します。同様に、アニメーション シーケンスから元のレベル シーケンスを開く場合は、アニメーション シーケンス エディタの [Edit in Sequencer] ボタンに移動して [Open Level Sequence] をクリックします。

ヒント: さまざまなアニメーション ステートのレベル シーケンスをさらに作成する場合は、レベル シーケンス アセットを複製してキーフレームを削除するだけで、新しく開始できます。アニメーション シーケンスとリンクしたレベル シーケンスを複製する場合は、意図しないアニメーション シーケンスを誤って上書きしないように、必ず新しいリンク済みのアニメーション シーケンスを作成しましょう。

リンク済みのレベル シーケンスと組み合わせて、シーケンサーでコントロールリグを使用する大きなメリットは、スケルトンを修正するだけで簡単にアニメーションを更新できることです。シーケンサーは、ボーンではなくコントロールを駆動するため、コントロールリグの変更に従います。レベル シーケンスを開いて、もう一度保存するだけで、アニメーション アセットを更新し、スケルトンに適用した最新の変更に再ベイクします。

フルボディ IK


最後に、ヒーローに狙いを定める古きものの姿勢を拡張し、調整するために追加したフルボディ IK レイヤーを確認しましょう。このエフェクトは加算的に設計されているため、アニメーターの趣向を置き換えることなく、強化します。
 
フルボディ IK でアニメーションを強化し、プレイヤーに反応するアニメーションを実現します。

UE5 早期アクセスでは フルボディ IK ソルバ が改善され、操作がはるかに高速かつ簡単になりました。この 「CR_AncientOne_ArmAim_CtrlRig」 で設定したエフェクトのように、フルボディ IK はコントロールリグのノードとして利用できます。 

このエフェクトを作成するコントロールリグ アセットを詳しく確認する前に、まずはトリガーする仕組みに注目しましょう。ロボットのアニメーション ブループリント 「AncientOne_AnimBP」 は、シンプルなステート マシンでビヘイビアを制御し、最終ポーズの出力前に Control Rig ノードにポーズを渡します。そして、いくつかの変数を用意して Control Rig ノードに渡し、 AlphaCR フロート変数によって Control Rig ノード自体のブレンドに適用するウェイト量を操作します。
ステート マシンの評価後に、狙いを定める腕をアニメーション ブループリントで制御します。
Control Rig アニム ノードの Interp プロパティに渡す Alpha_CR 変数によって、フルボディ エフェクトを適用するタイミングと、ブレンドのオンとオフに適用する速度を制御できます。このノードを選択した状態で、[Details (詳細)] パネルの [Alpha Scale Bias Clamp] セクションを確認します。ここで、ブレンド オンと ブレンド オフ のビヘイビアに異なる速度を設定する手法は、ぜひ利用したい優れたテクニックです。これを実現する際は、[Interp Speed Increasing] と [Interp Speed Decreasing] を調整し、コントロールリグのブレンド オンは高速に、ブレンド オフは低速に設定します。ここで設定した値はノードのウェイト ピンの説明に反映されます:FInterp(Alpha, (10:2))

Reach Amount 変数には 0~1 のフロート値を渡し、ロボットが主人公 Echo に向けて発砲する時に、どれだけ腕を伸ばすかを調整します。これはゲームプレイを反映しておらず、アートの方向性に合わせた制御を追加するために AnimBP で設定した値にすぎません。Laser Location 変数は、レーザーが地面にヒットするワールド位置を表します。この値は BP_AncientOne で直接設定しており、コントロールリグの FBIK にどこまで到達するかを指示します。

AnimBP でノードをダブルクリックすると、コントロールリグを開くことができます。一見したところ、とてもシンプルなグラフです。LaserLocation はロボットの相対位置としてワールド空間から変換した値で、 actor_transform という名前のコントロールを実行する際に使用します。このコントロールを使用して、ロボットが発砲する位置を表します。Set Translation コントロールをバイパスした場合、このコントロールを手動で移動して、ロボットのテストやデバッグをコントロールリグ エディタから直接実施できます。
この Arm Aim コントロールリグは関数とブランチを使用しているため、テストが簡単です。
デフォルトのコントロールリグはフルボディ IK を使用しますが、ここでは BasicIK バリアントを含めて簡略化されたアプローチで表現します。AimWithFBIK ノードをダブルクリックして、フルボディ IK エフェクトを作成している関数の内容を開きます。
ロジックのセクションごとにコメントを付けた、フルボディ IK のコントロールリグ関数。
この AimWithFBIK 関数は、データの収集、腰の調整、腕を伸ばす距離の計算、フルボディ IK の適用、そしてハンド方向の最終調整など、いくつかの部分に分けて考えることができます。

メモ:ここで作成するセットアップは説明を意図しているため、いくつかの部分は扱わず、使用もしません。

この関数はまず Entry ノードで始まり、次に Sequence ノードが続きます。通常、Sequence ノードを使用してロジックのステップごとに機能を分割すると、読みやすくなり、容易なデバッグを実現できます。Sequence ノードの「A」ピンでは、データの収集と腰の調整を処理します。ボーンのトランスフォーム データの収集では、Get Transform ノードを使用し、取得したトランスフォームの値をコントロールの Set Transform ノードに渡しています。コントロールを作成して、そのトランスフォームをボーンのトランスフォームに設定する方法は、アニメーション ブループリントから受け取るアニメートしたポーズをストアする上で最適です。これにより処理をビジュアルで理解しやすくなり、不具合が発生しても容易にデバッグできます。コントロールで多数のボーン トランスフォームをストアしていますが、最終的に使用するのは foot_lfoot_rhand_r の各ボーンとコントロールです。

Get Transform と Set Transform のペアでコントロールのボーンをストアした後には、Offset Transform ノードと簡単なロジックで、骨盤の前方の動きを緩やかにしています。これによってロボットがレーザーを発射するときに、前傾するように見せかけます。つまり、ロボットがレーザー ブラストを発射するときに、そのムーブメントの一部を増幅してから Offset Transform に渡しています。

次に Sequence ノードの「B」ピンを説明します。ここからフルボディ IK に渡すデータを改良する処理が始まっています。この前提となるコンセプトは、レーザーの発射時に、手を地面に対して下げることなく、右腕を Echo に向けて引っ張りたいのです。これを実現するために、 hand_r_ctrl の Z 位置と actor_transform の X と Y 位置を組み合わせています。その次に、先ほど計算した新しいトランスフォームと、 hand_r_ctrl にストアしたアニメート済みの入力ハンド トランスフォームを補間します。そして Interpolate の出力トランスフォームは、右手に適用する新しい目標ポーズを表し、これをフルボディ IK ソルバに直接渡します。
Remap でセーフ ポーズにクランプし、腕を伸ばすポーズのトランスフォームを計算している部分。
以上で必要なデータがすべて揃い、改良できたので、最後にこのすべてをソルバに渡します。ソルバにデータを渡す前には、用意したすべてのデータがクリーンで意図した結果をもたらすことを、時間をかけて確認することが重要です。
フルボディ IK ソルバは、足に対応するストアしたアニメート済みのトランスフォームと、計算したハンドのポーズ トランスフォームを使用して、全身のポーズを調整します。
こちらで行うソルバの設定は説明しませんが、代わりに最近収録したライブストリームをご覧ください。「Motion Warping and Full-Body IK | Inside Unreal」。このビデオは、ソルバの内部処理について詳細に確認し、それを古きものに活用した方法を解説しています。実現したいのは、足を地面から離すことなく、残りのボディを調整して、Echo に向けて右腕を伸ばす際にボディを標的に向けて傾ける、高度な動作です。ソルバでボーンの設定をいくつか調整すると、そのソルバが指定したトランスフォームを実現しようとするため、回転や移動を許可するボーンを改善できます。

この関数の最後の部分では、 actor_transform コントロールとしてストアしたレーザーのヒット位置に向けて、ハンドの狙いを定めます。ここでは最適なハンドの方向を取得するためにソルバを利用せず、ソルバによる大まかなポージング パスが完成した後で、そのポーズを改善します。つまりこれは、ソルバの強みを活かして必要な作業を軽減したうえで、アートの方向性を確保する方法です。その結果、狙いを定める設定では、手のひらの軸を特定して、 actor_transform に標的として指定するだけで済みます。

ストーリーを表現する

アニメーションとはストーリーを表現する手段であるため、Epic はストーリーテリングに役立つツールを精力的に開発しています。ここまでシーケンサーをキャラクター アニメーションに利用する方法を解説しましたが、これは手作業でキーを設定する場合だけでなく、モーション キャプチャーにも活用できます。また、コントロールリグやフルボディ IK などのツールをランタイム エンジンと組み合わせることで、さらにダイナミックで没入感のある、印象的なストーリーを表現できます。 

キャラクター リグやランタイムの設定は複雑になりがちですが、ロジックをレイヤーごとに分割して構築すれば、デバッグしやすくフレキシブルなキャラクターをビルドして、プロシージャルにアートの方向性を表現できます。今回ビルドしたすべての部分は、アーティストやデザイナーが活用しやすいように設計されています。たとえばコントロールリグは細かい調整に対応し、しかも、これは利用できる多数のツールのうちの、ひとつに過ぎません。 

最近の Inside Unreal ライブストリーム をご覧いただき、フルボディ IK ソルバやグラフの実装について、(私と一緒に失敗を経験しながら) さらに詳細に学習しましょう。 

現在の UE5 は早期アクセスであり、リギングとアニメーションの機能は精力的に改善されています。最高の Unreal Engine 5 を実現するために、貴重なフィードバックをお寄せください。その際は、フォーラムにご参加いただくか、または Twitter で直接私に連絡することもできます。

古代の谷のアニメーション機能 や、このプロジェクトで利用した他の素晴らしいテクニックについて、より深く学習したい方は、「Content and Samples (コンテンツとサンプル)」ページでガイド ツアーをご覧ください。


その他のリンク:
Meerkat Sample Project
MetaHumans
Animating with Control Rig in 4.26 | Inside Unreal
Evolving Animating with Unreal Engine

    今すぐ Unreal Engine を入手しましょう!

    Unreal Engine は世界で最もオープンで先進的な制作ツールです。 
    あらゆる機能とソース コード アクセスを完備している Unreal Engine を使用すれば、すぐに制作を開始できます。