From ed7b0955bcd56ba34bbf19a3248ec3cdde20f648 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 12 Oct 2020 17:00:58 +0900 Subject: [PATCH] fix SphereCollider. fix gizmo --- .../Scripts/SpringBone/VRMSpringBone.cs | 48 +++++++++---------- .../SpringBone/VRMSpringBoneColliderGroup.cs | 15 ++++-- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs b/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs index 51c0a9cbb..158cf10dc 100644 --- a/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs +++ b/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.cs @@ -137,26 +137,18 @@ namespace VRM protected virtual Vector3 Collision(List colliders, Vector3 nextTail) { - var position = m_transform.position; - foreach (var collider in colliders) { - var ls = collider.transform.lossyScale; - var scale = Mathf.Max(ls.x, ls.y, ls.z); - - var r = Radius + collider.radius * scale; - var colliderPosition = collider.transform.TransformPoint(collider.center); - - if (Vector3.SqrMagnitude(nextTail - colliderPosition) > r * r) continue; - - // ヒット。Colliderの半径方向に押し出す - var normal = (nextTail - colliderPosition).normalized; - var posFromCollider = colliderPosition + normal * (Radius + collider.radius * scale); - - // 長さをboneLengthに強制 - nextTail = position + (posFromCollider - position).normalized * m_length; + var r = Radius + collider.Radius; + if (Vector3.SqrMagnitude(nextTail - collider.Position) <= (r * r)) + { + // ヒット。Colliderの半径方向に押し出す + var normal = (nextTail - collider.Position).normalized; + var posFromCollider = collider.Position + normal * (Radius + collider.Radius); + // 長さをboneLengthに強制 + nextTail = m_transform.position + (posFromCollider - m_transform.position).normalized * m_length; + } } - return nextTail; } @@ -267,10 +259,19 @@ namespace VRM public struct SphereCollider { - public Transform transform; - public Vector3 center; - public float radius; + // public Transform Transform; + public readonly Vector3 Position; + public readonly float Radius; + + public SphereCollider(Transform transform, VRMSpringBoneColliderGroup.SphereCollider collider) + { + Position = transform.TransformPoint(collider.Offset); + var ls = transform.lossyScale; + var scale = Mathf.Max(ls.x, ls.y, ls.z); + Radius = scale * collider.Radius; + } } + private List m_colliders = new List(); private void UpdateProcess(float deltaTime) { @@ -290,12 +291,7 @@ namespace VRM { foreach (var collider in group.Colliders) { - m_colliders.Add(new SphereCollider - { - transform = group.transform, - center = group.transform.TransformPoint(collider.Offset), - radius = collider.Radius, - }); + m_colliders.Add(new SphereCollider(group.transform, collider)); } } } diff --git a/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs b/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs index 27145ce2f..b6692ac74 100644 --- a/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs +++ b/Assets/VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.cs @@ -4,9 +4,9 @@ using UnityEngine; namespace VRM { - #if UNITY_5_5_OR_NEWER +#if UNITY_5_5_OR_NEWER [DefaultExecutionOrder(11001)] - #endif +#endif public class VRMSpringBoneColliderGroup : MonoBehaviour { [Serializable] @@ -33,10 +33,15 @@ namespace VRM { Gizmos.color = m_gizmoColor; Matrix4x4 mat = transform.localToWorldMatrix; + var ls = Mathf.Max( + transform.lossyScale.x, + transform.lossyScale.y, + transform.lossyScale.z + ); Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3( - 1.0f / transform.lossyScale.x, - 1.0f / transform.lossyScale.y, - 1.0f / transform.lossyScale.z + 1.0f / transform.lossyScale.x * ls, + 1.0f / transform.lossyScale.y * ls, + 1.0f / transform.lossyScale.z * ls )); foreach (var y in Colliders) {