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/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 }); diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 336fc7ce9..5b3a5a61e 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,19 @@ namespace UniVRM10.FastSpringBones.System { var collider = Colliders[colliderIndex]; var colliderTransform = Transforms[collider.transformIndex + logic.transformIndexOffset]; + var colliderScale = colliderTransform.localToWorldMatrix.lossyScale; + 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); 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 +154,7 @@ namespace UniVRM10.FastSpringBones.System BlittableTransform headTransform, BlittableJoint joint, BlittableCollider collider, + float maxColliderScale, BlittableLogic logic, ref Vector3 nextTail) { @@ -159,19 +164,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 +184,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; }