ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4.26で追加されたControl Rig Componentの使い方について <ControlRigの流用編>

本記事はUnreal Engine 4 (UE4) その3 Advent Calendar 2020 4日目の記事 その③です。

その①
UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる - ぼっちプログラマのメモ
その②
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 コンポーネント階層にアタッチできるようになりました。
f:id:pafuhana1213:20201203220335g:plain
コントロール リグの新しいセットアップ イベントにより、スケルトンとコントロールを初期化できるようになりました。
コントロール リグの初期化状態の間にスケルトンとコントロールを配置することができます。
ブループリントでゲッター関数とセッター関数を使用して、ボーンおよびコントロールのトランスフォーム/値を取得または設定できます。
コントロール リグのコントロールデバッグ描画が、ブループリントのビューポートに表示されます。
コントロール リグからボーン トランスフォームを取得することで、スタティック メッシュ トランスフォームを制御することができます。
Unreal Engine 4.26 リリース ノート | Unreal Engine Documentation

UE4.25以前ではControlRigとその他の機能の連携があまりできませんでしたが、このControl Rig Componentを使うことでBPとの連携が可能になります!更に、異なるキャラクタ間でControlRigを流用したり、StaticMeshの制御が可能になったりとできることが大幅に増えます!

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。ということで、本記事ではこのControl Rig Componentの使ってControlRigを様々なSkeletalMeshで流用する方法について説明します。

Control Rig Component のボーンマッピング機能について

そもそもControl RigはSkeletonアセット自体には依存しておらず、ボーンの階層構造を元に各制御を行っています。そのため、ボーンの階層構造が(部分的にでも)同じならある程度動作します。しかし、ボーンの階層構造や各ボーンの名前が一致していない場合は正常に動作しません。そのため、例えばSK_Manqeuin向けに作成したControl RigをMixamoキャラに適用してもマトモに動作しません。

f:id:pafuhana1213:20201203231114p:plain:w400f:id:pafuhana1213:20201203231139p:plain:w500

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)側のボーン・カーブ名を入れます。
f:id:pafuhana1213:20201204001327p:plain:w450  f:id:pafuhana1213:20201204001406p:plain:w350

また、SK_Manqeuinと互換性のあるボーン階層を持つSkeletal Mesh(マケプレでRigged to Epic skeletonがYesになっているモデルなど)が対象の場合でも後述の理由によりマッピング処理が必要です。ただし、Add Mapped Skeletal Mesh ノードを呼ぶだけで問題ありません。ノード内で自動的にマッピング処理を行ってくれます。

f:id:pafuhana1213:20201204004529p:plain:w400

これでマッピング処理が終わり、ボーンの階層構造が異なっていてもControlRigを使い回すことができます!
ただし、まだ解決すべき問題があります。このままでは体格の違いが考慮されていないので正しく制御することができません。

Control Rig 流用時の体格の違いを解決する方法について

この問題を解決するためには、BP側・ControlRig側の両方で対応が必要です。

Blueprint側

ControlRigに対して体格に関する情報であるボーンの初期位置・姿勢を渡す必要があります。

と言っても簡単で、ボーン階層が異なる場合は以下のように…

f:id:pafuhana1213:20201204010015p:plain

ボーン階層に互換性がある場合は以下のようにするだけでOKです。

f:id:pafuhana1213:20201204010028p:plain

なお、上図に出てくる On Pre Setup イベントノードはControlRigComponentの右クリックメニューから追加できます。

f:id:pafuhana1213:20201204010101p:plain

Control Rig側

Blueprintから渡されたボーンの初期位置・姿勢を使って、各Control, Spaceの初期位置・姿勢を設定する必要があります。この時に使用するのが、UE4.26で追加されたSetup Event ノードです。

下図のように、Setup Eventノードに各ボーンの初期Transformを対応するControlに設定する処理をひたすら書いていきます。

f:id:pafuhana1213:20201204010626p:plain
f:id:pafuhana1213:20201204010746p:plain

ひじょーに地味な作業です。つらいです。
多数のキャラを扱うプロジェクトの場合は早い段階でPythonやEditorUtilityWidgetによる(半)自動化を検討した方が良いかと思います。
tech-art.online

ちなみに、UE4.26のリリースタイミングでControlRigManequinサンプルに上記のBackwards Event 設定が完了済みのアセットが追加されるはずです。そのため、ひとまずSK_Manequinを使って検証してみる方はそちらのアセットを使った方が楽かと思います。
www.unrealengine.com

記事公開タイミングでまだサンプルが更新されてなかったらゴメンナサイ…本社チーム、ワイは信じてるで…!
追記:だめでした
更に追記:アップデートきました!

少し下準備は大変ではありますが、これでControlRigアセットを様々なSkeletalMeshで使い回すことができるようになります!
改めてその様子を動画で…いい感じですね!

具体的にどんな処理が内部で動いているか気になる方は、UControlRigComponent::TransferOutputs() 辺りを見て頂くのが良いかと思います。

最後に

UE4においてボーン階層が異なる場合でのアニメーション共有は長年の課題でしたが、ControlRigでは今回の対応が入って個人的にとても嬉しいです!また、まだ試せていないのですが、同じくUE4.26で入ったControl Rigの反転機能(Inversion)と併用したら更に自由度が上がるのでは?とワクワクしてます。その他にもできること沢山あると思うので、是非触ってみてください!

おしまい