/// <summary> /// Draws a wireframe cone with position and rotation /// </summary> public static void WireCone(DebugDrawLine drawLine, Vector3 position, Quaternion rotation, float apexRadius, float angle, float length, Color color, float duration, bool depthTest) { Vector3 upperCenter = position + rotation * Vector3.up * length; float upperRadius = Mathf.Tan(angle * Mathf.Deg2Rad) * length + apexRadius; WireCircleXZ(drawLine, upperCenter, rotation, upperRadius, color, duration, depthTest); Vector3 a2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 0); Vector3 b2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 90); Vector3 c2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 180); Vector3 d2 = upperCenter + rotation * PTUtils.PointOnCircle3XZ(upperRadius, 270); if (apexRadius == 0) { drawLine(position, a2, color, duration, depthTest); drawLine(position, b2, color, duration, depthTest); drawLine(position, c2, color, duration, depthTest); drawLine(position, d2, color, duration, depthTest); } else { WireCircleXZ(drawLine, position, rotation, apexRadius, color, duration, depthTest); Vector3 a1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 0); Vector3 b1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 90); Vector3 c1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 180); Vector3 d1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 270); drawLine(a1, a2, color, duration, depthTest); drawLine(b1, b2, color, duration, depthTest); drawLine(c1, c2, color, duration, depthTest); drawLine(d1, d2, color, duration, depthTest); } }
/// <summary> /// Draws a wireframe cone with position and rotation /// </summary> public static void WireCone(Action <Vector3, Vector3> drawLine, Vector3 position, Quaternion rotation, float apexRadius, float angle, float length) { Vector3 baseCenter = position + rotation * Vector3.up * length; float baseRadius = Mathf.Tan(angle * Mathf.Deg2Rad) * length + apexRadius; WireCircleXZ(drawLine, baseCenter, rotation, baseRadius); Vector3 a2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 0); Vector3 b2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 90); Vector3 c2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 180); Vector3 d2 = baseCenter + rotation * PTUtils.PointOnCircle3XZ(baseRadius, 270); if (apexRadius == 0) { drawLine(position, a2); drawLine(position, b2); drawLine(position, c2); drawLine(position, d2); } else { WireCircleXZ(drawLine, position, rotation, apexRadius); Vector3 a1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 0); Vector3 b1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 90); Vector3 c1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 180); Vector3 d1 = position + rotation * PTUtils.PointOnCircle3XZ(apexRadius, 270); drawLine(a1, a2); drawLine(b1, b2); drawLine(c1, c2); drawLine(d1, d2); } }
public static MeshDraft Cylinder(float radius, int segments, float heignt) { float segmentAngle = 360f / segments; float currentAngle = 0; var lowerRing = new List <Vector3>(segments); var upperRing = new List <Vector3>(segments); for (var i = 0; i < segments; i++) { var point = PTUtils.PointOnCircle3XZ(radius, currentAngle); lowerRing.Add(point - Vector3.up * heignt / 2); upperRing.Add(point + Vector3.up * heignt / 2); currentAngle -= segmentAngle; } var draft = new MeshDraft { name = "Cylinder" } .AddTriangleFan(lowerRing) .Add(Band(lowerRing, upperRing)); upperRing.Reverse(); draft.AddTriangleFan(upperRing); return(draft); }
public static MeshDraft BaselessPyramid(Vector3 baseCenter, Vector3 apex, float radius, int segments, bool inverted = false) { float segmentAngle = 360f / segments * (inverted ? -1 : 1); float currentAngle = 0; var vertices = new Vector3[segments + 1]; vertices[0] = apex; for (var i = 1; i <= segments; i++) { vertices[i] = PTUtils.PointOnCircle3XZ(radius, currentAngle) + baseCenter; currentAngle += segmentAngle; } var draft = new MeshDraft { name = "BaselessPyramid" }; for (var i = 1; i < segments; i++) { draft.AddTriangle(vertices[0], vertices[i], vertices[i + 1]); } draft.AddTriangle(vertices[0], vertices[vertices.Length - 1], vertices[1]); return(draft); }
/// <summary> /// Constructs a pyramid draft /// </summary> public static MeshDraft Pyramid(float radius, int segments, float height, bool generateUV = true) { float segmentAngle = 360f / segments; float currentAngle = 0; var ring = new Vector3[segments]; for (var i = 0; i < segments; i++) { ring[i] = PTUtils.PointOnCircle3XZ(radius, currentAngle); currentAngle += segmentAngle; } var draft = new MeshDraft().AddBaselessPyramid(Vector3.up * height, ring, generateUV); if (generateUV) { var fanUV = new Vector2[segments]; currentAngle = 0; for (var i = 0; i < segments; i++) { Vector2 uv = PTUtils.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f); uv.x = 1 - uv.x; fanUV[i] = uv; currentAngle += segmentAngle; } draft.AddTriangleFan(ring, Vector3.down, fanUV, true); } else { draft.AddTriangleFan(ring, Vector3.down, true); } draft.name = "Pyramid"; return(draft); }
/// <summary> /// Constructs a prism draft /// </summary> public static MeshDraft Prism(float radius, int segments, float height, bool generateUV = true) { float segmentAngle = 360f / segments; float currentAngle = 0; Vector3 halfHeightUp = Vector3.up * height / 2; var lowerRing = new List <Vector3>(segments); var lowerDiskUV = new List <Vector2>(); var upperRing = new List <Vector3>(segments); var upperDiskUV = new List <Vector2>(); for (var i = 0; i < segments; i++) { var point = PTUtils.PointOnCircle3XZ(radius, currentAngle); lowerRing.Add(point - halfHeightUp); upperRing.Add(point + halfHeightUp); if (generateUV) { Vector2 uv = PTUtils.PointOnCircle2(0.5f, currentAngle) + new Vector2(0.5f, 0.5f); upperDiskUV.Add(uv); uv.x = 1 - uv.x; lowerDiskUV.Add(uv); } currentAngle += segmentAngle; } var draft = new MeshDraft { name = "Prism" } .AddFlatQuadBand(lowerRing, upperRing, generateUV); if (generateUV) { draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV) .AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true); } else { draft.AddTriangleFan(upperRing, Vector3.up) .AddTriangleFan(lowerRing, Vector3.down, true); } return(draft); }
/// <summary> /// Constructs a bipyramid draft /// </summary> public static MeshDraft BiPyramid(float radius, int segments, float height, bool generateUV = true) { float segmentAngle = 360f / segments; float currentAngle = 0; var ring = new Vector3[segments]; for (var i = 0; i < segments; i++) { ring[i] = PTUtils.PointOnCircle3XZ(radius, currentAngle); currentAngle += segmentAngle; } var draft = new MeshDraft { name = "Bipyramid" } .AddBaselessPyramid(Vector3.up * height / 2, ring, generateUV) .AddBaselessPyramid(Vector3.down * height / 2, ring, generateUV, true); return(draft); }
private static void AddCylinderPoints(float radius, float currentAngle, Vector3 halfHeightUp, bool generateUV, ref List <Vector3> vertices, ref List <Vector2> uv, ref List <Vector3> normals, out Vector3 lowerVertex, out Vector3 upperVertex) { Vector3 normal = PTUtils.PointOnCircle3XZ(1, currentAngle); Vector3 point = normal * radius; lowerVertex = point - halfHeightUp; upperVertex = point + halfHeightUp; vertices.Add(upperVertex); normals.Add(normal); vertices.Add(lowerVertex); normals.Add(normal); if (generateUV) { float u = 1 - currentAngle / 360; uv.Add(new Vector2(u, 1)); uv.Add(new Vector2(u, 0)); } }
public static MeshDraft Prism(float radius, int segments, float heignt) { float segmentAngle = Mathf.PI * 2 / segments; float currentAngle = 0f; var lowerRing = new List <Vector3>(segments); var upperRing = new List <Vector3>(segments); for (var i = 0; i < segments; i++) { var point = PTUtils.PointOnCircle3XZ(radius, currentAngle); lowerRing.Add(point - Vector3.up * heignt / 2); upperRing.Add(point + Vector3.up * heignt / 2); currentAngle -= segmentAngle; } var draft = TriangleFan(lowerRing); draft.Add(FlatBand(lowerRing, upperRing)); upperRing.Reverse(); draft.Add(TriangleFan(upperRing)); draft.name = "Prism"; return(draft); }