Control Rig を実ゲーム環境に使用してみる

# 初めに

UE5で正式実装される予定のアニメーションシステム「Control Rig」を使って、ゲームシーンでどのように使用するのかを、
実際に開発中のインディーゲーム「地罰上らば竜の降る」に組み込んでみた事例を例に紹介していきます。

:::note info
「地罰上らば竜の降る」はHytacka氏が制作しているソウルライクアクションゲームです。
筆者の私はプログラマーを担当しています。
:::

![ss0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/37febaa3-5000-67cf-aad9-7b51d7b8b90d.jpeg)
# 諸注意

- Control Rig は **β版** であるため、一部仕様が変化したり、不具合が発生する可能性があります。
- **UE4.27.1** の内容です。また上記理由により 正式版となった UE5 以降や UE4.27 以前で表示や機能が異なるなどの違いがあります。
- ゲームでの実装に必要と思ったときに調べ始めたため不足している点や間違った説明などがあるかもしれません。
- 後述する Hand IK そのものの実装方法については割愛しています。
- **記事に使用されている各スクリーンショットはゲーム開発中のものであり、今後変更されます（断言）**

# Control Rig って？
Control Rig は、 UE4.21 頃から存在するプラグインで、 **UE5 にて正式実装されている**機能です。

https://docs.unrealengine.com/4.27/ja/AnimatingObjects/SkeletalMeshAnimation/ControlRig/

具体的には、複雑なボーン構造を IK で自由に制御したり、 Control という制御用のポイントを作って複雑な動き (手の開き具合やモーフ処理など) を簡単に制御することができます。

:::note info
IK とは、 Inverse Kinematics 、つまり末端のボーンの位置を修正し、そこに至るまでの各ボーンの角度を調整する制御方法のこと。
例えば関節人形の胴体を持ち、手の部分を上下左右に引っ張ると、肩や肘などの手（動かしている部分）までに至る関節が連動して動きます。 IK はこの動きを再現するものです。
:::

これらの動きをシーケンサ上で制御してアニメーションを作り、そのままムービーに使用したり、アニメーションアセットに変換して使用することも可能です。つまり、**アニメーションツールを使用せずエディタ内で完結することが可能**になります！

また、 UE4.26 では既存のアニメーションアセットを解析して Control Rig での制御で動きを再現、修正できるようにすることも可能になり、さらにリターゲットが必要だった異なるボーン構造でも同一のコントロールリグを使ってアニメーションを行うことも可能になりました！

:::note info
上記で言う「異なるボーン構造」とは、基本骨格部分の構造及び名称が同一で、全体のボーンの数などが異なる程度の差異を言います。
Control Rig で制御するボーンが存在しないスケルタルメッシュには正しく動作しません。
:::

この辺りの情報は、以下の記事が詳しく紹介されているので詳しく知りたい方はそちらをお読みください。

https://pafuhana1213.hatenablog.com/entry/ControlRig-Inversion

:::note warn
実験的機能の時期が長く続いてきたためか、（執筆時点では） Unreal Engine のドキュメントでも最新の情報が少なく内容が古いものも混じっているため、一から調べる際は注意が必要です。
:::

# ゲーム内での Control Rig の使い方
本記事では、武器を掴む行為の Hand IK 処理を Control Rig で実装した方法を紹介します。
シーケンサやアニメーションの修正での使用方法についてはほぼ触れません。

## 使用するにあたってハマりがちな問題集

### 1. 難しそう
初めて触り始めた時、下記の画像を見てこう思う人がいるはず。
![ss1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/360849ec-781b-8967-3bd5-b25cdb61a856.jpeg)

**難しそう...**

はい、実際難しいです。ですが恐れることはありません。

上記画像は、 Unreal Engine 公式サンプルアセット「コントロールリグ マネキン」の設定済み Control Rig アセットを実プロジェクトで使用するキャラクターに設定したものになっています。

https://www.unrealengine.com/marketplace/ja/product/control-rig-mannequin

