diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs index 72a07711b9..85412e6db5 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs @@ -42,20 +42,11 @@ internal Vrm10RuntimeLookAt(Vrm10Instance instance, UniHumanoid.Humanoid humanoi { _lookAt = instance.Vrm.LookAt; - // 視点計算用の empty object - LookAtOriginTransform = new GameObject("_look_at_origin_").transform; - if (controlRig != null) - { - // controlRig に連結 - LookAtOriginTransform.SetParent(controlRig.GetBoneTransform(HumanBodyBones.Head)); - } - else - { - // 直接連結 - LookAtOriginTransform.SetParent(humanoid.Head); - } - LookAtOriginTransform.position = humanoid.Head.TransformPoint(_lookAt.OffsetFromHead); - LookAtOriginTransform.rotation = instance.transform.rotation; + LookAtOriginTransform = InitializeLookAtOriginTransform( + humanoid, + controlRig, + _lookAt.OffsetFromHead, + instance.transform.rotation); _lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition; _lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation; @@ -108,6 +99,39 @@ public void SetYawPitchManually(float yaw, float pitch) return (yaw, pitch); } + /// + /// Generate empty object for gaze calculation. + /// NOTE: このメソッドを実行するとき、モデル全体は初期姿勢(T-Pose)でなければならない。 + /// NOTE: Vrm10Instance.Runtime 呼び出しによりトリガーされる。 + /// From v0.127.0: VRM Root( Vrm10Instance が Add されている)GameObject は初期姿勢でなくてもよい #2445 + /// + /// + /// if provided parent is controlrig head else humanoid head + /// A humanoid head local offset + /// world rotation of vrm model + /// + private static Transform InitializeLookAtOriginTransform(UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig, + Vector3 eyeOffsetValue, Quaternion rootRotation) + { + var lookAtOrigin = new GameObject("_look_at_origin_").transform; + if (controlRig != null) + { + // controlRig のHeadに連結 + lookAtOrigin.SetParent(controlRig.GetBoneTransform(HumanBodyBones.Head)); + } + else + { + // humanoid のHeadに連結 + lookAtOrigin.SetParent(humanoid.Head); + } + + lookAtOrigin.position = humanoid.Head.TransformPoint(eyeOffsetValue); + // v0.127.0 + lookAtOrigin.rotation = rootRotation; + + return lookAtOrigin; + } + #region Obsolete [Obsolete("Use " + nameof(LookAtOriginTransform))] public Transform GetLookAtOrigin(Transform head)