diff --git a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs index 3ea06e72d..28bee0632 100644 --- a/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs +++ b/Assets/VRM10/Runtime/FastSpringBone/System/UpdateFastSpringBoneJob.cs @@ -1,3 +1,4 @@ +using System; using Unity.Collections; using Unity.Jobs; using UnityEngine; @@ -106,7 +107,7 @@ namespace UniVRM10.FastSpringBones.System if (parentTransform.HasValue) { var parentLocalToWorldMatrix = parentTransform.Value.localToWorldMatrix; - headTransform.localRotation = (Quaternion.Inverse(parentTransform.Value.rotation) * headTransform.rotation).normalized; + headTransform.localRotation = Normalize(Quaternion.Inverse(parentTransform.Value.rotation) * headTransform.rotation); headTransform.localToWorldMatrix = parentLocalToWorldMatrix * Matrix4x4.TRS( @@ -134,6 +135,15 @@ namespace UniVRM10.FastSpringBones.System } } + /// + /// BurstではMathfがエラーを吐くため、内部でMathfを呼ばないNormalizeを自前実装 + /// + private static Quaternion Normalize(Quaternion q) + { + var num = (float)Math.Sqrt(Quaternion.Dot(q, q)); + return num < float.Epsilon ? Quaternion.identity : new Quaternion(q.x / num, q.y / num, q.z / num, q.w / num); + } + private static void ResolveCapsuleCollision( Vector3 worldTail, Vector3 worldPosition,