【Unity】1点トラッキング+Final IKでVRMを動かす
Unityで1点トラッキングのみの入力でFinal IKをつかってVRM(Humanoid)をそれなりに動かす方法。
1点のトラッキングのため全身をあまり綺麗に動かせないので,バストアップの利用を想定する。
1点トラッキング,頭のみのトラッキングでVTuberをやるときのメモ。1点トラッキングはVRヘッドセットでも,TrueDepthカメラでもOpenCVをつかった推測でもなんでもOK。
今回は手は予め決めた位置で固定しているが,アニメーションさせたりしてもFinal IKがよしなにやってくれるので便利。Final IKのパラメータについてもメモする。
Env.
Windows10 64bit
Unity2019.4.17f1
Final IK 2.0
UniVRM 0.63.2
Method
VRMモデルをインポート
標準的なヒト型のモデルを用意する。極端に大きすぎたり小さすぎたり,特殊な形状のモデルだと綺麗に動くようにするための模索が必要になる。
こんな感じ。kawaii
Final IKのインポート
機能モリモリのアセット,Final IKをインポート。
VR IKをセットアップ
シーンにVRMモデルを置き,VR IKコンポーネントを追加する。
VRMモデルとは別に
- HeadTarget
- LeftHandTarget
- RightHandTarget
をプリミティブオブジェクトなり,空のオブジェクトなりで配置する。
今回は後で分かりやすいようにプリミティブオブジェクトを追加して,Rendererコンポーネント類を削除した。
後で手の位置も調整しやすいようにHandTargetPivotというものも手のターゲットの親として作成した。
ここからVR IKの細かい設定
まず,大半は大丈夫だとは思うがVR IKのReferencesがちゃんと設定されていなかったら,適宜自分でインスペクターの変数にTransformをアタッチする。特定の骨が設定されていないと動かない。
VR IKのSolverの中のSpine.HeadTargetとLeftArm.TargetとRightArm.Targetに作成した3つのターゲットをアタッチする。
アタッチされたら実行してみる。
こうなったらOK。細かい設定に進む。もしも手が変なことになっていたら,LeftTargetとRightTargetを間違えていないかを確かめる。
VR IKのパラメータを設定
主要なパラメータのみメモを残す。
好みに合わせてパラメータを設定すると良いと思う。
Spine
Position Weight : 頭の位置をHeadTargetにどのくらい依存させるかのパラメータだが,全身を見せたいときはかなり大きくこのパラメータが作用するが,バストアップ利用時はモデルをオブジェクトのRootごと前後左右に動かした方が綺麗なので0にする。(後述)
Pelvis Rotation Weight : 頭の回転にどのくらいPelvis(骨盤)から下が回転の影響を受けるかのウェイト値。0に近いほど頭と胴体が同じ方向を向くようになり,1に近いほど頭だけが向きを変えるようになる。ヒトの頭が任意の方向に向くときには,ある程度身体自体の向きも変わることを考えながら設定。
Body Rot Stiffness : 頭の回転に体がどのくらい追従するかの設定。Pelvis Rotation Weightの設定と合わせて設定すると,少し機械的な動きが緩和されるといった感じ?0に近いほど1度大きく頭の向きを変えると,体はずっとその方向を向くようになり,1に近いほどPelvis Rotation Weightの値が0のときのような,頭と胴体がずっと同じ方向を向くようになる。
Neck Stiffness : Body Rot Stiffnessに似ている
Chest Clamp Weight : 頭の向きにどのくらいChest(胸)の向きが影響されるかの値。0に近いほど影響して,1に近いほど胸の向きが制限されて,頭の向きとは分離した動きになる印象。
Head Clamp Weight : そこそこ重要な値。頭の向きを制限する。0に近いほどHeadTargetの向きをそのまま反映するようになり,1に近いほど頭の向く方向を制限できる。0にしてしまうと頭が360度回るようにもなるので,それを考慮しながら設定。
Hand
ほとんど初期値通り。バストアップの場合手を動かす場合は設定が必要だが,1点トラッキングの場合は隠れてしまうので,今回は設定を省く。
Leg
バストアップなので設定を省く。
Locomotion
Weightのみ設定。本来は歩幅や足の動く速度を設定することによって,足の動きを自動的にやってくれるようになるが,バストアップのためWeightは0に設定。
動作テスト
向きのみ追従するようになる。位置については今回はVRMモデル自体をスライドさせて対応させる。
補正用のパラメータを用意
首の向きの調整はHeadTargetのTransformを何かしらの式で足すなり引くなりしてあげれば対応可能。
続きは気が向いたら書く。