この状態で既に制御が可能になっています（右手を上げているところ）。つまりここからムービー（シーケンサ）のアニメーション制御やアニメーションアセットの修正に使用することができます！簡単ですね。

:::note warn
このように簡単に使えるようになるのは、<strong> Unrial Engine のマネキンアセットのボーン名と構造が一致した互換性のあるもののみです。</strong>
異なる構造の場合は、その構造用にグラフを構成する必要がありますが、この記事では触れません。
:::

### 2. これどうやってゲームに使うの？
このように用意した Control Rig アセットですが、これをどのようにゲーム上で使うのか？
（先に述べたシーケンサのアニメーション制御やアニメーションアセットの修正を除く）
![ss2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/e70aa79b-6563-fc8e-708e-3a8e130a100c.jpeg)

...実は先に説明した構成済み Control Rig アセットは**使いません！**

:::note info
構成済み Control Rig アセットはシーケンサ等のアニメーション制御用に使います。
:::

というのも、基本的に Control Rig の機能そのものは、複数のボーンの角度（位置）をより単純に制御することが可能になる、というものなので、**アニメーションアセットを置き換えるものではない**のです。
ゲーム内ではむしろ、既存のアニメーションを容易に補正することができるようになるのです。

アニメーションBPを弄り回してる方ならわかると思いますが、オーバーレイのような加算アニメーションブレンド（に相当する処理）をリアルタイムで制御できます。

つまり、実際にゲーム内で使う機能に沿った Control Rig アセットを（状況に応じて複数）用意することになります。

本記事では上記画像の様な、刺さっている武器を掴む手を補正する、いわゆる Hand IK での使い方を説明します。

## Control Rig vs AnimBP
実装方法の説明の前に、もう一つ気になるであろう疑問について。

アニメーションBP（以降 AnimBP ）には `Two Bone IK` ノードという、 IK 用のアニメーションノードがあります。
![ss3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/610ef245-c15d-a57d-88cc-613612aba500.jpeg)

左が従来の IK ノード、 右が Control Rig を使うノードです。

「既にあるなら Control Rig 使わなくてもいいのでは？」
そう疑問に思うかもしれません。

しかし Control Rig には大きな武器があります。それは「**速度と柔軟性**」です。

Control Rig は、専用の仮想マシンによって処理が最適化されており、 AnimBP による処理と比べて軽快に動作するという特徴を持ちます。

単純な IK を実装する場合は（１、２ノード程度の差では）恩恵は少ないですが、追加の補正を掛けたり、フルボディ IK を使用する場合は大きな差が生まれます。

:::note info
本当は速度比較を検証したかったのですが、時間が取れなかったので割愛します。
また、 Control Rig 機能の最適化はまだ進んでいるため、 UE5 正式搭載時ではより高速に処理される可能性が高いです。
:::

柔軟性においては、２つの優位点があります。

１つ目は、 IK で位置を調整した後、その末端のボーンの向き補正などを行う際、 AnimBP では補正するためのノードをボーン毎に用意し、それぞれに計算した値を用意して渡す必要がありますが、  Control Rig ではそれらの補正も Control Rig 内で完結できるため、アニメーショングラフがスッキリします。
またこれにより別の AnimBP でも再利用できるようにもなります。

もう一つは調整時のイテレーションで、 Control Rig の編集はマテリアル編集時のようにリアルタイムで反映されます。
AnimBP ではコンパイルを挟む必要が多いため、その分の短縮は様々な負担の軽減に繋がります。


最後に、 AnimBP が優る点について。
ごく単純な IK を実装するだけならわざわざ Control Rig アセットをセットアップする必要性はありません。
つまり、ごく単純な IK を実装するだけ（大事なことなので繰り返す）という目的であれば AnimBP で完結するほうが実装が早く、 AnimBP に軍配が上がります。


# Control Rig を使った武器掴みの実装方法（本記事のメイン）

