diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 1e74ccca6..fbe655c63 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -56,7 +56,7 @@ namespace UniVRM10 ControlRig = new Vrm10RuntimeControlRig(instance.Humanoid, m_instance.transform); } Constraints = instance.GetComponentsInChildren(); - LookAt = new Vrm10RuntimeLookAt(instance.Vrm.LookAt, instance.Humanoid, ControlRig); + LookAt = new Vrm10RuntimeLookAt(instance, instance.Humanoid, ControlRig); Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable); SpringBone = springBoneRuntime; } diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs index c7b3d0c1d..85412e6db 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs @@ -38,13 +38,16 @@ namespace UniVRM10 /// public Transform LookAtOriginTransform { get; } - internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig) + internal Vrm10RuntimeLookAt(Vrm10Instance instance, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig) { - _lookAt = lookAt; + _lookAt = instance.Vrm.LookAt; + LookAtOriginTransform = InitializeLookAtOriginTransform( - humanoid.Head, - controlRig != null ? controlRig.GetBoneTransform(HumanBodyBones.Head) : humanoid.Head, - _lookAt.OffsetFromHead); + humanoid, + controlRig, + _lookAt.OffsetFromHead, + instance.transform.rotation); + _lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition; _lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation; @@ -96,13 +99,35 @@ namespace UniVRM10 return (yaw, pitch); } - private static Transform InitializeLookAtOriginTransform(Transform rawHead, Transform actualHead, Vector3 eyeOffsetValue) + /// + /// 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) { - // NOTE: このメソッドを実行するとき、モデル全体は初期姿勢(T-Pose)でなければならない。 var lookAtOrigin = new GameObject("_look_at_origin_").transform; - lookAtOrigin.SetParent(actualHead); - lookAtOrigin.position = rawHead.TransformPoint(eyeOffsetValue); - lookAtOrigin.rotation = Quaternion.identity; + 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; }