Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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]));
        }
Exemplo n.º 11
0
 /// <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));
 }