diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index abaa213c4..bcf573c5c 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -172,6 +172,10 @@ namespace UniVRM10 return BlittableColliderType.Sphere; case VRM10SpringBoneColliderTypes.Capsule: return BlittableColliderType.Capsule; + case VRM10SpringBoneColliderTypes.Plane: + return BlittableColliderType.Plane; + case VRM10SpringBoneColliderTypes.SphereInside: + return BlittableColliderType.SphereInside; default: throw new ArgumentOutOfRangeException(); } diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 495f7eecb..5a442e35e 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -92,7 +92,7 @@ namespace UniVRM10.FastSpringBones.System break; case BlittableColliderType.Plane: - ResolvePlaneCollision(joint, collider, worldPosition, headTransform, maxColliderScale, logic, ref nextTail); + ResolvePlaneCollision(joint, collider, colliderTransform, logic, ref nextTail); break; case BlittableColliderType.SphereInside: @@ -262,24 +262,37 @@ namespace UniVRM10.FastSpringBones.System // let direction = -normalize(delta); } + /// + /// SpringのJoint(head-tail)のとColliderの衝突処理。 + /// nextTail が変化しうる。 + /// + /// joint + /// collier + /// colliderTransform.localToWorldMatrix.MultiplyPoint3x4(collider.offset); + /// jointのhead + /// Mathf.Max(Mathf.Max(Mathf.Abs(colliderScale.x), Mathf.Abs(colliderScale.y)), Mathf.Abs(colliderScale.z)); + /// joint + /// verlet 積分による tail の移動予定 private static void ResolvePlaneCollision( BlittableJoint joint, BlittableCollider collider, - Vector3 worldPosition, - BlittableTransform headTransform, - float maxColliderScale, + BlittableTransform colliderTransform, BlittableLogic logic, ref Vector3 nextTail) { - // let transformedOffset = colliderOffset * colliderTransform; - // let transformedNormal = normalize(colliderNormal * normalMatrixFrom(colliderTransform)); - // let delta = jointPosition - transformedOffset; + var transformedOffset = colliderTransform.localToWorldMatrix.MultiplyPoint(collider.offset); + var transformedNormal = colliderTransform.localToWorldMatrix.MultiplyVector(collider.tailOrNormal).normalized; + var delta = nextTail - transformedOffset; - // // ジョイントとコライダーの距離。負の値は衝突していることを示す - // let distance = dot(delta, transformedNormal) - jointRadius; + // ジョイントとコライダーの距離。負の値は衝突していることを示す + var distance = Vector3.Dot(delta, transformedNormal) - joint.radius; - // // ジョイントとコライダーの距離の方向。衝突している場合、この方向にジョイントを押し出す - // let direction = transformedNormal; + if (distance < 0) + { + // ジョイントとコライダーの距離の方向。衝突している場合、この方向にジョイントを押し出す + var direction = transformedNormal; + nextTail -= direction * distance; + } } } } \ No newline at end of file