自作人型コンロールリグを作ろう 

# コントロールリグとは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0b43be0f-a6ca-6a72-ce1c-4b06a1165b66.png)
コントロール リグ (Control Rig) は、アーティストフレンドリーなインターフェースを備えた、柔軟で動的なプロシージャル キャラクターを作成するためのツールをリガーに提供するために設計されたノードベースのリギング システムを有効にします。しかし、ブループリントとは異なり、コントロール リグはブループリント仮想マシン (VM) を利用せず、独自の軽量な VM を使用してコードを変換します (大抵はコピーと実行)。ユーザーは、 リグ ユニット と呼ばれるノードをコントロール リグ グラフで接続することにより、ランタイム リグとアニメーション リグを作成することができます。（公式ドキュメントより）

### リグとは？
スキニングまでおこなえば、3Dモデル自体を動かすことは可能です。ただ、スケルトンやメッシュ自体を逐一移動させアニメーションを作る必要があるため、非常に手間が掛かります。
そのため、よりアニメーションを簡易化するために追加のリグの設定（リギング）をしていきます。リギングによりアニメーターがキャラクターを直感的に分かりやすく、動かせるようになります。

https://3d-modely.com/blog/animation/rigging/

要はボーンが入ったメッシュをよりアニメーションさせやすくするのがリグ、リグをつける作業がリギング、UEではリグをControlRigというシステムでつくる。ということです（多分）

なるほど便利や。しかし思いました。
##### 公式のMannyのControlRig、設定項目が多すぎる。
腰を曲げるにも５個くらいパラメーターを操作しないといけないし膝とかもIKと膝の向き両方設定しないといけない。こんなの一個一個フレーム打っていたら時間がかかってしょうがありません。

よっしゃ少ない項目でいい感じにしてくれるControlRigつくったろ。リグ一回作れば一生使えるし。

そういう記事です。

今回の記事では、__FullBodyIKのボーンの制限が動いたり動かなくなったりと安定しないことから選択的に「5.2」を使用しています。5.2以降のバージョンを使用した場合、まったく違った動作をする可能性が高いです。__
再現する方はご注意ください。

### 今回の記事でできるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/641f462d-6045-9336-6377-2ed7b78b0d67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/b842e821-8e33-a124-7c7d-fc65ff50edb8.png)

今回の記事でできるものは計19個のコントロールでいい感じにするControlRigです。
制御点
・Root
・腰
・頭
・右手
・左手
・右足
・右足つま先
・左足
・左足つま先
・両手指10本

### ページリンク
[ControlRigの前提知識](#controlrigの前提知識)
[コントロールリグのコントロールを追加するには？](#コントロールリグのコントロールを追加するには)
[ボーンやコントロールを取得する](#ボーンやコントロールを取得する)
[ControlRigを組む](#controlrigを組む)
[コントロールの追加](#コントロールの追加)
[Forwards Solve側](#forwardssolve側)
[Backwards Solve編](#backwardssolve編)
[いざベイク](#いざベイク)


# ControlRigの前提知識

## Forwards Solve/Backwards Solve　って何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/487f9ba5-b0d5-c09e-b55c-5c6602275828.png)
公式ドキュメント　ソルブの方向

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/control-rig-forwards-solve-and-backwards-solve-in-unreal-engine?application_version=5.3

ざっくりいうと

・Forwards Solve　→　コントロールからボーンへの働きかけ
・Backwards Solve　→　ボーンからコントロールへの働きかけ

です。
アニメーションを作るときはコントロールを動かしてボーンをうごかすのでForwards Solveで、逆にアニメーションをコントロールリグにベイクするときはボーンの位置からコントロールを決定しているのでBackwards Solveになります。

## コントロールリグのコントロールを追加するには？
コントロールリグのコントロールはリグ階層の空白かボーンを選択した状態で右クリックし、新規→新しいコントロールを選ぶと追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/3c486a1f-bf71-05c8-1963-41e7c4ae9edc.png)

ボーンを選択した状態でコントロールを追加すると、選択されていたボーンが親になります。
ボーンが親の状態だとコントロール自由に動かせないので、親から解除する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/6432c812-2cf9-9881-5e9a-7e2223b7557d.png)
コントロールを選択して親から解除を選ぶことで解除することができます。

ショートカット

コントロールを追加
・Ctrl+N
親から解除
・Shift+P

またボーンを複数選択した状態で新規→Add Controls For Selectedを選ぶことでまとめてコントロールを追加することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/6b23298c-a00d-5dbb-a8fe-60988da0c1c1.png)

## ボーンやコントロールを取得する

ボーンやコントロールなどはBluePrintなどの変数と同じような感じで選択→ドラッグ＆ドロップすることでGet・Setを行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0247930c-5ca6-e7a9-3b76-27f628775ba4.png)

# ControlRigを組む
#### 今回のRigの基本方針
・できる限り少ないポイント数で
・おおむね使うポイントを制御
・ベイクもできる

#### 基本構造
指→指全体の曲げ伸ばしのみ対応（第一関節から第三関節まで同じ角度を入力）
Body→FullBodyIKでおおむね対応
足→つま先だけは表現に必要そうなのでつける

## コントロールの追加

以下のボーンにコントロールを追加します
・Root
・pelvis
・head
・hand_r
・hand_l
・Foot_r
・Foot_l
・ball_R
・ball_l
・各指の第一関節のあたり

コントロールを親子付け（BluePrintのコンポーネントの親子付けと同じ感じでいけます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/823ac7f1-d16f-e477-e472-f48c779dfc06.png)
このような階層構造になるようにしてください。
見た目はどれでも構いません。

各指、つま先はコントロールを選び「現在からOffsetトランスフォームを設定」を選んで詳細タブ→トランスフォームがすべて0（原点）になるようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/5f9b963b-148e-789f-9333-1fa851dc0449.png)

「現在からOffsetトランスフォームを設定」を実行すると、一部のコントロールの向きが180度逆向きになります。
そのままでも問題ありませんが、気になる場合は詳細の __「形状」__ の方から角度を設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/4ec4f6b6-ea64-1f04-164e-3b077b1d1399.png)


## ForwardsSolve側
今回作るControlRigの全体像です。
![CR_SuperRig-Rig Graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/70dee7fa-7f27-6cca-7d16-3a6f2aa4e342.png)

Forwards Solveから始まりSequenceで分岐しています。

### Root
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/cca6ea69-934a-a31f-b908-fbc5a61ada8b.png)

