ぼっちプログラマのメモ

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

UE4.26で追加されたControlRigのループ(Looping)を使って、手の開閉を簡単に実装してみる

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

その① ここ
その②
【UE4】UE4.26で追加されたControlRigの反転機能(Inversion)の使い方について - ぼっちプログラマのメモ
その③
【UE4】UE4.26で追加されたControl Rig Componentの使い方について - ぼっちプログラマのメモ


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

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

はじめに

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

今回リリースされたUE4.26にて
「コントロール リグの分岐とループ(Control Rig Branching and Looping )」がサポートされました。

コントロール リグの分岐とループ
分岐とループにより、最小限のセットアップで柔軟でダイナミックなコントロール リグを作成することができます。ループを使用すると、反復可能なオブジェクトの集合 (ボーン チェーン、コントロールのリスト) を動的に作成することができます。これにより、グラフのサイズが大幅に縮小され、グラフのパフォーマンス、作成時間、およびリグの柔軟性が向上します。

f:id:pafuhana1213:20201202214706g:plain

  • 新しい分岐/条件ノードにより、条件の要素に基づいてグラフを分岐できるようになりました。
  • ループでロジックを利用して、より簡潔で柔軟なグラフを作成できるようになりました。
  • 項目のグループ化とサポート ノードをサポートするようになりました。

Unreal Engine 4.26 リリース ノート | Unreal Engine Documentation

特にループ機能は手指のように複数の階層で構築されたボーンを制御する際にとても有用です!
この機能がないUE4.25の場合は指毎にノードを配置する必要があって大変でしたが、ループ機能を使うことでかなりシンプルに書くことが出来ます!

と言ったことまではこのリリースノートから読み取れるのですが、具体的にどう使うか?は説明されていません。
ということで、本記事ではこのループ機能を使って上図のような制御を実装する方法について説明します。

ControlRigのループ機能について

まずはControlRigに入ったループ機能について簡単にご紹介。

ループ系に関する機能はCollectionsカテゴリに纏められていて、その中でもFor Each Item, Items, Childrenが今後よく使うことになるかと思います。
f:id:pafuhana1213:20201202222907p:plain:w200 f:id:pafuhana1213:20201202221727p:plain:w400 f:id:pafuhana1213:20201202221802p:plain:w400

上図から大体イメージできる感じですが、Items, Childrenで制御対象であるBone, Space, Control, Curveを設定・収集し、For Each Itemでループ処理を行う形です。BPにおけるFor Each Loopノードと同様の処理ができると考えれば分りやすいかと思います。

更に嬉しいことに、For Each Itemには以下のピンが用意されています

  • Index:何番目の要素に対して処理を行っているか
  • Count:Collectionsに指定された要素数
  • Ratio:Index / Count

特にRatioは便利で、ピンのコメント「 Ranging from 0.0 (first item) and 1.0 (last item). This is useful to drive a consecutive node with a curve or an ease to distribute a value.」にもある通り、カーブ制御や親から子に値を分配していくような制御との相性が非常に良いです!

例えば、指の根元から先にかけて回転量を制御したい場合は…こんな風に書いたり…
f:id:pafuhana1213:20201203013651p:plain
youtu.be

Evaluate CurveノードのValueにRatioを渡すことでより細かい制御を行うことが可能になります。
f:id:pafuhana1213:20201203014157p:plain
www.youtube.com

特にEvaluate Curveはカーブ・入力値・出力値をパラメータ化することで、ゲームの状況や適応するキャラに応じた複雑な制御も可能です!これは夢が広がりングですね!

これらの機能を組み合わせることでControlRigを使った手指の開閉制御ができてしまいます。
簡単ですね!早速やってみましょう!

ControlRigで手の開閉を実装してみる

手の開閉制御は色んなやり方・テクニックがあるかと思いますが、今回はリリースノートにある例に従います。

まずはグーパーの動きを実装してみます。といっても、ループ制御を使えばこんな簡単に実装できます!
ちなみに、ChildrenのInclude ParentRecursiveは、前者は返すCollecitonに親を含めるか(今回だとItemsで指定しているボーン)、後者は連鎖的に抽出した子要素をCollectionに含めるかです。そのため、ONOFFの違いで制御結果が大きく変わってくるのでご注意ください。
f:id:pafuhana1213:20201203024251p:plain
www.youtube.com


次に、各指の根本のボーンを制御して横(?)方向に開く制御を組んでみます。
↓の動画にもある通り、Controlの回転量をそのまま各ボーンに渡してしまうと指の開閉制御にはなりません。「中指はあまり動かさない」「人差し指と小指・薬指は回転方向が逆」という処理が必要になります。

Branchノードなどを使って指毎に処理・パラメータを変更することでも実装可能ですが、先程ご紹介したEvaluate Curveを活用することで下図のように少ないノード数で実装することできます。
f:id:pafuhana1213:20201203021935p:plain
www.youtube.com

以上です!簡単!ループ機能最高です!!!

さいごに

UE4.25以前では指毎にノードを配置する必要があり大変でしたが、UE4.26で入ったループ機能を使うことで手の開閉を簡単に実装することができました。今回は手の開閉を例としましたが、同じように複数の似たような階層を制御したいケースにも応用が効くはずです。

ただし、実際にプロジェクトで使用する際はより細かな調整は必要になるかと思います。例えば指毎に回転量を微妙に変えたり、回転量に制限をかけたりなどです。ただそういった制御も今回ご紹介した方法を活用することで比較的に楽に実装できるかと思います。

是非色々試してみてください!おしまい。