From 4f1872d5f0d8d548aca1a94309c00556f5c85900 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 15 May 2024 03:51:38 +0900 Subject: [PATCH] =?UTF-8?q?Capsule=E3=81=AE=E5=BD=93=E3=81=9F=E3=82=8A?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=E3=82=92=E4=BF=AE=E6=AD=A3=20#2291?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../System/UpdateFastSpringBoneJob.cs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 8da06bef0..87e5e16d4 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -156,24 +156,31 @@ namespace UniVRM10.FastSpringBones.System BlittableLogic logic, ref Vector3 nextTail) { - var P = (worldTail - worldPosition).normalized; + var direction = worldTail - worldPosition; + if (direction.sqrMagnitude == 0) + { + // head側半球の球判定 + ResolveSphereCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail); + return; + } + var P = direction.normalized; var Q = headTransform.position - worldPosition; var dot = Vector3.Dot(P, Q); if (dot <= 0) { // head側半球の球判定 ResolveSphereCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail); + return; } - - var t = dot / P.magnitude; - if (t >= 1.0f) + if (dot >= direction.magnitude) { // tail側半球の球判定 ResolveSphereCollision(joint, collider, worldTail, headTransform, maxColliderScale, logic, ref nextTail); + return; } // head-tail上の m_transform.position との最近点 - var p = worldPosition + P * t; + var p = worldPosition + P * dot; ResolveSphereCollision(joint, collider, p, headTransform, maxColliderScale, logic, ref nextTail); }