本記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 4日目の記事 その③です。
その①
【UE4】UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる - ぼっちプログラマのメモ
その②
【UE4】UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について - ぼっちプログラマのメモ
その③ ここ
ControlRig?ナニソレオイシイノ?という方はこちらをどうぞ
youtu.be
スライド:猫でも分かる Control Rig UE4.25 版
はじめに
UE4.26がついにリリースされました!
(この記事を書いてる今はまだリリースされてないので、本当に時間通りにアップされるかドキドキしながら書いてます)
今回リリースされたUE4.26にて「Control Rig Component」が追加されました。
Control Rig コンポーネント
Control Rig コンポーネントを使用してブループリントからコントロールリグ データにアクセスできるようになりました。これにより、ブループリントでゲームプレイ ロジックを使用してコントロールリグを制御したり、異なるプロポーションのキャラクターに合わせてコントロールリグを再初期化したり、他のコントロールリグ データを直接読み取ったり、書き込んだりできるようになりました。さらに、Control Rig コンポーネントのアクセサーを使用して、スケルタル メッシュ以外のオブジェクトを Control Rig コンポーネント階層にアタッチできるようになりました。
コントロールリグの新しいセットアップ イベントにより、スケルトンとコントロールを初期化できるようになりました。
コントロールリグの初期化状態の間にスケルトンとコントロールを配置することができます。
ブループリントでゲッター関数とセッター関数を使用して、ボーンおよびコントロールのトランスフォーム/値を取得または設定できます。
コントロールリグのコントロールとデバッグ描画が、ブループリントのビューポートに表示されます。
コントロールリグからボーン トランスフォームを取得することで、スタティック メッシュ トランスフォームを制御することができます。
Unreal Engine 4.26 リリース ノート | Unreal Engine Documentation
UE4.25以前ではControlRigとその他の機能の連携があまりできませんでしたが、このControl Rig Componentを使うことでBPとの連携が可能になります!更に、異なるキャラクタ間でControlRigを流用したり、StaticMeshの制御が可能になったりとできることが大幅に増えます!
UE4.25 -> UE4.26 で変わった Control Rig メモ ⑬
— おかず (@pafuhana1213) 2020年10月23日
Control Rig Component を使うことで、一つのControl Rigを複数のSkeletal Meshで使い回すことができます。ボーンのマッピング機能もあるので、ボーン構造が異なっていても可能です #UE4#UE4Study#ControlRigpic.twitter.com/iMreysLBMQ
UE4.25 -> UE4.26 で変わった Control Rig メモ ⑭
— おかず (@pafuhana1213) 2020年10月26日
ControlRig Componentを使うことで、ActorやSceneComponentもControlRigで制御することができます。ドアや車などの複数のComponentで構成されているオブジェクトを扱う際に便利だと思います。CAD系で役に立ちそうな予感 #UE4#UE4Study#ControlRigpic.twitter.com/n82GHxDXOn
と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。ということで、本記事ではこのControl Rig Componentの使ってControlRigを様々なSkeletalMeshで流用する方法について説明します。
Control Rig Component のボーンマッピング機能について
そもそもControl RigはSkeletonアセット自体には依存しておらず、ボーンの階層構造を元に各制御を行っています。そのため、ボーンの階層構造が(部分的にでも)同じならある程度動作します。しかし、ボーンの階層構造や各ボーンの名前が一致していない場合は正常に動作しません。そのため、例えばSK_Manqeuin向けに作成したControl RigをMixamoキャラに適用してもマトモに動作しません。
UE4.25以前ではどうしようもなかったのですが、UE4.26新機能であるControl Rig Component のボーンマッピング機能を使うことでこの問題を解決することができます!
と大げさに言ってみたものの、Control Rigが持つボーンの階層構造と適用対象のSkeletal Mesh(Skeleton)が持つボーンの階層構造の対応関係を指定するだけの話だったりします。アニメーションリターゲット(異なるスケルトン)を行う際のアノ作業に近いものというのがイメージしやすいかと思います。
例えばSK_Manqeuin向けに作成したControl RigをMixamoキャラに適用する場合、下図のようにActorにSkeletalMeshComponentとControlRigComponentを追加し、ContructionScript内でAdd Mapped Skeletal Mesh Bone Arrayノードを使ってマッピング処理を行います。ノードの引数ピンにあるBonesとCurvesはそれぞれMapped Bone, Mapped Curve型の配列で、SourceにControlRig側、TargetにSkeletalMesh(Skeleton)側のボーン・カーブ名を入れます。
また、SK_Manqeuinと互換性のあるボーン階層を持つSkeletal Mesh(マケプレでRigged to Epic skeletonがYesになっているモデルなど)が対象の場合でも後述の理由によりマッピング処理が必要です。ただし、Add Mapped Skeletal Meshノードを呼ぶだけで問題ありません。ノード内で自動的にマッピング処理を行ってくれます。
これでマッピング処理が終わり、ボーンの階層構造が異なっていてもControlRigを使い回すことができます!
ただし、まだ解決すべき問題があります。このままでは体格の違いが考慮されていないので正しく制御することができません。
Control Rig 流用時の体格の違いを解決する方法について
この問題を解決するためには、BP側・ControlRig側の両方で対応が必要です。
Blueprint側
ControlRigに対して体格に関する情報であるボーンの初期位置・姿勢を渡す必要があります。
と言っても簡単で、ボーン階層が異なる場合は以下のように…
ボーン階層に互換性がある場合は以下のようにするだけでOKです。
なお、上図に出てくる On Pre SetupイベントノードはControlRigComponentの右クリックメニューから追加できます。
Control Rig側
Blueprintから渡されたボーンの初期位置・姿勢を使って、各Control, Spaceの初期位置・姿勢を設定する必要があります。この時に使用するのが、UE4.26で追加されたSetup Eventノードです。
下図のように、Setup Eventノードに各ボーンの初期Transformを対応するControlに設定する処理をひたすら書いていきます。
ひじょーに地味な作業です。つらいです。
多数のキャラを扱うプロジェクトの場合は早い段階でPythonやEditorUtilityWidgetによる(半)自動化を検討した方が良いかと思います。
tech-art.online
ちなみに、UE4.26のリリースタイミングでControlRigManequinサンプルに上記のBackwards Event 設定が完了済みのアセットが追加されるはずです。そのため、ひとまずSK_Manequinを使って検証してみる方はそちらのアセットを使った方が楽かと思います。
www.unrealengine.com
記事公開タイミングでまだサンプルが更新されてなかったらゴメンナサイ…本社チーム、ワイは信じてるで…!
追記:だめでした
少し下準備は大変ではありますが、これでControlRigアセットを様々なSkeletalMeshで使い回すことができるようになります!
改めてその様子を動画で…いい感じですね!
具体的にどんな処理が内部で動いているか気になる方は、UControlRigComponent::TransferOutputs()辺りを見て頂くのが良いかと思います。