Ejemplo n.º 1
0
        public CircleGeometry(float radius = 1, int segments = 8, float thetaStart = 0, float thetaLength = Mathf.Tau)
        {
            segments = Mathf.Max(3, segments);
            var uvs = new List <Vector2>();

            vertices.Add(Vector3.Zero);
            uvs.Add(Vector2.Half);

            for (var i = 0f; i <= segments; i++)
            {
                var segment = thetaStart + i / segments * thetaLength;

                var v = new Vector3(Mathf.Cos(segment), radius * Mathf.Sin(segment), 0);
                v.Multiply(radius);
                vertices.Add(v);
                uvs.Add(new Vector2((v.x / radius + 1) / 2, (v.y / radius + 1) / 2));
            }

            var n = Vector3.UnitZ;

            for (var i = 1; i <= segments; i++)
            {
                faces.Add(new Face3(i, i + 1, 0, n));
                var faceSet = new UVFaceSet(uvs[i], uvs[i + 1], Vector2.Half);
                faceVertexUvs[0].Add(faceSet);
            }

            ComputeNormals();
            BoundingSphere = new Sphere(Vector3.Zero, radius);
        }
Ejemplo n.º 2
0
        // Approximate a curved face with recursively sub-divided triangles.
        private void Make(VertexInfo v1, VertexInfo v2, VertexInfo v3)
        {
            var face = new Face3(v1.Index, v2.Index, v3.Index, v1.Position, v2.Position, v3.Position);

            faces.Add(face);

            var centroid = v1.Position;

            centroid.Add(v2.Position);
            centroid.Add(v3.Position);
            centroid.Divide(3);

            var azi     = Azimuth(centroid);
            var uvA     = CorrectUV(v1.UV, v1.Position, azi);
            var uvB     = CorrectUV(v2.UV, v2.Position, azi);
            var uvC     = CorrectUV(v3.UV, v3.Position, azi);
            var faceSet = new UVFaceSet(uvA, uvB, uvC);
            var uvs     = faceVertexUvs[0];

            uvs.Add(faceSet);
        }