Open3

DVRSDKで作成したアプリをVRM1.0に対応させる

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

目的

  • VRM0.xを導入したアプリで、DVRSDKを導入していた。2022/9にVRM1.0へのアップデートが行われるということで、DVRSDKの方も対応が必要
  • DVRSDKは開発が終了していると思われるが、キャリブレーション周りでお世話になっているのでそのまま対応できればと思っている
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

まずやったこと

  • VRM0.x時点のUniVRMをプロジェクトから削除し、VRM1.0に対応したUniVRMを読み込む(UniVRMではなくVRMという名前になるかな)
  • namespaceのエラーがメインの大量のエラーが出力される
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

using VRMの解消


これを以下のようにに変更

// 変更前
using VRM;

// 変更後
using UniVRM10;

VRMFirstPersonの解消

変更対象ファイル: Assets/DVRSDK/DVRAvatarCalibrator/Scripts/Tracking/FinalIKCalibrator.cs

これを以下のように変更
参考ファイル: Assets/VRM10/Runtime/Components/FirstPerson/Vrm10FirstPersonLayerSettings.cs

// 変更前
VRMFirstPerson.THIRDPERSON_ONLY_LAYER

// 変更後
Vrm10FirstPersonLayerSettings.DEFAULT_THIRDPERSON_ONLY_LAYER

VRMFirstPersonの廃止により

変更対象ファイル: Assets/DVRSDK/DVRAvatarCalibrator/Scripts/Tracking/FinalIKCalibrator.cs

// 変更前
            var vrmFirstPerson = currentModel.GetComponent<VRMFirstPerson>();
            var firstPersonTarget = new GameObject("FirstPersonTarget");
            GeneratedGameObjects.Add(firstPersonTarget);
            firstPersonTarget.transform.SetParent(vrmFirstPerson.FirstPersonBone, false);

// 変更後
            var vrmFirstPerson =animator.GetBoneTransform(HumanBodyBones.Head);
            var firstPersonTarget = new GameObject("FirstPersonTarget");
            GeneratedGameObjects.Add(firstPersonTarget);
            firstPersonTarget.transform.SetParent(vrmFirstPerson, false);

VRMFirstPerson.FirstPersonOffsetが廃止された

// NOTE: VRM 1.0 では firstPersonBone は廃止され, Head Bone 固定になります.
// NOTE: VRM 1.0 では firstPersonBoneOffset は FirstPerson 拡張ではなく LookAt 拡張の OffsetFromHeadBone に移行します.

// 変更前
            // FirstPersonOffsetがデフォルト値の時は参考にならないのでそれっぽい目の位置を設定する
            if (vrmFirstPerson.FirstPersonOffset == new Vector3(0, 0.06f, 0))
            {
                vrmFirstPerson.FirstPersonOffset = new Vector3(0, 0.04f, 0.085f);
            }
            firstPersonTarget.transform.localPosition = vrmFirstPerson.FirstPersonOffset;

// 変更後
            // offsetFromHeadがデフォルト値の時は参考にならないのでそれっぽい目の位置を設定する
            Vector3 offsetFromHead = currentModel.GetComponent<Vrm10Instance>().Vrm.LookAt.OffsetFromHead;
            if (offsetFromHead == new Vector3(0, 0.06f, 0))
            {
                offsetFromHead = new Vector3(0, 0.04f, 0.085f);
            }
            firstPersonTarget.transform.localPosition = offsetFromHead;