/// <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 cylinder draft /// </summary> public static MeshDraft Cylinder(float radius, int segments, float height, bool generateUV = true) { float segmentAngle = 360f / segments; float currentAngle = 0; Vector3 halfHeightUp = Vector3.up * height / 2; var draft = new MeshDraft { name = "Cylinder" }; var lowerRing = new List <Vector3>(segments); var lowerDiskUV = new List <Vector2>(); var upperRing = new List <Vector3>(segments); var upperDiskUV = new List <Vector2>(); var strip = new List <Vector3>(); var stripNormals = new List <Vector3>(); var stripUV = new List <Vector2>(); for (var i = 0; i < segments; i++) { Vector3 lowerVertex; Vector3 upperVertex; AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV, ref strip, ref stripUV, ref stripNormals, out lowerVertex, out upperVertex); lowerRing.Add(lowerVertex); upperRing.Add(upperVertex); 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; } Vector3 lowerSeamVertex; Vector3 upperSeamVertex; AddCylinderPoints(radius, currentAngle, halfHeightUp, generateUV, ref strip, ref stripUV, ref stripNormals, out lowerSeamVertex, out upperSeamVertex); if (generateUV) { draft.AddTriangleFan(lowerRing, Vector3.down, lowerDiskUV, true); draft.AddTriangleFan(upperRing, Vector3.up, upperDiskUV); draft.AddTriangleStrip(strip, stripNormals, stripUV); } else { draft.AddTriangleFan(lowerRing, Vector3.down, true); draft.AddTriangleFan(upperRing, Vector3.up); } 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> /// Returns a point on the circle at the given <paramref name="angle"/> /// </summary> public Vector2 GetPoint(float angle) { return(center + PTUtils.PointOnCircle2(radius, angle)); }
/// <summary> /// Returns a random point on a circle /// </summary> public static Vector2 PointOnCircle(Vector2 center, float radius) { return(center + PTUtils.PointOnCircle2(radius, rotation2)); }