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;
- }
- }
- }
}
}