Open12

VR対応メモ VRM対応

やぶからぼーやぶからぼー

VRMFirstPersonで一人称視点用のモデル対応ができる。一人称視点で邪魔になる頭部のレイヤーを設定してくれる。

VRMFirstPerson.Setup()

でヘッドレスになる。使いたいMainCameraのマスクを対応させれば良い。レイヤーマスクは固定で9が使われる。

やぶからぼーやぶからぼー

VRMFirstPersonCameraManagerっていうクラスも良いされてるみたいだけど、どういうクラスなのかはよく見てない。

やぶからぼーやぶからぼー

両手をVRのコントローラに追従させるのは簡単でIKを使う。FinalIKは不要。むしろパフォーマンスが悪化するみたいな投稿も見た。

やぶからぼーやぶからぼー

VRMモデルのAnimationControlarのBaseModelレイヤーの歯車ボタンを押下してIKPassを有効化する。Scriptで設定する方法は不明。全部RuntimeでやるならScriptからやる必要があると思うが一旦Pend

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IKTest : MonoBehaviour
{
    [SerializeField] Animator animator;
    [SerializeField] float weight;
    [SerializeField] GameObject leftHandTarget;
    [SerializeField] GameObject rightHandTarget;
    [SerializeField] VRM.VRMFirstPerson VRMFirstPerson;

    private void Start()
    {
        this.VRMFirstPerson.Setup();
    }

    void OnAnimatorIK(int layerIndex)
    {
        animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight);
        animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight);
        animator.SetIKPosition(AvatarIKGoal.LeftHand, this.leftHandTarget.transform.position);
        animator.SetIKRotation(AvatarIKGoal.LeftHand, this.leftHandTarget.transform.rotation);        
        
        animator.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
        animator.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
        animator.SetIKPosition(AvatarIKGoal.RightHand, this.rightHandTarget.transform.position);
        animator.SetIKRotation(AvatarIKGoal.RightHand, this.rightHandTarget.transform.rotation);        
    }
}

やぶからぼーやぶからぼー

クラスターだと両手の長さのキャリブレーションをやるけど、たしかに位置は少しずれる。VRMモデルの腕の長さと人間の腕の長さが異なるせいだと思うけど、プレゼンスを重視せずとりあえず動かしたい程度の要求なら上記のコードで全然許容できる。

やぶからぼーやぶからぼー

頭部のトラッキングよりも胸のトラッキングが必要っぽい。
胸の位置を推定してモデルの胸の高さをあわせる。高さに合わせて足を曲げてしゃがませたりする。モデルの頭部の回転と位置のトラッキングは限定的になるっぽい。

やぶからぼーやぶからぼー

AnimatorのApplyRootMotionを無効化、FootIKを有効化してTargetとなるGameObjectを接地させたち地面に配置。その状態でVRMモデルの位置を下げると、VRMモデルは足を曲げる。これで胸の高さを変えてHMDの高さに合わせられる?

やぶからぼーやぶからぼー

Meta(Facebook)のアバターは工夫されてる様子。第三者から見た場合は下半身が存在するけど、自分で自分の体を見ると、上半身のみで足が存在しない。起立と着座で視点の高さは当然変わるけど、第三者からみたアバターの姿勢は変わらない。Clusterだと高さをあわせるために起立か着座で設定を変更する必要があるけど、このFacebookの仕組みなら設定を変える必要はない。良い仕組みかも。VRChatみたいにアバター同士で接近して絡むみたいなのは無理になるかもだけど、結構良い気がする。