Unity
FinalIK
VRIK
VRChat

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

kawaiiを極めるために

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

脇が甘い.png

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

かわいいピース.png

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

VRIK Override

VRChat標準のVRIKの設定を上書きします。
まだ研究中なので、不要な手順とかもあるかもしれません。ぜひご指摘ください!
今後の課題もクリティカルなのが大量にあります。
モデルはシャーロちゃんで動作確認しています。

必要なもの

  • Unity
  • VRChat SDK
  • Final IK (Unity Asset Storeで$99くらい)

基本のセットアップ

  1. Unity, VRChat SDK, Final IKをセットアップしておく
  2. VRC_AvatarDescriptorと同じGameObjectにVRIKを追加する image.png
  3. Skinned Mesh RendererのついているGameObjectを無効化する image.png
  4. Dynamic Bone, Dynamic Bone Colliderをすべて削除する(不必要に重くなるのを防げるかもしれないのでやっておく)
  5. キャラクターのPrefabを、VRC_AvatarDescriptorがついているGameObjectの子に追加する image.png
  6. VRIKとIK Execution Orderを、追加したPrefabのルート(上図 Shaclo Custom VRIK)に追加
  7. 追加したPrefabのルートからAnimatorを削除
  8. IK Execution OrderのIK Componentsを、親のVRIK、子のVRIKの順番で追加する image.png
  9. 子のVRIKのHead TargetとPelvis Targetを、親のHead, Pelvisに設定する image.png
  10. 左手、右手、左足、右足のTargetも、親のボーンに指定する image.png
  11. LocomotionはWeightを0にしておく(うまく動いてくれない) image.png
  12. VRC_AvatarDescriptorのFace Meshを子のSkinnedMeshRendererに差し替える image.png
  13. VRC_AvatarDescriptorのView Positionを少し前に持ってくる(一人称視点で頭が邪魔になってしまう) image.png

あとは調整!

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

  1. Left/Right ArmのSwivel Offsetをいい感じに調整する。これで脇が締まる。 image.png image.png
  2. Shoulder Rotation ModeをFrom Toにすると、手を上げたときに肩のねじれがなくなる気がする image.png
  3. Left/Right LegのSwivel Offsetをいい感じに調整する。これで内股になる。 image.png image.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 まで。お待ちしております!