// Draw the capsule shape traversed by a spherecast. void DrawSphereCast(Ray ray, float radius, float length, Color32 color, float duration) { Matrix4x4 frame = Matrix4x4.TRS( ray.origin, Quaternion.LookRotation(ray.direction), radius * Vector3.one); float scaledLength = length / radius; // Using a pythagorean triple here to pick intermediate points on the sphere. float a = 33f / 65f; float b = 56f / 65f; // Right side. Debug.DrawLine(frame * new Vector3(0, 0, -1), frame * new Vector3(a, 0, -b), color, duration); Debug.DrawLine(frame * new Vector3(a, 0, -b), frame * new Vector3(b, 0, -a), color, duration); Debug.DrawLine(frame * new Vector3(b, 0, -a), frame * new Vector3(1, 0, 0), color, duration); Debug.DrawLine(frame * new Vector3(1, 0, 0), frame * new Vector3(1, 0, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(1, 0, scaledLength), frame * new Vector3(b, 0, scaledLength + a), color, duration); Debug.DrawLine(frame * new Vector3(b, 0, scaledLength + a), frame * new Vector3(a, 0, scaledLength + b), color, duration); Debug.DrawLine(frame * new Vector3(a, 0, scaledLength + b), frame * new Vector3(0, 0, scaledLength + 1), color, duration); // Left side. Debug.DrawLine(frame * new Vector3(0, 0, -1), frame * new Vector3(-a, 0, -b), color, duration); Debug.DrawLine(frame * new Vector3(-a, 0, -b), frame * new Vector3(-b, 0, -a), color, duration); Debug.DrawLine(frame * new Vector3(-b, 0, -a), frame * new Vector3(-1, 0, 0), color, duration); Debug.DrawLine(frame * new Vector3(-1, 0, 0), frame * new Vector3(-1, 0, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-1, 0, scaledLength), frame * new Vector3(-b, 0, scaledLength + a), color, duration); Debug.DrawLine(frame * new Vector3(-b, 0, scaledLength + a), frame * new Vector3(-a, 0, scaledLength + b), color, duration); Debug.DrawLine(frame * new Vector3(-a, 0, scaledLength + b), frame * new Vector3(0, 0, scaledLength + 1), color, duration); // Top side. Debug.DrawLine(frame * new Vector3(0, 0, -1), frame * new Vector3(0, a, -b), color, duration); Debug.DrawLine(frame * new Vector3(0, a, -b), frame * new Vector3(0, b, -a), color, duration); Debug.DrawLine(frame * new Vector3(0, b, -a), frame * new Vector3(0, 1, 0), color, duration); Debug.DrawLine(frame * new Vector3(0, 1, 0), frame * new Vector3(0, 1, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(0, 1, scaledLength), frame * new Vector3(0, b, scaledLength + a), color, duration); Debug.DrawLine(frame * new Vector3(0, b, scaledLength + a), frame * new Vector3(0, a, scaledLength + b), color, duration); Debug.DrawLine(frame * new Vector3(0, a, scaledLength + b), frame * new Vector3(0, 0, scaledLength + 1), color, duration); // Bottom side. Debug.DrawLine(frame * new Vector3(0, 0, -1), frame * new Vector3(0, -a, -b), color, duration); Debug.DrawLine(frame * new Vector3(0, -a, -b), frame * new Vector3(0, -b, -a), color, duration); Debug.DrawLine(frame * new Vector3(0, -b, - a), frame * new Vector3(0, -1, 0), color, duration); Debug.DrawLine(frame * new Vector3(0, -1, 0), frame * new Vector3(0, -1, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(0, -1, scaledLength), frame * new Vector3(0, -b, scaledLength + a), color, duration); Debug.DrawLine(frame * new Vector3(0, -b, scaledLength + a), frame * new Vector3(0, -a, scaledLength + b), color, duration); Debug.DrawLine(frame * new Vector3(0, -a, scaledLength + b), frame * new Vector3(0, 0, scaledLength + 1), color, duration); // Close ring. Debug.DrawLine(frame * new Vector3(1, 0, 0), frame * new Vector3(b, a, 0), color, duration); Debug.DrawLine(frame * new Vector3(b, a, 0), frame * new Vector3(a, b, 0), color, duration); Debug.DrawLine(frame * new Vector3(a, b, 0), frame * new Vector3(0, 1, 0), color, duration); Debug.DrawLine(frame * new Vector3(0, 1, 0), frame * new Vector3(-a, b, 0), color, duration); Debug.DrawLine(frame * new Vector3(-a, b, 0), frame * new Vector3(-b, a, 0), color, duration); Debug.DrawLine(frame * new Vector3(-b, a, 0), frame * new Vector3(-1, 0, 0), color, duration); Debug.DrawLine(frame * new Vector3(-1, 0, 0), frame * new Vector3(-b, -a, 0), color, duration); Debug.DrawLine(frame * new Vector3(-b, -a, 0), frame * new Vector3(-a, -b, 0), color, duration); Debug.DrawLine(frame * new Vector3(-a, -b, 0), frame * new Vector3(0, -1, 0), color, duration); Debug.DrawLine(frame * new Vector3(-0, -1, 0), frame * new Vector3(a, -b, 0), color, duration); Debug.DrawLine(frame * new Vector3(a, -b, 0), frame * new Vector3(b, -a, 0), color, duration); Debug.DrawLine(frame * new Vector3(b, -a, 0), frame * new Vector3(1, 0, 0), color, duration); // Far ring. Debug.DrawLine(frame * new Vector3(1, 0, scaledLength), frame * new Vector3(b, a, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(b, a, scaledLength), frame * new Vector3(a, b, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(a, b, scaledLength), frame * new Vector3(0, 1, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(0, 1, scaledLength), frame * new Vector3(-a, b, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-a, b, scaledLength), frame * new Vector3(-b, a, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-b, a, scaledLength), frame * new Vector3(-1, 0, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-1, 0, scaledLength), frame * new Vector3(-b, -a, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-b, -a, scaledLength), frame * new Vector3(-a, -b, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-a, -b, scaledLength), frame * new Vector3(0, -1, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(-0, -1, scaledLength), frame * new Vector3(a, -b, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(a, -b, scaledLength), frame * new Vector3(b, -a, scaledLength), color, duration); Debug.DrawLine(frame * new Vector3(b, -a, scaledLength), frame * new Vector3(1, 0, scaledLength), color, duration); }