diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs index 1f5fe5357..8b8baa86b 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneCollider.cs @@ -10,7 +10,7 @@ namespace UniVRM10 } [Serializable] - public class VRM10SpringBoneCollider + public class VRM10SpringBoneCollider : MonoBehaviour { public VRM10SpringBoneColliderTypes ColliderType; @@ -22,5 +22,74 @@ namespace UniVRM10 /// bone local position public Vector3 Tail; + + public static void DrawWireCapsule(Vector3 headPos, Vector3 tailPos, float radius) + { + var headToTail = tailPos - headPos; + if (headToTail.sqrMagnitude <= float.Epsilon) + { + Gizmos.DrawWireSphere(headPos, radius); + return; + } + + var forward = headToTail.normalized * radius; + + var xLen = Mathf.Abs(forward.x); + var yLen = Mathf.Abs(forward.y); + var zLen = Mathf.Abs(forward.z); + var rightWorldAxis = (yLen > xLen && yLen > zLen) ? Vector3.right : Vector3.up; + + var up = Vector3.Cross(forward, rightWorldAxis).normalized * radius; + var right = Vector3.Cross(up, forward).normalized * radius; + + const int division = 24; + DrawWireCircle(headPos, up, right, division, division); + DrawWireCircle(headPos, up, -forward, division, division / 2); + DrawWireCircle(headPos, right, -forward, division, division / 2); + + DrawWireCircle(tailPos, up, right, division, division); + DrawWireCircle(tailPos, up, forward, division, division / 2); + DrawWireCircle(tailPos, right, forward, division, division / 2); + + Gizmos.DrawLine(headPos + right, tailPos + right); + Gizmos.DrawLine(headPos - right, tailPos - right); + Gizmos.DrawLine(headPos + up, tailPos + up); + Gizmos.DrawLine(headPos - up, tailPos - up); + } + + private static void DrawWireCircle(Vector3 centerPos, Vector3 xAxis, Vector3 yAxis, int division, int count) + { + for (var idx = 0; idx < division && idx < count; ++idx) + { + var s = ((idx + 0) % division) / (float)division * Mathf.PI * 2f; + var t = ((idx + 1) % division) / (float)division * Mathf.PI * 2f; + + Gizmos.DrawLine( + centerPos + xAxis * Mathf.Cos(s) + yAxis * Mathf.Sin(s), + centerPos + xAxis * Mathf.Cos(t) + yAxis * Mathf.Sin(t) + ); + } + } + + public void OnDrawGizmosSelected() + { + Gizmos.color = Color.cyan; + Matrix4x4 mat = transform.localToWorldMatrix; + Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3( + 1.0f / transform.lossyScale.x, + 1.0f / transform.lossyScale.y, + 1.0f / transform.lossyScale.z + )); + switch (ColliderType) + { + case VRM10SpringBoneColliderTypes.Sphere: + Gizmos.DrawWireSphere(Offset, Radius); + break; + + case VRM10SpringBoneColliderTypes.Capsule: + DrawWireCapsule(Offset, Tail, Radius); + break; + } + } } } diff --git a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs index 221f896d5..fece4413f 100644 --- a/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs +++ b/Assets/VRM10/Runtime/Components/SpringBone/VRM10SpringBoneColliderGroup.cs @@ -10,82 +10,7 @@ namespace UniVRM10 [AddComponentMenu("VRM10/VRM10SpringBoneColliderGroup")] public class VRM10SpringBoneColliderGroup : MonoBehaviour { - [SerializeField] - Color m_gizmoColor = Color.cyan; - [SerializeField] public List Colliders = new List(); - - public static void DrawWireCapsule(Vector3 headPos, Vector3 tailPos, float radius) - { - var headToTail = tailPos - headPos; - if (headToTail.sqrMagnitude <= float.Epsilon) - { - Gizmos.DrawWireSphere(headPos, radius); - return; - } - - var forward = headToTail.normalized * radius; - - var xLen = Mathf.Abs(forward.x); - var yLen = Mathf.Abs(forward.y); - var zLen = Mathf.Abs(forward.z); - var rightWorldAxis = (yLen > xLen && yLen > zLen) ? Vector3.right : Vector3.up; - - var up = Vector3.Cross(forward, rightWorldAxis).normalized * radius; - var right = Vector3.Cross(up, forward).normalized * radius; - - const int division = 24; - DrawWireCircle(headPos, up, right, division, division); - DrawWireCircle(headPos, up, -forward, division, division / 2); - DrawWireCircle(headPos, right, -forward, division, division / 2); - - DrawWireCircle(tailPos, up, right, division, division); - DrawWireCircle(tailPos, up, forward, division, division / 2); - DrawWireCircle(tailPos, right, forward, division, division / 2); - - Gizmos.DrawLine(headPos + right, tailPos + right); - Gizmos.DrawLine(headPos - right, tailPos - right); - Gizmos.DrawLine(headPos + up, tailPos + up); - Gizmos.DrawLine(headPos - up, tailPos - up); - } - - private static void DrawWireCircle(Vector3 centerPos, Vector3 xAxis, Vector3 yAxis, int division, int count) - { - for (var idx = 0; idx < division && idx < count; ++idx) - { - var s = ((idx + 0) % division) / (float)division * Mathf.PI * 2f; - var t = ((idx + 1) % division) / (float)division * Mathf.PI * 2f; - - Gizmos.DrawLine( - centerPos + xAxis * Mathf.Cos(s) + yAxis * Mathf.Sin(s), - centerPos + xAxis * Mathf.Cos(t) + yAxis * Mathf.Sin(t) - ); - } - } - - public void OnDrawGizmosSelected() - { - Gizmos.color = m_gizmoColor; - Matrix4x4 mat = transform.localToWorldMatrix; - Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3( - 1.0f / transform.lossyScale.x, - 1.0f / transform.lossyScale.y, - 1.0f / transform.lossyScale.z - )); - foreach (var y in Colliders) - { - switch (y.ColliderType) - { - case VRM10SpringBoneColliderTypes.Sphere: - Gizmos.DrawWireSphere(y.Offset, y.Radius); - break; - - case VRM10SpringBoneColliderTypes.Capsule: - DrawWireCapsule(y.Offset, y.Tail, y.Radius); - break; - } - } - } } }