#UnrealEngine5 で自分似のMetaHumanモデルをプレイヤーとして操作できるようにしてみた
前回の記事では、自分の顔を元にした3DモデルからMetaHumanを作成してUnrealEngine上に配置しました。
今回は、この作成したMetaHumanモデルをゲーム画面上で操作できるようにしていきます。
実行環境
- Unreal Engine 5.0.3
- MetaHuman Plugin 1.00
Unreal Engineでの作業
リターゲットではアニメーションの流用ができなかった
私が以前に書いた記事では、UnrealEngineにデフォルトで用意されているプレイヤーキャラクタモデル(通称マネキン)のアニメーション等を流用して、弊社公式キャラをプレイヤーとして動かせるようにしました。
今回も同様の操作でMetaHumanを動かせるようにしようとしましたが、自動的に生成されたMetaHumanのモデルは弊社公式キャラのモデルとは構造が違っており、同じ方法ではアニメーション等の流用ができませんでした。
具体的には、弊社公式キャラのモデルは1つのスケルタルメッシュ(ボーン付きの3Dモデル)だけでキャラクターの全身が表現されており、UEで用意されているマネキンも同様であったため、スムーズにリターゲットができました。しかし、MetaHumanは頭、胴、両手等パーツごとのスケルタルメッシュや靴や髪などのスタティックメッシュが集まって1つのキャラクターが表現されるという構造だったため、同じようにリターゲットを行うことができませんでした。
もしかしたら、何らかの作業を挟むことでリターゲット可能なのかもしれませんが、今回は別のアプローチでMetaHumanをプレイヤーとして動かせるようにしていきます。
MetaHumanのモデルを用意
前回の記事同様、Quixel BridgeからMetaHumanをUEプロジェクト内に読み込みます。
読み込んだMetaHumanのデータは、Content Browser内で参照できます。
Content/MetaHumans/{MetaHuman名}
フォルダを開くと、BP_{MetaHuman名}
というBluePrintクラスファイルがあります。念のため、作業用にこのファイルを複製し、適当にプレイヤー用のBluePrintと分かるように名前を付けます。
MetaHumanのBluePrintの親クラスを再設定
プレイヤーとして動かすためには、歩いたり走ったりできるようになる必要があります。そのために、MetaHumanの親クラスにCharacter
クラスをセットします。
複製したMetaHumanのBluePrintクラスをダブルクリックして編集画面を開きます。
上部メニューのFile
→ Reparent BluePrint
をクリックし、Character
クラスを選択します。
BluePrintのモデルの位置調整
Characterを親クラスとしてセットした状態でViewportを見てみると、キャラクターモデルとは別にコリジョンを表すカプセル状のワイヤーフレームが表示されています。
位置がずれており、このままでは正確に当たり判定を検知できないため、キャラクターモデルの位置を調整します。
ComponentsメニューからRoot
を選択して、Transform
内のLocation
からZ座標の数値を操作してキャラクターの位置をカプセルの中に入るよう下げます。
マネキンからカメラ関係コンポーネントをコピー
ゲームプレイ時に、キャラクターを画面に映すためのカメラもこのBluePrintクラスに設置する必要があります。
UEが用意している三人称視点用のマネキンのBluePrintに同じ用途のカメラが入っているので、これを流用します。
Content BrowserでContent/ThirdPerson/BluePrints
を開くと、BP_ThirdPersonCharacter
というBluePrintクラスがあるので、これの編集画面に入ります。
Viewportを見ると、カメラの位置を調整するCameraBoom
コンポーネントと、画面を描画するためのFollowCamera
コンポーネントがマネキンの後方に設置されています。
この2つのコンポーネントをコピーして、MetaHumanのBluePrintクラスのCapsule Component
下へペーストします。
Viewportにカメラが表示されましたが、カメラの向きに対してキャラクターモデルの方向が横向きになっているため、カメラが背後に位置するようにモデルを回転させます。
マネキンからキャラクター移動用のBluePrintノードをコピー
カメラは設置しましたが、このBluePrintクラスにはプレイヤーからの操作を受け取ってモデルを動かす処理が書かれていないため、キャラクターを操作することができません。そのためのBluePrintノードについても、マネキンのBluePrintから流用します。
マネキンのBluePrint編集画面を開き、今度はEvent Graph
タブを表示します。
移動処理のためのBluePrintノードが配置されているので、これらを全てコピーしてMetaHumanのEvent Graph
上にペーストします。
MetaHuman BluePrintクラスをコンパイルすると、エラーが発生してコンパイルに失敗します。Turn Rate Gamepadというノードが赤くなり、ログには「TurnRateGamepad変数が見つからなかった」というテキストが表示されています。
単純に変数が無いのが問題のため、編集画面左下のMy Blueprint内でVARIABLESの横の+ボタンをクリックし、TurnRateGamepad
という名前のfloat型の変数を追加します。
変数を追加した状態で再度コンパイルを実行すると、今度は正常に完了します。
MetaHumanがプレイヤーになるよう設定し、実際に動かしてみる
カメラとプレイヤー移動の処理を追加したため、一旦MetaHumanをゲーム画面で動かしてみます。
World Settings
のDefault Pawn Class
項目に今まで編集してきたBluePrintクラスをセットし、ゲームを起動してみます。
プレイヤーが移動してカメラがそれを追従しているものの、移動アニメーションが無く棒立ちであり、キャラクターの向きが常にカメラの方向に同期しています。
これでは人間を操作している感覚が全く無いため、次のステップではアニメーションなどを付けていきます。
マネキンのスケルトンをMetaHumanで共有し、アニメーションを流用
アニメーションを共有する方法としては、リターゲットの他にスケルトンの共有というものがあります。
Unreal Engineではアニメーションは各モデルのスケルトンに紐づくようになっています。スケルトンは、構造が近しいモデルでは共有できるようになっており、それによってアニメーションの再利用が可能です。
MetaHumanのBluePrint編集画面を開き、左メニューのComponentsの中からBody
を選択した状態で、DetailsのSkeletal Mesh
欄のメッシュプレビュー画像をダブルクリックします。
すると、スケルタルメッシュの編集画面が開くので、今度は右上の骨のマークをクリックします。
MetaHumanのスケルタルメッシュに紐付けられているmetahuman_base_skel
というスケルトンの編集画面が開きます。
左メニューのAsset Detailsタブを開き、Compatible Skeleton
欄の+マークを押して空のアイテムを増やし、マネキンのスケルトンを選択します。
これにより、マネキンのスケルトンが持っていたアニメーションがMetaHumanのスケルトンに共有されます。
MetaHumanのBluePrintに戻り、Details内のAnim Class
項目にマネキンのアニメーションBluePrintクラスであるABP_Manny
をセットします。尚、Mannyクラスは男性キャラクター用のアニメーションが入っており、もう一つのQuinnというクラスには女性キャラクター用のアニメーションが入っています。
コンパイルしてゲームを開始してみます。
待機アニメーションは問題ありませんが、移動させると脚の先端が固定されたままという奇妙なアニメーションになっています。また、相変わらずキャラクターの向きとカメラの向きが同期したままです。
どうやら、まだ調整が必要な箇所があるようです。
コントロールリグのブループリント削除
奇妙なアニメーションの原因を探るため、アニメーションを制御しているBlue Printを確認します。
Content/Characters/Mannequins/Animations
にあるABP_Manny
をダブルクリックし、アニメーションBlue Printの編集画面を開きます。
アニメーションを出力する直前で、Control Rig
というノードを経由しているのが確認できます。
このノードは、UE内で3Dモデルのアニメーションを作成するためのコントロールリグの状態を参照しているようなのですが、MetaHumanにはコントロールリグがまだ作成されていません。
そのため、Control Rig
ノードが上手く動作せず、アニメーションに影響が出てしまっているようです。
MetaHumanにコントロールリグの設定をすれば改善しそうですが、わざわざ設定しなくても上手くアニメーションは動くようなので、Control Rig
ノードを回避するようにBluePrintを編集します。
MetaHumanの動きの調整
次に、カメラの向きとモデルの向きが同期してしまっているのを改善するため、MetaHumanのBluePrint編集画面を開きます。
Componentsの一番上を選択した状態で、Details内のUse Controller Rotation Yaw
という項目を探すと、チェックが付いてます。
この項目は、マウスなどの操作に合わせてキャラクターの向きを回転するかどうかを決めるものです。チェックを外すことで、キャラクターの向きがカメラの動きと独立するようになります。
次に、Componentsの一番下の方にあるCharacter Movement
を選択して、Details内のOrient Rotation to Movementという項目を探すと、チェックが付いていないのが分かります。
この項目は、キャラクターの移動方向に合わせて向きを変えるかどうかを決めるものです。これが有効になっていないと、キャラクターが横に移動した時に正面を向いたままスライドしてしまうためチェックを付けます。
コンパイルが完了すれば、必要な作業は全て完了しました。
完成
まとめ
作成したMetaHumanをUnreal Engineのゲーム内でプレイヤーとして動かすことができるようになりました。
また、アニメーションの流用方法として、リターゲットとは別にスケルトンの共有というアプローチを試してみました。
アニメーションを流用すれば、プレイヤーだけでなくNPCとしてMetaHumanを活用できるようになるため、リアルなモデルのキャラクターが大量に必要な場合は、MetaHumanを有効活用するとかなり効率化ができるかもしれません。