RootのコントロールからTransformを取ってボーンのTransfromにセット

### 指
![CR_SuperRig-Rig Graph_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/8f7de4af-2d20-6bb0-950f-7bd42ae98d0e.png)

指の位置座標とコントロールの角度の座標を合成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/13469d9e-0f6b-6e55-5aad-3d1e0779d9d0.png)
Transfromを開くと分解することができます。

指のコントロールはすべての関節につかえるよう現在からOffsetトランスフォームを設定してしまっているので、GetとSetを両方ともTypeを「Local Space」にしておきます。

これをすべての指の全関節分行います。
設定し終わると指が伸びきった状態になっていると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/d333d0b8-e4de-5ea7-cc58-5e858ea3df16.png)


### 腰
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/a28ab85c-e0a7-394d-2490-3d7b33d284d5.png)
腰もRootと同じようにコントロールのTransformを取ってPelvisのTransformに入力しています。
FullBodyIKでも腰のエフェクターを取っているので一見いらないように見えるのですが、これを入れないと腰をねじることができなくなります。

### つま先
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/1512390a-3e6a-37c5-df40-301be03a61c6.png)

指と同じように、ボーンから位置座標を取り、コントロールから角度を取ってボーンに入力しています。
これを設定すると、おそらくつま先が天を仰いでると思いますが正解です![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/358ba345-d185-e3aa-f700-e6e024d21c86.png)

### FullBodyIK
フルボディIKは一番最後に設定するのがおすすめです。
↓全体像
![CR_SuperRig-Rig Graph_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/855c0119-342b-3686-9496-db663e1198c6.png)
##### Root
Pelvisを選んでください。
##### Effectors
FullBodyIKが通る座標を入力する場所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f42a0097-4625-20ff-a968-b1c201da29d9.png)
「+」の配列要素の追加を押して配列を6個追加してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0bf2c67b-a887-5aa0-da0f-deb125e4fbcf.png)
・head
・Pelvis
・hand_r
・hand_l
・foot_r
・foot_l
のコントロールを取得して入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/37f3b5da-36f0-f5e9-ad84-8f86fd2b993b.png)

##### Bone Settings
これだけですでに動きます。が、このままだと膝が逆方向に曲がったり方が垂直に上がったり愉快な動きをします。のでBone Settingsで優先的に曲がる方向を設定したりBoneの動きやすさを設定していきます。


各パラメータ

Rotation Stiffness :曲がりにくさ
position Stiggness :うごきにくさ
XYZの :自由に動く/角度内に制限/ロック　から制御できる
preferred Angles :優先的に曲がる角度(膝とかに使う）　上のUse preferred Angles がTrueでないとしようされません


__以下のパラメータはあくまでも筆者が動かしやすいや～となるように設定しているので必要に応じてカスタマイズして下さい__
##
・pelvis（腰）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e8d0d7af-96df-2090-7c11-b0ef0b8c5b1e.png)
Rotation Stiffnessを1にしてください

