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); }
// 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); }