From 952730c446123062c989cc7675eb8eb2d10070fe Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 24 Sep 2024 18:06:56 +0900 Subject: [PATCH 1/2] =?UTF-8?q?lookAt=20=E3=81=AF=20root=20=E3=81=A8?= =?UTF-8?q?=E5=90=8C=E3=81=98=E5=90=91=E3=81=8D=E3=81=8C=E5=88=9D=E6=9C=9F?= =?UTF-8?q?=E5=A7=BF=E5=8B=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LookAtOriginTransform.rotation = instance.transform.rotation; --- .../Components/Vrm10Runtime/Vrm10Runtime.cs | 2 +- .../Vrm10Runtime/Vrm10RuntimeLookAt.cs | 35 ++++++++++--------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 1e74ccca6d..fbe655c633 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -56,7 +56,7 @@ public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBone 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 c7b3d0c1df..72a07711b9 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeLookAt.cs @@ -38,13 +38,25 @@ public sealed class Vrm10RuntimeLookAt : ILookAtEyeDirectionProvider /// public Transform LookAtOriginTransform { get; } - internal Vrm10RuntimeLookAt(VRM10ObjectLookAt lookAt, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig) + internal Vrm10RuntimeLookAt(Vrm10Instance instance, UniHumanoid.Humanoid humanoid, Vrm10RuntimeControlRig controlRig) { - _lookAt = lookAt; - LookAtOriginTransform = InitializeLookAtOriginTransform( - humanoid.Head, - controlRig != null ? controlRig.GetBoneTransform(HumanBodyBones.Head) : humanoid.Head, - _lookAt.OffsetFromHead); + _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; + _lookAtOriginTransformLocalPosition = LookAtOriginTransform.localPosition; _lookAtOriginTransformLocalRotation = LookAtOriginTransform.localRotation; @@ -96,17 +108,6 @@ public void SetYawPitchManually(float yaw, float pitch) return (yaw, pitch); } - private static Transform InitializeLookAtOriginTransform(Transform rawHead, Transform actualHead, Vector3 eyeOffsetValue) - { - // NOTE: このメソッドを実行するとき、モデル全体は初期姿勢(T-Pose)でなければならない。 - var lookAtOrigin = new GameObject("_look_at_origin_").transform; - lookAtOrigin.SetParent(actualHead); - lookAtOrigin.position = rawHead.TransformPoint(eyeOffsetValue); - lookAtOrigin.rotation = Quaternion.identity; - - return lookAtOrigin; - } - #region Obsolete [Obsolete("Use " + nameof(LookAtOriginTransform))] public Transform GetLookAtOrigin(Transform head) From 4f8e98e065b6a159b91d74c2d21226374074398a Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 25 Sep 2024 15:32:11 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82InitializeLookAtOriginTransform?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Vrm10Runtime/Vrm10RuntimeLookAt.cs | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) 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)