From b8ae94ddea3b0282f0a2ac5b6b096e22a5d419b6 Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 27 Jun 2022 13:26:36 +0900 Subject: [PATCH] use cached local rotation for spring bone calculation --- .../Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs | 12 +++++++++++- .../InputPorts/FastSpringBoneBuffer.cs | 2 +- .../FastSpringBone/InputPorts/FastSpringBoneJoint.cs | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index 07adca4d6..7c1d11a61 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -112,11 +112,21 @@ namespace UniVRM10 gravityDir = joint.m_gravityDir, gravityPower = joint.m_gravityPower, stiffnessForce = joint.m_stiffnessForce - } + }, + DefaultLocalRotation = GetOrAddDefaultTransformState(joint.transform).rotation }).ToArray(), }).ToArray()); } + private (Vector3 position, Quaternion rotation) GetOrAddDefaultTransformState(Transform tf) + { + if (m_defaultTransformStates.TryGetValue(tf, out var defaultTransformState)) + { + return defaultTransformState; + } + return m_defaultTransformStates[tf] = (tf.position, tf.rotation); + } + private static BlittableColliderType TranslateColliderType(VRM10SpringBoneColliderTypes colliderType) { switch (colliderType) diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs index 84186af62..89df4753b 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneBuffer.cs @@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1, currentTail = currentTail, prevTail = currentTail, - localRotation = joint.Transform.localRotation, + localRotation = joint.DefaultLocalRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude }); diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs index 7aff7cf71..98d1a8e65 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneJoint.cs @@ -9,5 +9,6 @@ namespace UniVRM10.FastSpringBones.System { public Transform Transform; public BlittableJoint Joint; + public Quaternion DefaultLocalRotation; } } \ No newline at end of file