From 24b2aa18a9f38bbc2b013982d74448746dd84ff7 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 18 Jul 2025 21:49:44 +0900 Subject: [PATCH] =?UTF-8?q?VRM10SpringBoneJoint=20=E3=81=AB=20angle=20limi?= =?UTF-8?q?t=20=E8=A8=AD=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=80=81runtime=20=E3=81=AB=E5=8F=8D=E6=98=A0?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpringBoneJobs/Anglelimit/Anglelimit.cs | 12 +++--- .../Blittables/BlittableJointMutable.cs | 14 +++---- .../SpringBone/VRM10SpringBoneJointEditor.cs | 39 +++++++++++++++++++ .../SpringBone/VRM10SpringBoneJoint.cs | 28 ++++++++++++- .../Springbone/FastSpringBoneBufferFactory.cs | 7 +--- 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Anglelimit/Anglelimit.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Anglelimit/Anglelimit.cs index b91e3bd77..178ab3d23 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Anglelimit/Anglelimit.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Anglelimit/Anglelimit.cs @@ -18,26 +18,26 @@ namespace UniGLTF.SpringBoneJobs case AnglelimitTypes.Cone: { var angleSpaceToWorld = anglelimitSpaceToWorld(logic, joint, parentRotation); - var tailDir = math.mul(math.inverse(angleSpaceToWorld), nextTail - head); + var tailDir = math.mul(math.inverse(angleSpaceToWorld), math.normalize(nextTail - head)); tailDir = AnglelimitCone.Apply(tailDir, joint.anglelimit1); - return math.mul(angleSpaceToWorld, tailDir); + return head + math.mul(angleSpaceToWorld, tailDir) * logic.length; } case AnglelimitTypes.Hinge: { var angleSpaceToWorld = anglelimitSpaceToWorld(logic, joint, parentRotation); - var tailDir = math.mul(math.inverse(angleSpaceToWorld), nextTail - head); + var tailDir = math.mul(math.inverse(angleSpaceToWorld), math.normalize(nextTail - head)); tailDir = AnglelimitHinge.Apply(tailDir, joint.anglelimit1); - return math.mul(angleSpaceToWorld, tailDir); + return head + math.mul(angleSpaceToWorld, tailDir) * logic.length; } case AnglelimitTypes.Spherical: { var angleSpaceToWorld = anglelimitSpaceToWorld(logic, joint, parentRotation); - var tailDir = math.mul(math.inverse(angleSpaceToWorld), nextTail - head); + var tailDir = math.mul(math.inverse(angleSpaceToWorld), math.normalize(nextTail - head)); tailDir = AnglelimitSpherical.Apply(tailDir, joint.anglelimit1, joint.anglelimit2); - return math.mul(angleSpaceToWorld, tailDir); + return head + math.mul(angleSpaceToWorld, tailDir) * logic.length; } default: diff --git a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs index d6566a659..ccc69d2b6 100644 --- a/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs +++ b/Assets/UniGLTF/Runtime/SpringBoneJobs/Blittables/BlittableJointMutable.cs @@ -43,16 +43,16 @@ namespace UniGLTF.SpringBoneJobs.Blittables float3 gravityDir = default, float dragForce = 0, float radius = 0, - // anglelimit - float alType = 0, - float limit1 = 0, - float limit2 = 0, - quaternion offset = default) + // v0.129.4 anglelimit + float angleLimitType = 0, + float angleLimit1 = 0, + float angleLimit2 = 0, + quaternion angleLimitOffset = default) { var c0 = new float4(stiffnessForce, gravityPower, dragForce, radius); var c1 = new float4(gravityDir, 0); - var c2 = new float4(alType, limit1, limit2, 0); - var c3 = offset.value; + var c2 = new float4(angleLimitType, angleLimit1, angleLimit2, 0); + var c3 = angleLimitOffset.value; _data = new float4x4(c0, c1, c2, c3); } } diff --git a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs index ad4a5cd42..e3a55fe7e 100644 --- a/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs +++ b/Assets/VRM10/Editor/Components/SpringBone/VRM10SpringBoneJointEditor.cs @@ -15,6 +15,10 @@ namespace UniVRM10 private SerializedProperty m_gravityDirProp; private SerializedProperty m_dragForceProp; private SerializedProperty m_jointRadiusProp; + private SerializedProperty m_angleLimitType; + private SerializedProperty m_angleLimitRotation; + private SerializedProperty m_angleLimitAngle1; + private SerializedProperty m_angleLimitAngle2; private Vrm10Instance m_root; @@ -32,6 +36,10 @@ namespace UniVRM10 m_gravityDirProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_gravityDir)); m_dragForceProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_dragForce)); m_jointRadiusProp = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_jointRadius)); + m_angleLimitType = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_anglelimitType)); + m_angleLimitRotation = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_angleLimitRotation)); + m_angleLimitAngle1 = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_angleLimitAngle1)); + m_angleLimitAngle2 = serializedObject.FindProperty(nameof(VRM10SpringBoneJoint.m_angleLimitAngle2)); m_root = m_target.GetComponentInParent(); } @@ -39,6 +47,7 @@ namespace UniVRM10 static bool m_showJoints; static bool m_showColliders; static bool m_showJointSettings; + static bool m_showAnglelimitSettings; public override void OnInspectorGUI() { @@ -75,6 +84,36 @@ namespace UniVRM10 Vrm10EditorUtility.LimitBreakSlider(m_jointRadiusProp, 0.0f, 0.5f, 0.0f, Mathf.Infinity); } + // + // angle limiet + // + m_showAnglelimitSettings = EditorGUILayout.Foldout(m_showAnglelimitSettings, "AngleLimit Settings(dev)"); + if (m_showAnglelimitSettings) + { + EditorGUILayout.PropertyField(m_angleLimitType); + switch ((UniGLTF.SpringBoneJobs.AnglelimitTypes)m_angleLimitType.enumValueIndex) + { + case UniGLTF.SpringBoneJobs.AnglelimitTypes.None: + break; + + case UniGLTF.SpringBoneJobs.AnglelimitTypes.Cone: + EditorGUILayout.PropertyField(m_angleLimitRotation); + EditorGUILayout.PropertyField(m_angleLimitAngle1); + break; + + case UniGLTF.SpringBoneJobs.AnglelimitTypes.Hinge: + EditorGUILayout.PropertyField(m_angleLimitRotation); + EditorGUILayout.PropertyField(m_angleLimitAngle1); + break; + + case UniGLTF.SpringBoneJobs.AnglelimitTypes.Spherical: + EditorGUILayout.PropertyField(m_angleLimitRotation); + EditorGUILayout.PropertyField(m_angleLimitAngle1); + EditorGUILayout.PropertyField(m_angleLimitAngle2); + break; + } + } + if (serializedObject.ApplyModifiedProperties()) { if (Application.isPlaying) diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs index 4467d2a0b..5a18457a4 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneJoint.cs @@ -26,12 +26,38 @@ namespace UniVRM10 [SerializeField] public float m_jointRadius = 0.02f; + [SerializeField] + public UniGLTF.SpringBoneJobs.AnglelimitTypes m_anglelimitType; + + [SerializeField] + public Quaternion m_angleLimitRotation = Quaternion.identity; + + [SerializeField, Range(0, Mathf.PI)] + public float m_angleLimitAngle1 = Mathf.PI; + + [SerializeField, Range(0, Mathf.PI)] + public float m_angleLimitAngle2 = Mathf.PI; + public BlittableJointMutable Blittable => new BlittableJointMutable( stiffnessForce: m_stiffnessForce, gravityPower: m_gravityPower, gravityDir: m_gravityDir, dragForce: m_dragForce, - radius: m_jointRadius); + radius: m_jointRadius, + // v0.129.4 + angleLimitType: (float)m_anglelimitType, + angleLimit1: m_angleLimitAngle1, + angleLimit2: m_angleLimitAngle2, + angleLimitOffset: m_angleLimitRotation + ); + + void Oalidate() + { + if (m_angleLimitRotation == default) + { + m_angleLimitRotation = Quaternion.identity; + } + } void AddJointRecursive(Transform t, VRM10SpringBoneJoint src) { diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Springbone/FastSpringBoneBufferFactory.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Springbone/FastSpringBoneBufferFactory.cs index b763e4697..e0430d6da 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Springbone/FastSpringBoneBufferFactory.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Springbone/FastSpringBoneBufferFactory.cs @@ -59,12 +59,7 @@ namespace UniVRM10 .Select(joint => new FastSpringBoneJoint { Transform = joint.transform, - Joint = new BlittableJointMutable( - radius: joint.m_jointRadius, - dragForce: joint.m_dragForce, - gravityDir: joint.m_gravityDir, - gravityPower: joint.m_gravityPower, - stiffnessForce: joint.m_stiffnessForce), + Joint = joint.Blittable, DefaultLocalRotation = GetOrAddDefaultTransformState(joint.transform).LocalRotation, }).ToArray(), }).ToArray();