ぼっちプログラマのメモ

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

UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について

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

その①
UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる - ぼっちプログラマのメモ
その② ここ
その③
UE4.26で追加されたControl Rig Componentの使い方について <ControlRigの流用編> - ぼっちプログラマのメモ


ControlRig?ナニソレオイシイノ?という方はこちらをどうぞ

youtu.be
スライド:猫でも分かる Control Rig UE4.25 版

はじめに

UE4.26がついにリリースされました!
(この記事を書いてる今はまだリリースされてないので、本当に時間通りにアップされるかドキドキしながら書いてます)

今回リリースされたUE4.26にて
「コントロール リグの反転(Control Rig Inversion )」がサポートされました。

コントロール リグの反転
f:id:pafuhana1213:20201203141544g:plain
コントロール リグの反転機能により、シーケンサーを使用して編集できるアニメーション リグに既存のアニメーションを再マッピングできるようになりました。また、使いやすいコントロール リグを使用して、既存のスケルタル アニメーションを変更できるようになりました。新しい Backwards Event ノードでは、ボーンがコントロールやその他のコントロール ロジックにどのようにマッピングされるかを定義します。

数値プレシーケンサー機能により、シーケンサーでアニメーションのフレームごとにバックワード イベントを実行することで、コントロール リグにベイクできるようになりました。
Unreal Engine 4.26 リリース ノート | Unreal Engine ドキュメント

UE4.25以前でも既存のアニメーションをControlRigで編集することは可能ではありましたが、手順が複雑であったり挙動が安定しないなどの問題がありました。しかし、この反転機能を使うことで簡単に編集することが可能になります。

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。ということで、本記事ではこの反転機能の使い方について説明します。

反転機能の概要・全体像について

具体的にどう使うのかを説明する前に、まずはどんな機能でどういう流れで使うのかについて簡単に説明します。

反転機能はざっくり言うと「アニメーションアセットにおける骨の制御情報をControl Rigの各要素に反映(マッピング)することで、ControlRigとSequencerでそのアニメーションアセットを再現する」機能です。

下図はお馴染みのWalkモーションをControlRigの反転機能を使って再現している様子です。

f:id:pafuhana1213:20201203144323g:plain

反転機能によって各Control毎にキー・カーブが設定され、その情報を元にControlが制御されます。…BoneではなくControlがです! ここまでが後述する Backwards Solve の役割です。
そして、「Controlの制御結果」と「Control RigのForward Solveに接続した各ノード」を元に各Boneを制御することで上図における挙動を実現しています(このForward SolveはUE4.25のControlRigにおけるBegin Executeノードにあたるものです)。

アニメーションアセットという固定の(ベイクされた)データ から ControlRig・Sequencerという柔軟に編集可能な形式に変換できるのが大きなメリットです。既存のアニメーションデータを保持しつつ、UE4エディタ上で自由に編集することが可能になります。FK的に骨を一つずつ調整することもできますし、ControlRigのIK機能などを使って複雑な制御を追加することもできます。特に後者に関しては、足を床の高さに合わせるなどのレベル上の背景・オブジェクトに応じたアニメーションを行わせたい際に非常に便利です。

以下のツイートは、実際にこの反転機能を使ってUE4標準のアニメーションを編集したものです。完全に0からControlRigを使ってアニメーションを作るのは大変かと思いますが、このように元になるものがあればここまで作れる良い例かと思います。

更に、ControlRigを使って編集した挙動はAnimationSequenceやPoseAssetとして保存することもできます。カットシーンだけでなく、AnimationBPやAnimation Montageで使用したいケースなどで便利かと思います。(SkeletalMeshComponentの右クリックメニューからも可能です)

f:id:pafuhana1213:20201203155617p:plain

更に更に、UE4.26の新機能「Linked Animation Sequence」を使用することで変更内容を即反映することも可能です!これがかなり便利で…個人的には今後手放させくなる機能なのでは!?と思ったりしてます。

長くなりましたが、ControlRigの反転機能の概要や活用方法について説明しました。きっと100割の方が「早く使いたい!どうすればいいの!?」と感じているかと思います。ということで、以降はどう使うのかについてようやく説明します。

Backwards Solve ノードを使ったマッピングについて

まずは上述の「アニメーションアセットにおける骨の制御情報をControl Rigの各要素に反映(マッピング)する」の下準備を実装します。この実装はUE4.26でControlRigに追加された Backwards Solveノード に接続する形で行います。

やることは比較的単純で、アニメーションにより変化したボーンの位置・向きに対応するControlやSpaceを合わせていきます。例えばRoot、Pelvis、neck、headはこんな感じです。
f:id:pafuhana1213:20201203164329p:plain:w450 f:id:pafuhana1213:20201203172543p:plain:w450

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

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

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

ControlRigにアニメーションデータをベイクする方法について

Backwards Solve による仕込みが終わったので、次は「アニメーションアセットにおける骨の制御情報をControl Rigの各要素に反映(マッピング)する」を実際に行います。

