Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
 /// <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));
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Returns a random point on a circle
 /// </summary>
 public static Vector2 PointOnCircle(Vector2 center, float radius)
 {
     return(center + PTUtils.PointOnCircle2(radius, rotation2));
 }