多関節的な奴をリギングした

# はじめに
この記事は多関節系の無機物のリギングをしようぜ、という記事です。
コントロールリグのコントローラー1個で制御するアンブロポイズ（Pi●erのライト）を作ったのでそのログです。
![LS_Anglepoise.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/d1f83752-fd49-6205-42ff-1194094c9e5d.gif)

バネとかあるものはボーンを入れてリギングしてしまうと自動化できて楽です。楽しいよ！
![ControlRig - Unreal Editor 2024-07-13 21-16-41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/2e9ca4b7-2ebb-b945-c6aa-0f2134680406.gif)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f93e316c-3622-040f-c470-ee938d17c3a3.png)

環境
・UE5.3.2
・Blender3.6

# モデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f19dfaf4-88bf-e81a-46da-dd4d566c19e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/39295d5e-31cb-7a1e-797a-522112104f7b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0aa3f365-bd67-e447-258f-bad528bf1d86.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/70fc280d-789f-79a7-7a53-34620ceb20a1.png)
Head（ライト）まで一連でつながったボーンを組んでいます

# リギング
設計方針としては、
1.ライトの位置を決める
2.ライトの位置に追従したアームから他パーツの位置を決める

です。
### Controlを追加する
コントロールを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/eb3bfedb-8e77-c943-e076-40921e14a0dd.png)

Head：ライトのコントロールです。動かすときに使用する部分です。
UnderSingleArm_ctrl：親から解除せずUpperArmに追従するようにします。Rootとつながっていない真ん中のUnderSingleArmの位置を決めるのに使用します。
Right/Middle/Left Spring_end_Point：バネの移動しない方の端の位置に置いておきます。

## Construction Event
今回はばねの伸縮のためにばねのボーンの初期の長さを保存しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e8c6896a-04ab-4fba-6ecc-28b0d70ad087.png)
Get Double Spring Lengthの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/33f5abb9-9dd2-5baa-dc34-da53407aa35a.png)
右側のばねのボーンとそのバネの終了地点のコントロールからLengthを取って保存しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/128fd767-6808-e33e-4b8a-08cdb4d0eff7.png)
シングルも同じような感じです。

## Forwards Solve

### ライトの位置からArmを動かす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/57295389-a109-a4dc-d898-eb5f932eb7de.png)

IKにはBasic FABRIKを使用します。
precisionはEffectorとの誤差になり、小さいものだとカクツキが露骨に出るので0にしておきます。

### UnderSingleArmの位置をUpperArmのコントロールの位置に合わせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/a555839b-dd3e-d299-bf6d-32ece4b5dbce.png)

UpperArmに追従しているコントロールからTransfromを取り使用しています。

### ばねの伸縮を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/c54c9d41-5a95-0441-7ca1-58c9ebcaa327.png)
ばねの伸縮を行う部分です。現状ばねがArmに追従して浮いてしまうので固定側を押さえつけていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/9131a45a-a2cb-e922-f53f-4ebbec7b09e0.png)

Basic FABRIKでばねの端のコントロールをEffectorに指定してばねの位置を合わせます。
これを左右中央の３つ分行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/8ed8bfcf-db09-6586-9316-be248dadab1c.png)
続いて初期値と今のばねの長さを比較して、ばねのボーンを伸縮させていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/fe0f9946-0a59-ced6-7ab5-cef06841b40c.png)
今のばねのボーンの開始地点と終了地点の距離を求める関数÷初期値で割合を出します。
こちらもすべてのバネの分行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/51e33dbb-f26f-e220-9057-1eb1d2f65cd2.png)

# 完成
![ControlRig - Unreal Editor 2024-07-14 15-56-42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/cd41c3b3-e7ae-c991-9ba4-fd28e141a13f.gif)
動くアングルポイズが完成しました。Boothに使用したモデルを置いておきますので是非遊んでみてください。
↓今回使用したモデル
https://gisulove.booth.pm/items/5916817