From f453c0ea6a8545755b47ee3ef97915a9707b53df Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 30 May 2022 11:53:32 +0900 Subject: [PATCH 1/3] set init rotation --- .../FastSpringBone/InputPorts/FastSpringBoneInstanceBuffers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneInstanceBuffers.cs b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneInstanceBuffers.cs index b93a2b7bc..84186af62 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneInstanceBuffers.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/InputPorts/FastSpringBoneInstanceBuffers.cs @@ -108,7 +108,7 @@ namespace UniVRM10.FastSpringBones.System parentTransformIndex = parent != null ? transformIndexDictionary[parent] : -1, currentTail = currentTail, prevTail = currentTail, - localRotation = Quaternion.identity, + localRotation = joint.Transform.localRotation, boneAxis = localChildPosition.normalized, length = localChildPosition.magnitude }); From d4ae062ae4b10a2d25f0fc1169261006124034f1 Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 30 May 2022 14:18:39 +0900 Subject: [PATCH 2/3] apply collider scale --- .../FastSpringBone/FastSpringBone10.asmdef | 3 ++- .../System/UpdateFastSpringBoneJob.cs | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Assets/VRM10/Runtime/FastSpringBone/FastSpringBone10.asmdef b/Assets/VRM10/Runtime/FastSpringBone/FastSpringBone10.asmdef index 70ab6d305..d36c9bedd 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/FastSpringBone10.asmdef +++ b/Assets/VRM10/Runtime/FastSpringBone/FastSpringBone10.asmdef @@ -1,7 +1,8 @@ { "name": "FastSpringBone10", "references": [ - "GUID:2665a8d13d1b3f18800f46e256720795" + "GUID:2665a8d13d1b3f18800f46e256720795", + "GUID:d8b63aba1907145bea998dd612889d6b" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 336fc7ce9..19b6ead2f 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -1,6 +1,7 @@ using System; using Unity.Collections; using Unity.Jobs; +using Unity.Mathematics; using UnityEngine; using UniVRM10.FastSpringBones.Blittables; #if ENABLE_SPRINGBONE_BURST @@ -76,16 +77,18 @@ namespace UniVRM10.FastSpringBones.System { var collider = Colliders[colliderIndex]; var colliderTransform = Transforms[collider.transformIndex + logic.transformIndexOffset]; + var colliderScale = colliderTransform.localToWorldMatrix.lossyScale; + var maxColliderScale = math.max(math.max(math.max(colliderScale.x, colliderScale.y), colliderScale.z), 0); var worldPosition = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); var worldTail = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.tail); switch (collider.colliderType) { case BlittableColliderType.Sphere: - ResolveSphereCollision(joint, collider, worldPosition, headTransform, logic, ref nextTail); + ResolveSphereCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail); break; case BlittableColliderType.Capsule: - ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, logic, ref nextTail); + ResolveCapsuleCollision(worldTail, worldPosition, headTransform, joint, collider, maxColliderScale, logic, ref nextTail); break; } } @@ -150,6 +153,7 @@ namespace UniVRM10.FastSpringBones.System BlittableTransform headTransform, BlittableJoint joint, BlittableCollider collider, + float maxColliderScale, BlittableLogic logic, ref Vector3 nextTail) { @@ -159,19 +163,19 @@ namespace UniVRM10.FastSpringBones.System if (dot <= 0) { // head側半球の球判定 - ResolveSphereCollision(joint, collider, worldPosition, headTransform, logic, ref nextTail); + ResolveSphereCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail); } var t = dot / P.magnitude; if (t >= 1.0f) { // tail側半球の球判定 - ResolveSphereCollision(joint, collider, worldTail, headTransform, logic, ref nextTail); + ResolveSphereCollision(joint, collider, worldTail, headTransform, maxColliderScale, logic, ref nextTail); } // head-tail上の m_transform.position との最近点 var p = worldPosition + P * t; - ResolveSphereCollision(joint, collider, p, headTransform, logic, ref nextTail); + ResolveSphereCollision(joint, collider, p, headTransform, maxColliderScale, logic, ref nextTail); } private static void ResolveSphereCollision( @@ -179,15 +183,16 @@ namespace UniVRM10.FastSpringBones.System BlittableCollider collider, Vector3 worldPosition, BlittableTransform headTransform, + float maxColliderScale, BlittableLogic logic, ref Vector3 nextTail) { - var r = joint.radius + collider.radius; + var r = joint.radius + collider.radius * maxColliderScale; if (Vector3.SqrMagnitude(nextTail - worldPosition) <= (r * r)) { // ヒット。Colliderの半径方向に押し出す var normal = (nextTail - worldPosition).normalized; - var posFromCollider = worldPosition + normal * (joint.radius + collider.radius); + var posFromCollider = worldPosition + normal * r; // 長さをboneLengthに強制 nextTail = headTransform.position + (posFromCollider - headTransform.position).normalized * logic.length; } From 7c0df2aa1ec0805ba552b2ff962081c2e3322eba Mon Sep 17 00:00:00 2001 From: amamagi Date: Mon, 30 May 2022 18:22:08 +0900 Subject: [PATCH 3/3] small change --- .../Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 19b6ead2f..5b3a5a61e 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -78,7 +78,8 @@ namespace UniVRM10.FastSpringBones.System var collider = Colliders[colliderIndex]; var colliderTransform = Transforms[collider.transformIndex + logic.transformIndexOffset]; var colliderScale = colliderTransform.localToWorldMatrix.lossyScale; - var maxColliderScale = math.max(math.max(math.max(colliderScale.x, colliderScale.y), colliderScale.z), 0); + var absColliderScale = math.abs(colliderScale); + var maxColliderScale = math.max(math.max(absColliderScale.x, absColliderScale.y), absColliderScale.z); var worldPosition = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); var worldTail = colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.tail);