Level Sequenceを作成し、制御したいSkeletalMeshとAnimationを登録します。その後、制御対象のActorの右クリックメニューにあるBake to Control Rigから先程実装作業を行ったControlRigアセットを指定します。もし候補に対象のControlRigアセットがない場合は、その上のFilter Asset By SkeletonをOFFにすれば出てくるはずです。
f:id:pafuhana1213:20201203174809p:plain:w450f:id:pafuhana1213:20201203174644p:plain:w450

ControlRigアセットを選択すると以下のダイアログがでてきます。Reduce KeysがONの場合、ボーンの移動・回転量がToleranceの値以下ならキーを打たずにスキップします。OFFにするとキーが非常に細かく打たれてしまいControlRigによる編集がし辛くなるので個人的にはオススメしません。

f:id:pafuhana1213:20201203175519p:plain

ControlRigへのベイクを実行すると、下図のようにAnimationTrackが非Active状態にになり、代わりにキーが大量に打たれたControlRigトラックが追加されます。そして、レベル上に各Controlが表示されるようになり、ControlRigを使ったアニメーション編集が可能になります。
f:id:pafuhana1213:20201203183703p:plain:w450

ちなみに、Control RigのForward Solveの実装が抜けている場合は下図のようにボーンが動きません。これは上述の通り、あくまでBackwards SolveがするのはControlの制御までだからです。Forward Solveでボーンに対しての制御を書く必要があります。

f:id:pafuhana1213:20201203184133p:plain:w450

ここまで来たら後は楽しく好き勝手に編集していきます!内股にして可愛くするもヨシ!、頭をキョロキョロさせて落ち着きをなくすのもヨシ!…可能性は無限大です!

そして、編集結果をアニメーションアセット化したい場合はSequencerの以下の機能を使います。

f:id:pafuhana1213:20201203155617p:plain

これで基本的な作業の流れの説明は終わりです。こうして文章にすると長くなりますが、実際に作業するととても簡単だったりします(Backward Solveの仕込みだけは少し大変ですが…)。まずは4.26版のControlRigManqeuinサンプルで一度反転機能を試してみてください!

追記 実際に編集する際はAdditive設定のトラックを追加するといいよという話

上述の方法で既存アニメーションをLevelSequenceに変換できるのですが、その際にできる大量のキーをどうすればいいか悩んでいる方を見かけたので追記
【UE4】既存アニメーションを修正する為のコントロールリグを組んでみた話 - Unreal Engine 初心者の技術メモ


取り急ぎの追記なので詳細な手順は割愛しますが、こちらの動画の6:20付近にあるように Additive設定のControl Rigトラックを追加するのがおすすめです。ベースとなる大量のキーを持つTrackいじらずにアニメーションの編集作業ができます。僕の場合は、更に大量キーを持つ方のTrackはLock設定にして誤って編集しないようにしたりしてます。
www.youtube.com
f:id:pafuhana1213:20210525073708p:plain

おまけという名の本編:Linked Animation Sequenceについて

実際に作業していると、出力したAnimation Sequenceを再度ControlRigで編集したいケースが出てきます(出てきました)。しかし、UE4.25以前では編集のたびに新規AnimationSeuqnceとして保存する必要がありました。その結果、アセット管理が非常に面倒なことになったり、AnimationBP や Montageにおけるアセット指定を手作業で直したりする必要がありました。

UE4.26で追加されたLinked Animation Sequenceはそういった問題を大きく改善します!なぜなら、Control Rigによる編集結果を既存のAnimationSequenceに反映することができるからです。

使い方はとても簡単で、先程の画像にある Create Linked Animation SequenceからAnimation Seqeunceアセットを作成するだけです。この項目からAnimation Seqeunceアセットを作成するとLevel Sequenceとのリンクが作られます。そして、そのLevel Sequenceが保存されると編集内容がリンクしているAnimation Seqeunceアセットに即反映されるようになります。

…文字にするとよく分からないので、改めて動画をぺたり。こんな感じに編集結果を即反映できます。すごい!

更に、Animation Sequenceアセット側からControlRigによる編集用Level Sequenceを作成することもできます。もちろん、上述のリンク付きでです!

f:id:pafuhana1213:20201203203329p:plain
f:id:pafuhana1213:20201203203514p:plain

この辺りの実装が気になる方は ULevelSequenceAnimSequenceLink でエンジンコードを検索すると色々分かるのでオススメです。

さいごに

ながーーーーーくなりましたが、Control Rigの反転機能(Inversion)について説明しました!この反転機能はControl Rigを使ってアニメーションを作成・編集したい方にはほぼ必須と言えるほど有用です。DCCツールで作成したアニメーションデータをただ再生するだけでなくエンジン上で更にクオリティを上げることができるのは様々なプロジェクト・ケースで役に立つはずです。是非一度試してみてください!

おしまい。