From e7b5d23690391f443d15841658f918fea88b0bf0 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Fri, 17 Feb 2023 17:43:20 +0900 Subject: [PATCH] Add a LookAtOrigin transform to ControlRig. --- .../Components/Vrm10Runtime/Vrm10Runtime.cs | 2 +- .../Vrm10Runtime/Vrm10RuntimeLookAt.cs | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 07e419ede..6850b680b 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -63,7 +63,7 @@ namespace UniVRM10 ControlRig = new Vrm10RuntimeControlRig(target.Humanoid, m_target.transform, controlRigInitialRotations); } Constraints = target.GetComponentsInChildren(); - LookAt = new Vrm10RuntimeLookAt(target.Vrm.LookAt, target.Humanoid, m_head); + LookAt = new Vrm10RuntimeLookAt(target.Vrm.LookAt, target.Humanoid, ControlRig); Expression = new Vrm10RuntimeExpression(target, LookAt, LookAt.EyeDirectionApplicable); var instance = target.GetComponent(); diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs index fef7e15d0..f2fec3410 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs @@ -30,11 +30,13 @@ namespace UniVRM10 /// public Transform LookAtOriginTransform { get; } - internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Transform head) + internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig) { _lookAt = lookAt; - _head = head; - LookAtOriginTransform = InitializeEyePositionTransform(_head, _lookAt.OffsetFromHead); + LookAtOriginTransform = InitializeLookAtOriginTransform( + humanoid.Head, + controlRig != null ? controlRig.GetBoneTransform(HumanBodyBones.Head) : humanoid.Head, + _lookAt.OffsetFromHead); _lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition; _lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation; @@ -92,17 +94,17 @@ namespace UniVRM10 return (yaw, pitch); } - private static Transform InitializeEyePositionTransform(Transform head, Vector3 eyeOffsetValue) + private static Transform InitializeLookAtOriginTransform(Transform rawHead, Transform actualHead, Vector3 eyeOffsetValue) { if (!Application.isPlaying) return null; // NOTE: このメソッドを実行するとき、モデル全体は初期姿勢(T-Pose)でなければならない。 - var eyePositionTransform = new GameObject("_eye_transform_").transform; - eyePositionTransform.SetParent(head); - eyePositionTransform.localPosition = eyeOffsetValue; - eyePositionTransform.rotation = Quaternion.identity; + var lookAtOrigin = new GameObject("_look_at_origin_").transform; + lookAtOrigin.SetParent(actualHead); + lookAtOrigin.position = rawHead.TransformPoint(eyeOffsetValue); + lookAtOrigin.rotation = Quaternion.identity; - return eyePositionTransform; + return lookAtOrigin; } #region Obsolete