VRChatでkawaiiムーブを極める - VRIK Override

# kawaiiを極めるために
VRChat標準のVRIKだと、ビクトリーポーズのときに脇が外側に張ってしまい、かわいくありません。

![脇が甘い.png](https://qiita-image-store.s3.amazonaws.com/0/97681/b321517e-32e7-f826-5d53-fb31342a7235.png)

そこでVRIKのパラメータを調整してOverrideすると、こんな感じにかわいくなります。

![かわいいピース.png](https://qiita-image-store.s3.amazonaws.com/0/97681/77b11a1d-2a05-7588-6478-d8497643ee62.png)

ひざを内股にしたり、手を上げたときの脇と肩のねじれ？も改善できたりします。
これを実現するのが、この記事で紹介するVRIK Overrideです。（いま命名）

# VRIK Override
VRChat標準のVRIKの設定を上書きします。
まだ研究中なので、不要な手順とかもあるかもしれません。ぜひご指摘ください！
今後の課題もクリティカルなのが大量にあります。
モデルは[シャーロちゃん](https://tomori-hikage.booth.pm/items/987296)で動作確認しています。

## 必要なもの
* Unity
* VRChat SDK
* Final IK (Unity Asset Storeで$99くらい)

## 基本のセットアップ
1. Unity, VRChat SDK, Final IKをセットアップしておく
2. VRC_AvatarDescriptorと同じGameObjectにVRIKを追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/54148342-3cfb-8dc0-d7c4-0a4c35153da5.png)
3. Skinned Mesh RendererのついているGameObjectを無効化する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/dd91a0fb-dffd-36d7-2fc9-ea2767a02f46.png)
4. Dynamic Bone, Dynamic Bone Colliderをすべて削除する（不必要に重くなるのを防げるかもしれないのでやっておく）
5. キャラクターのPrefabを、VRC_AvatarDescriptorがついているGameObjectの子に追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/808a1662-7e7e-0be0-0737-a6c060b686c5.png)
6. VRIKとIK Execution Orderを、追加したPrefabのルート(上図 Shaclo Custom VRIK)に追加
7. 追加したPrefabのルートからAnimatorを削除
8. IK Execution OrderのIK Componentsを、親のVRIK、子のVRIKの順番で追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/ed51a5d9-3a4a-e7e5-3074-3c55621006fa.png)
9. 子のVRIKのHead TargetとPelvis Targetを、親のHead, Pelvisに設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/a5a56655-3792-49de-a1ba-c7d2984b8302.png)
10. 左手、右手、左足、右足のTargetも、親のボーンに指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/ecccc6ed-51ef-9ef5-83af-ae40787766e8.png)
11. LocomotionはWeightを0にしておく（うまく動いてくれない）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/ae031cbe-b13c-7439-d936-3b54f3c09f81.png)
12. VRC_AvatarDescriptorのFace Meshを子のSkinnedMeshRendererに差し替える
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/588ca231-1f8f-40ec-467d-29626d26f256.png)
13. VRC_AvatarDescriptorのView Positionを少し前に持ってくる（一人称視点で頭が邪魔になってしまう）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/7bc04deb-82ad-487c-1690-2bfd8aa30b22.png)

## あとは調整！
ここからはお好みで。別のシーンを作ってエディタ上で調整できるようにしておくと、はかどります。
全パラメータについての詳細はここでは解説しません。

1. Left/Right ArmのSwivel Offsetをいい感じに調整する。これで脇が締まる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/d0731a7d-1e3f-6c1a-7495-9937035f14ac.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/c9e9f96d-cae0-0eec-1fe1-23fbf43ea720.png)
2. Shoulder Rotation ModeをFrom Toにすると、手を上げたときに肩のねじれがなくなる気がする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/7935152f-23a7-362b-56d1-3ce882c8662e.png)
3. Left/Right LegのSwivel Offsetをいい感じに調整する。これで内股になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/d28dd560-96de-9d7f-eb4e-95ea41eff1e1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97681/cb08ceeb-969e-e6b7-937c-7671b85a69e0.png)

## 仕組み
思いついたきっかけはこの投稿。
https://vrcat.club/threads/making-final-ik-behave-correctly-on-avatars.1449/

VRC_AvatarDescriptionのとなりにVRIKを仕込んでおくと、VRChatはそのVRIKを使ってくれるため、IK Execution Orderが期待通りに動く。ただし、設定したパラメータはすべて上書きされてしまう。
では、VRChatのVRIKのあとに自前のVRIKが動けば、こっちで設定したパラメータで動くのでは？ IK Targetを、VRChat側のVRIKが解決したあとのボーンにすれば、手や頭のトラッキングはできる…かも！ という発想です。

## いろいろ試してだめだったやつ
* Animation OverrideでVRIKのパラメータをいじ…れない
    * VRIKのパラメータはIKSolverVRクラスの子にあるので、Animatableでない。
* IK Followerを自前VRIKのターゲットにする
    * IK Followerの位置を描画してみたら、ぜんぜん期待通りの位置にない。
    * IK Followerは回転を保持していないらしい…。
* 親の不要なSkinnedMeshRendererのついたGameObjectを削除する
    * VRChat側のVRIKが子のスケルトンを参照してしまった
* PelvisのIK Targetを指定しないでおいたら、特定の角度で不連続に体が回ってしまった

# 今後の課題
* 重くない？ 大丈夫？
* 一人称視点で頭が邪魔になる。頭のSkinnedMeshRendererのRootBoneを親のHeadにすればいい？ でもそれって体とずれない？
* なんか腰や足がふらふらして安定しないことがある？
* 指が動かないので、CCDIKとか使ってやる？
    * Finger Rig, Finger PoseはUploadで弾かれてしまう
    * 親のAnimatorから子のAnimatorのHumanBoneをアニメーションできない。IK使う？ Joint使う？
* 目やまぶたが動かないので、自前でアニメーション組んで再生する？
* 表情を変えるなど既存のAnimation Overrideが動かない。変換スクリプト書く？

ご意見、ご提案はコメントや [Twitter @tyounanmoti](https://twitter.com/tyounanmoti) まで。お待ちしております！