public void Draw(Capsule3D capsule, Color color, int segments = Constants.DefaultSegments, int rings = 5) { Debug.Assert(segments >= 3, "Primitive 3D capsules must be rendered using at least three segments (for " + "the circular portions)."); Debug.Assert(rings > 0, "Primitive 3D capsules must be rendered using at least one ring (for the " + "hemisphere end caps)."); var h = capsule.Height / 2; var r = capsule.Radius; var orientation = capsule.Orientation; var p = capsule.Position; var v = orientation * vec3.UnitY; // TODO: Draw lines from the top-most ring to the top endpoint (mirrored on the bottom too). for (int i = 0; i < rings; i++) { var radius = (float)Math.Cos(Constants.PiOverTwo / rings * i) * r; var offset = r / rings * i; DrawCircle(radius, p + v * (h + offset), orientation, color, segments); DrawCircle(radius, p - v * (h + offset), orientation, color, segments); } for (int i = 0; i < segments; i++) { var d = Utilities.Direction(Constants.TwoPi / segments * i) * r; var point = orientation * new vec3(d.x, 0, d.y) + p; DrawLine(point + v * h, point - v * h, color); } }
private void RenderCollision <T>(Type type) where T : Collider { T[] colliders = UnityEngine.Object.FindObjectsOfType <T>(); Color color = ColliderColor(type); AddToRenderList(colliders); switch (type) { case Type.Boxes: Box3D.Render(colliderList, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth)); Box3D.Render(triggerList, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth)); break; case Type.Spheres: Sphere3D.Render(colliderList, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth)); Sphere3D.Render(triggerList, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth)); break; case Type.Capsules: Capsule3D.Render(colliderList, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth)); Capsule3D.Render(triggerList, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth)); break; case Type.Meshes: Mesh3D.Render(colliderList, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth)); Mesh3D.Render(triggerList, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth)); break; case Type.Characters: Character3D.Render(colliderList, color, EdgeAlpha, color, FaceAlpha, IsSet(Flags.NoDepth)); Character3D.Render(triggerList, triggerColor, EdgeAlpha, triggerColor, FaceAlpha, IsSet(Flags.NoDepth)); guiColliderCount[(int)Type.Capsules] += colliderList.Count + triggerList.Count; break; } guiColliderCount[(int)type] += colliderList.Count + triggerList.Count; }