では、ここから本記事メインとなる実装方法を紹介します。
![ss4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/b05bc439-845a-88b8-f06d-680de9b7bbba.jpeg)

こちらが現在実装している武器掴み用 Control Rig アセットの中身です。
グラフ内のノード数は専用に組んであるため量は少なめです。
（それでも多く見えるのは主要ノードのサイズが大きいだけです）

プレビュー画面に見える赤や緑、水色の単色で表示されているものそれぞれが Control です。
これらの座標や角度等の値を取得し、グラフ内で IK 補正するのがこのアセットの今回の用途です。

細かい実装方法については公式ドキュメントにあるため割愛します。
が、先述の通り UE4.27 のドキュメントは（執筆時点で）古いままだったりするので、ほとんどの差異のない [UE5 版のドキュメント](https://docs.unrealengine.com/5.0/ja/control-rig-in-unreal-engine/) を参照すると良いでしょう。

## Setup Event
![ss5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/65b3ccd2-9064-5824-62c3-7082e33bfe9a.jpeg)
`Setup Event` は、 Control Rig アセットが使用される前に最初に実行される、主に各コントロールの初期設定を行います。
このアセットではプレビュー用の操作をセットアップするために、デフォルト座標を設定済みの外部からの入力用変数から取得・設定しています。
この処理はプレビュー画面用であり、ゲーム中には影響しません。

ちなみに `Set Transform - Control` にある Space 欄の `Global Space` は、 Control Rig 内でのグローバル空間、つまりワールド空間ではないため、グローバル空間の座標を設定する場合、 `From World` ノードを使用して変換する必要があります。

## Forward Solve
![ss6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/c726f066-22b7-afe4-814e-fe95f4e64dac.jpeg)

`Forward Solve` は、 Control Rig のメインの処理になります。プレビュー画面でも実際にここから実行されており、上記画像部分ではプレビュー用設定かどうか、掴む手の使用の有無に応じて分岐させています。

プレビュー用設定の分岐は必ずしも必要ではありませんが、 現時点では **AnimBP からの入力に Control へ直接値を送るような機能がない**ため、外部入力を使用するかどうかの bool 値`InEditorPreview` を用意して切り替えています。

:::note info
各ノードがブループリントのものと少し形が違うように見えますが、先述の通り独自の最適化実装により全く別の実装になっている関係によるもののようです。
しかし使い方は同じなので惑わずに使えるはずです。
:::

:::note warn
Transform 型などの変数を使用する際、中身を分割して利用できますが、そのピンを複数のノードへ繋げられない場合があります。
これはおそらく不具合ですが、この場合は変数ノードを複数用意して対処できます。
:::

### Basic IK
![ss7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/45aee41f-cd41-b1b6-8ef0-4686a5ae3caa.jpeg)
上記箇所が Hand IK 処理のメイン部分となります。

**IK として補正処理しているのは右側にある紫色のデカイノード（Basic IK）のみ**です。そこにつながってる左側の全ては位置・回転補正のための Transform の計算です。

AnimBP の `Two Bone IK` ノードよりも複雑ですが、より細かい制御を行えるようになっています。

以下に `Basic IK` ノードの主要な項目について簡単に説明します。即時反映するので実際に触ってみたほうが理解が早いかもしれません。

| 引数名 | 使い方 |
|:-:|:-:|
|`Item A, Item B, Effector Item`|それぞれ、根本、中間、先端に相当する項目（普通はボーン）を指定します。 `HandIK` の一般的な構成の場合、上腕（肩）、下腕（肘）、手首の順となります。|
|`Effector`|先端部分の補正先トランスフォーム座標。この座標に向かって上記の各箇所が補完されます。|
|`Primary Axis`|根元から先端への方向軸ベクトルです。使用するスケルトンアセット（ALS等）によっては修正が必要な箇所です。基本的にはリファレンスポーズ上の根本から中間に向かうローカル座標軸に合わせます。|
|`Secondary Axis`|`Primary Axis`に対して横方向の方向軸ベクトルです（多分）。主にねじれに関する補正に使用されます。|
|`Pole Vector`|中間項目の位置補正に使う、２つ目の補正座標です。`Hand IK`では肘の向きに影響します。|
|`Pole Vector Space`|`Pole Vector`に Control の座標を利用する場合はこちらを指定します。|
|`Enable Stretch`|これを`true`にすると、各補正位置に一致するようにボーンが伸縮するようになります。キャラクターに対しては使うことはないでしょう。|
|`Weight`|`Besic IK`処理のブレンド率。`Two Bone IK`の`Alpha`に相当します。|
|`Propagate to Children`|`Effector Item`以降の子要素（ボーン）に補正を適用するかどうか。キャラクターのような指やつま先にもボーンがあるような構造に対しては`true`になります。|

### IK 補正中の持ち替えアニメーション処理
通常の Hand IK では単純に対称座標へ補正をかけるだけで済みますが、今回の実装では、刺さっている武器を掴んだ後、**引き抜く前に掴む方向を変える**というアニメーションが挟んでいます。

そのため、単純な実装だけですと、掴み替えるときに手を引っ込めたり捻らないというおかしな挙動になります。
以下に比較GIFを用意しました。
![c3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/09f7c9fe-41ed-052a-ecd2-7a958000ea66.gif)
左がアニメーションそのまま、中央が単純に実装した場合、右が現実装の（アニメーションに合わせて補正座標を移動させた）ものとなります。

単純なIKだとトランスフォームが完全に固定されているために握り直しているだけのような挙動になっています。（抜いた瞬間の剣の向きもおかしいですね）

現実装版はまだ改善の余地はありますが、元アニメーションの挙動とほぼ同じになっています。

ちなみにどのように実現しているかというと、手首を捻る割合と手を引っ込む割合をアニメーションカーブとして対象のアニメーション（モンタージュ）に設定し、その値を Control Rig で読み取り、座標を修正しています。

## AnimBP との連携
このように用意した Control Rig を AnimBP と連携させるには、アニメーショングラフで Control Rig ノードを使用します。
![ss8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/d86a95d7-8225-1fe3-4b43-c74074d59a96.jpeg)
使用する Control Rig アセットを選択すると、 Control Rig で用意した公開設定の変数をピンとして入力できるようになります。
これにより、 Control Rig で必要な情報を渡すことで様々なアニメーションを Control Rig で行うことができます。

![ss9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512539/51452b76-b868-94e3-bee1-74cb46fb448f.jpeg)
Control Rig ノードの詳細タブでは、入力に使用するピンを選択できる他に、アニメーションカーブを入力に指定することも可能です。

:::note warn
出力設定も存在しますが、現時点では Control Rig の出力ピンはノードに出現しないようです。
:::

:::note warn
**追記 :** UE5 正式版では、Control Rig ノードの詳細タブにカーブを選択できなくなっています。代わりに Control Rig グラフ内でカーブを参照する必要があります。
:::

# 最後に
この記事は、一般の Foot IK 、 Hand IK 実装記事にはない「IK を維持したまま対象部分がアニメーションで移動する（離れる）ようにするにはどうすれば良いか？」について作ってみたという主旨のものになります。

また、図解に開発中データの利用を許可頂いた Hytacka 氏の開発 Youtube チャンネルと Steam ストアページのリンクを以下に置かせていただきます。

https://www.youtube.com/channel/UCZfaov6xJNH4jdEbchCSGyw

https://store.steampowered.com/app/1795510/Rise_of_Rebellion/

それと、ノードの線がまっすぐになっているのは以下のプラグインを使用しているためです。
見やすくなるので個人的にもおすすめです。

https://www.unrealengine.com/marketplace/ja/product/electronic-nodes

## 追伸
今回のアドカレ、意外と Control Rig 系を予定した記事が少ないですね。~~前準備が難しいからかな？~~
この記事で活用の場が広まればよいのですが。