public static MeshDraft FlatSphere(float radius, int longitudeSegments, int latitudeSegments) { float longitudeSegmentAngle = Mathf.PI * 2 / longitudeSegments; float latitudeSegmentAngle = Mathf.PI / latitudeSegments; float currentLatitude = -Mathf.PI / 2; var rings = new List <List <Vector3> >(latitudeSegments); for (var i = 0; i <= latitudeSegments; i++) { var currentLongitude = 0f; var ring = new List <Vector3>(longitudeSegments); for (int j = 0; j < longitudeSegments; j++) { ring.Add(PTUtils.PointOnSphere(radius, currentLongitude, currentLatitude)); currentLongitude -= longitudeSegmentAngle; } rings.Add(ring); currentLatitude += latitudeSegmentAngle; } var draft = new MeshDraft { name = "Flat sphere" }; for (int i = 0; i < rings.Count - 1; i++) { draft.Add(FlatBand(rings[i], rings[i + 1])); } return(draft); }
/// <summary> /// Constructs a icosahedron draft /// </summary> public static MeshDraft Icosahedron(float radius, bool generateUV = true) { const float magicAngle = 26.56505f; const float segmentAngle = 72; float lowerAngle = 0; float upperAngle = segmentAngle / 2; var lowerRing = new Vector3[5]; var upperRing = new Vector3[5]; for (var i = 0; i < 5; i++) { lowerRing[i] = PTUtils.PointOnSphere(radius, lowerAngle, -magicAngle); upperRing[i] = PTUtils.PointOnSphere(radius, upperAngle, magicAngle); lowerAngle += segmentAngle; upperAngle += segmentAngle; } var draft = new MeshDraft { name = "Icosahedron" } .AddBaselessPyramid(new Vector3(0, radius, 0), upperRing, generateUV) .AddFlatTriangleBand(lowerRing, upperRing, generateUV) .AddBaselessPyramid(new Vector3(0, -radius, 0), lowerRing, generateUV, true); return(draft); }
public static MeshDraft Icosahedron(float radius) { float magicAngle = Mathf.PI * 26.56505f / 180; float segmentAngle = Mathf.PI * 72 / 180; float currentAngle = 0f; var upperRing = new List <Vector3>(5); for (var i = 0; i < 5; i++) { upperRing.Add(PTUtils.PointOnSphere(radius, currentAngle, magicAngle)); currentAngle -= segmentAngle; } currentAngle = segmentAngle / 2; var lowerRing = new List <Vector3>(5); for (var i = 0; i < 5; i++) { lowerRing.Add(PTUtils.PointOnSphere(radius, currentAngle, -magicAngle)); currentAngle -= segmentAngle; } var draft = BaselessPyramid(new Vector3(0, -radius, 0), lowerRing); draft.Add(FlatBand(lowerRing, upperRing)); upperRing.Reverse(); draft.Add(BaselessPyramid(new Vector3(0, radius, 0), upperRing)); draft.name = "Icosahedron"; return(draft); }
/// <summary> /// Constructs a tetrahedron draft /// </summary> public static MeshDraft Tetrahedron(float radius, bool generateUV = true) { const float tetrahedralAngle = -19.471220333f; var vertex0 = new Vector3(0, radius, 0); var vertex1 = PTUtils.PointOnSphere(radius, 0, tetrahedralAngle); var vertex2 = PTUtils.PointOnSphere(radius, 120, tetrahedralAngle); var vertex3 = PTUtils.PointOnSphere(radius, 240, tetrahedralAngle); var draft = new MeshDraft { name = "Tetrahedron" }; if (generateUV) { var uv0 = new Vector2(0, 0); var uv1 = new Vector2(0.5f, 1); var uv2 = new Vector2(1, 0); draft.AddTriangle(vertex2, vertex0, vertex1, uv0, uv1, uv2) .AddTriangle(vertex2, vertex1, vertex3, uv0, uv1, uv2) .AddTriangle(vertex3, vertex0, vertex2, uv0, uv1, uv2) .AddTriangle(vertex1, vertex0, vertex3, uv0, uv1, uv2); } else { draft.AddTriangle(vertex2, vertex0, vertex1) .AddTriangle(vertex2, vertex1, vertex3) .AddTriangle(vertex3, vertex0, vertex2) .AddTriangle(vertex1, vertex0, vertex3); } return(draft); }
/// <summary> /// Constructs a dodecahedron draft /// </summary> public static MeshDraft Dodecahedron(float radius) { const float magicAngle1 = 52.62263590f; const float magicAngle2 = 10.81231754f; const float segmentAngle = 72; float lowerAngle = 0; float upperAngle = segmentAngle / 2; var lowerCap = new Vector3[5]; var lowerRing = new Vector3[5]; var upperCap = new Vector3[5]; var upperRing = new Vector3[5]; for (var i = 0; i < 5; i++) { lowerCap[i] = PTUtils.PointOnSphere(radius, lowerAngle, -magicAngle1); lowerRing[i] = PTUtils.PointOnSphere(radius, lowerAngle, -magicAngle2); upperCap[i] = PTUtils.PointOnSphere(radius, upperAngle, magicAngle1); upperRing[i] = PTUtils.PointOnSphere(radius, upperAngle, magicAngle2); lowerAngle += segmentAngle; upperAngle += segmentAngle; } var draft = new MeshDraft { name = "Dodecahedron" } .AddTriangleFan(upperCap, Vector3.up) .AddFlatTriangleBand(upperRing, upperCap, false) .AddFlatTriangleBand(lowerRing, upperRing, false) .AddFlatTriangleBand(lowerCap, lowerRing, false) .AddTriangleFan(lowerCap, Vector3.down, true); return(draft); }
public static MeshDraft Sphere(float radius, int longitudeSegments, int latitudeSegments) { var draft = new MeshDraft { name = "Sphere" }; float longitudeSegmentAngle = Mathf.PI * 2 / longitudeSegments; float latitudeSegmentAngle = Mathf.PI / latitudeSegments; float currentLatitude = -Mathf.PI / 2; for (var ring = 0; ring <= latitudeSegments; ring++) { var currentLongitude = 0f; for (int i = 0; i < longitudeSegments; i++) { var point = PTUtils.PointOnSphere(radius, currentLongitude, currentLatitude); draft.vertices.Add(point); draft.normals.Add(point.normalized); draft.uv.Add(new Vector2((float)i / longitudeSegments, (float)ring / latitudeSegments)); currentLongitude -= longitudeSegmentAngle; } currentLatitude += latitudeSegmentAngle; } int i0, i1, i2, i3; for (int ring = 0; ring < latitudeSegments; ring++) { for (int i = 0; i < longitudeSegments - 1; i++) { i0 = ring * longitudeSegments + i; i1 = (ring + 1) * longitudeSegments + i; i2 = ring * longitudeSegments + i + 1; i3 = (ring + 1) * longitudeSegments + i + 1; draft.triangles.AddRange(new[] { i0, i1, i2 }); draft.triangles.AddRange(new[] { i2, i1, i3 }); } i0 = (ring + 1) * longitudeSegments - 1; i1 = (ring + 2) * longitudeSegments - 1; i2 = ring * longitudeSegments; i3 = (ring + 1) * longitudeSegments; draft.triangles.AddRange(new[] { i0, i1, i2 }); draft.triangles.AddRange(new[] { i2, i1, i3 }); } return(draft); }
public static MeshDraft Dodecahedron(float radius) { const float magicAngle1 = 52.62263590f; const float magicAngle2 = 10.81231754f; const float segmentAngle = 72; float currentAngle = 0; var lowerCap = new List <Vector3>(); var lowerRing = new List <Vector3>(); for (var i = 0; i < 5; i++) { lowerCap.Add(PTUtils.PointOnSphere(radius, currentAngle, -magicAngle1)); lowerRing.Add(PTUtils.PointOnSphere(radius, currentAngle, -magicAngle2)); currentAngle -= segmentAngle; } currentAngle = -segmentAngle / 2; var upperCap = new List <Vector3>(); var upperRing = new List <Vector3>(); for (var i = 0; i < 5; i++) { upperCap.Add(PTUtils.PointOnSphere(radius, currentAngle, magicAngle1)); upperRing.Add(PTUtils.PointOnSphere(radius, currentAngle, magicAngle2)); currentAngle -= segmentAngle; } var draft = new MeshDraft { name = "Dodecahedron" } .AddTriangleFan(lowerCap) .Add(FlatBand(lowerCap, lowerRing)) .Add(FlatBand(lowerRing, upperRing)) .Add(FlatBand(upperRing, upperCap)); upperCap.Reverse(); draft.AddTriangleFan(upperCap); return(draft); }
public static MeshDraft Dodecahedron(float radius) { float magicAngle1 = Mathf.PI * 52.62263590f / 180; float magicAngle2 = Mathf.PI * 10.81231754f / 180; float segmentAngle = Mathf.PI * 2 / 5; float currentAngle = 0f; var lowerCap = new List <Vector3>(); var lowerRing = new List <Vector3>(); for (var i = 0; i <= 5; i++) { lowerCap.Add(PTUtils.PointOnSphere(radius, currentAngle, -magicAngle1)); lowerRing.Add(PTUtils.PointOnSphere(radius, currentAngle, -magicAngle2)); currentAngle -= segmentAngle; } currentAngle = -segmentAngle / 2; var upperCap = new List <Vector3>(); var upperRing = new List <Vector3>(); for (var i = 0; i <= 5; i++) { upperCap.Add(PTUtils.PointOnSphere(radius, currentAngle, magicAngle1)); upperRing.Add(PTUtils.PointOnSphere(radius, currentAngle, magicAngle2)); currentAngle -= segmentAngle; } var draft = TriangleFan(lowerCap); draft.Add(FlatBand(lowerCap, lowerRing)); draft.Add(FlatBand(lowerRing, upperRing)); draft.Add(FlatBand(upperRing, upperCap)); upperCap.Reverse(); draft.Add(TriangleFan(upperCap)); draft.name = "Dodecahedron"; return(draft); }
public static MeshDraft Tetrahedron(float radius) { float tetrahedralAngle = Mathf.PI * -19.471220333f / 180; float segmentAngle = Mathf.PI * 2 / 3; float currentAngle = 0f; var vertices = new List <Vector3>(4) { new Vector3(0, radius, 0) }; for (var i = 1; i < 4; i++) { vertices.Add(PTUtils.PointOnSphere(radius, currentAngle, tetrahedralAngle)); currentAngle += segmentAngle; } var draft = Triangle(vertices[0], vertices[1], vertices[2]); draft.Add(Triangle(vertices[1], vertices[3], vertices[2])); draft.Add(Triangle(vertices[0], vertices[2], vertices[3])); draft.Add(Triangle(vertices[0], vertices[3], vertices[1])); draft.name = "Tetrahedron"; return(draft); }
public static MeshDraft Tetrahedron(float radius) { const float tetrahedralAngle = -19.471220333f; const float segmentAngle = 120; float currentAngle = 0; var vertices = new List <Vector3>(4) { new Vector3(0, radius, 0) }; for (var i = 1; i < 4; i++) { vertices.Add(PTUtils.PointOnSphere(radius, currentAngle, tetrahedralAngle)); currentAngle += segmentAngle; } return(new MeshDraft { name = "Tetrahedron" } .AddTriangle(vertices[0], vertices[1], vertices[2]) .AddTriangle(vertices[1], vertices[3], vertices[2]) .AddTriangle(vertices[0], vertices[2], vertices[3]) .AddTriangle(vertices[0], vertices[3], vertices[1])); }
/// <summary> /// Returns a point on the sphere at the given coordinates /// </summary> public Vector3 GetPoint(float horizontalAngle, float verticalAngle) { return(center + PTUtils.PointOnSphere(radius, horizontalAngle, verticalAngle)); }