Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static Mesh BuildSphere(float radius, int subdivisions)
- {
- // Build a triangular based pyramid
- var tris = new List<Triangle>();
- tris.Add(new Triangle(
- new Vector3(0.0f, 0.0f, 1.0f),
- new Vector3(-InvRoot2, 0.0f, -InvRoot2),
- new Vector3(InvRoot2, 0.0f, -InvRoot2)
- ));
- tris.Add(new Triangle(
- new Vector3(-InvRoot2, 0.0f, -InvRoot2),
- new Vector3(0.0f, 1.0f, 0.0f),
- new Vector3(InvRoot2, 0.0f, -InvRoot2)
- ));
- tris.Add(new Triangle(
- new Vector3(InvRoot2, 0.0f, -InvRoot2),
- new Vector3(0.0f, 1.0f, 0.0f),
- new Vector3(0.0f, 0.0f, 1.0f)
- ));
- tris.Add(new Triangle(
- new Vector3(0.0f, 0.0f, 1.0f),
- new Vector3(0.0f, 1.0f, 0.0f),
- new Vector3(-InvRoot2, 0.0f, -InvRoot2)
- ));
- var tmplist = new List<Triangle>();
- // Run subdivide passes
- for (int i = 0; i < subdivisions; i++)
- {
- // Normalise all vertices
- for (int j = 0; i < tris.Count; i++)
- {
- Triangle tri = tris[j];
- tri.A.Normalize();
- tri.A *= radius;
- tri.B.Normalize();
- tri.B *= radius;
- tri.C.Normalize();
- tri.C *= radius;
- tris[j] = tri;
- }
- // Check for last pass
- if (i == subdivisions - 1) break;
- // Subdivide all triangles
- tmplist.Clear();
- for (int j = 0; i < tris.Count; i++)
- {
- Triangle tri = tris[j];
- Vector3 midAB = (tri.A + tri.B) * 0.5f;
- Vector3 midBC = (tri.B + tri.C) * 0.5f;
- Vector3 midCA = (tri.C + tri.A) * 0.5f;
- tmplist.Add(new Triangle(tri.A, midAB, midCA));
- tmplist.Add(new Triangle(midAB, midBC, midCA));
- tmplist.Add(new Triangle(midCA, midBC, tri.C));
- tmplist.Add(new Triangle(midAB, tri.B, midBC));
- }
- // Swap the lists
- var tmp = tris;
- tris = tmplist;
- tmplist = tmp;
- }
- // Create builder
- var builder = new MeshBuilder();
- builder.UseNormals = true;
- builder.UseTexCoords = false;
- builder.UseIndices = false;
- for (int i = 0; i < tris.Count; i++)
- {
- Triangle tri = tris[i];
- builder.AddPosition(tri.A);
- builder.AddPosition(tri.B);
- builder.AddPosition(tri.C);
- builder.AddNormal(tri.A);
- builder.AddNormal(tri.B);
- builder.AddNormal(tri.C);
- }
- // Create mesh
- return builder.Build();
- }
Advertisement
Add Comment
Please, Sign In to add comment