・Spine_05（肩の付け根の背骨）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0d0234e0-6836-dec4-8a68-5196a223f976.png)
Rotation Stiffnessを1にしてください

・Spine_01（pelvisの一個上の背骨）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/64645f70-2a19-ee42-0105-366a6c6ee598.png)
preferred Anglesを使用し、Z90方向に優先的に曲がるようにしてください。

・neck_01（Spine_05の一個上の首）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/fb8eca8e-2acd-6b77-4c3f-f54bbd2324b7.png)
Rotation Stiffnessを0.9にしてください

・clavicle(両肩分作ってください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/efee7389-7dc7-bc10-ea1d-0295317254ee.png)
Rotation Stiffnessを1にしてください

・upperarm(両腕分作ってください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/c396142e-d9c4-878c-e04c-9cc212e61420.png)
position Stiggnessを1にしてください
preferred Anglesを使用し、Y30方向に優先的に曲がるようにしてください。

・calf（両膝分作ってください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/c64545ab-7133-2dd4-8f93-b461e67483ba.png)

ZにMin0Max90の制限をかけて下さい

・thigh(両足分作ってください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f36b3930-bf11-54c6-bdbd-94a248c2bdc4.png)
Rotation Stiffnessを0.8にしてください
YにMin0Max40の制限をかけて下さい
preferred Anglesを使用し、Z-100方向に優先的に曲がるようにしてください。
##
Bone Settingsは以上です。
現状5.3以降でこのBone Settingsがうまく動作しない（特にRotation Stiffness)が確認されています。

##### Excluded Bones
全く動かないボーンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0a14b5df-46f8-3c2f-8bed-3980c8c29b88.png)
今回は
・spine_02
・spine_03
・spine_04
・neck_02
を追加します。

これでForwards Solve側の設定は完了です。
レベルにD＆Dするとすでにシーケンサーで動かすことができます。

## BackwardsSolve編
次はBackWardsSolve（アニメーションをベイクするときに使う側です。
↓全体像
![CR_SuperRig-Rig Graph_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e216073e-46be-532a-b225-1ee6d509ca88.png)

Forwards Solveに比べてなんと少ないのでしょう。

こちらもBackwards Solve Solveから始まりSequenceで分岐しています。
順番的には
Root→FullBodyIKのコントロールの設定→指→つま先
で行っていますが組み替えても大して影響はないと思います。

### Root
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e313683e-b178-51d8-8c4f-72113200447f.png)
Forwards Solveの逆です。Rootボーンを取得し、Rootのコントロールに入力しています。

### 指
![CR_SuperRig-Rig Graph_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/9e7933bf-a359-f4a5-be0c-cf668474438e.png)

コントロールリグでは __角度を分解できません__
なので全関節の角度を平均して～とかできません。
よって第二関節の角度と位置からコントロールの座標を求めることとします。第一関節はさておき第二関節が曲がっているときは大体第三関節も曲がっているので。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/28936f3d-880f-25a3-0f69-491df0f7c5fb.png)
第一関節の位置と第二関節の角度をコントロールに入力します。これをすべての指分行います。

### つま先
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/6cdddece-fa87-47b8-031a-fabb78c9b697.png)
つま先もForwards Solveの逆です。Ballボーンを取得し、各コントロールに入力しています。

### FullBodyIKの部分
![CR_SuperRig-Rig Graph_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/ea5507e9-d4f1-9e51-7441-3d4d53fc3900.png)
IKはコントロールの位置から計算してボーンを入力します。
コントロールの位置は特に理由がなければ大体各EffectorのボーンのTransfromと合致します。
つまりボーンのTransfromをそのままコントロールに入力するだけでいいのです。
RootやBallと同じように
・hand_r
・hand_l
・foot_r
・foot_l
・head
・pelvis
のボーンを取得してコントロールにTransfromを渡してください。

BackwardsSolveの設定は以上です。難しいことなんてありません。コントロールの位置を設定するだけです。

## いざベイク

二体のMannyを準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/04539562-43ff-375a-656d-11224689d632.png)
通常色側にベイクして、金色側と比較しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/367f75f7-540a-7e8c-7385-436943b83667.png)
コントロールにベイクを選ぶと、自作したものがあるはずです。(Backward Solveがないと表示されないようになっています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/93346f82-4159-5872-b787-81442c2bdef6.png)
キーの削除はお好みで

![ControlRigBakeTest.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/fff87bc7-bf21-3c55-7150-e5c145fa4099.gif)

できました。
ややはみ出していたりあってない部分があるのがFullBodyIKの苦しいところ。まあIKでやってると思うと（個人的には）妥当な範囲です。気になる人はいい設定を追求してみてください。そして筆者に教えてください。（大声）

最後までお読みいただきありがとうございました。