thomasfn

Sphere maker

Sep 1st, 2012
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.12 KB | None | 0 0
  1. public static Mesh BuildSphere(float radius, int subdivisions)
  2.         {
  3.             // Build a triangular based pyramid
  4.             var tris = new List<Triangle>();
  5.             tris.Add(new Triangle(
  6.                 new Vector3(0.0f, 0.0f, 1.0f),
  7.                 new Vector3(-InvRoot2, 0.0f, -InvRoot2),
  8.                 new Vector3(InvRoot2, 0.0f, -InvRoot2)
  9.             ));
  10.             tris.Add(new Triangle(
  11.                 new Vector3(-InvRoot2, 0.0f, -InvRoot2),
  12.                 new Vector3(0.0f, 1.0f, 0.0f),
  13.                 new Vector3(InvRoot2, 0.0f, -InvRoot2)
  14.             ));
  15.             tris.Add(new Triangle(
  16.                 new Vector3(InvRoot2, 0.0f, -InvRoot2),
  17.                 new Vector3(0.0f, 1.0f, 0.0f),
  18.                 new Vector3(0.0f, 0.0f, 1.0f)
  19.             ));
  20.             tris.Add(new Triangle(
  21.                 new Vector3(0.0f, 0.0f, 1.0f),
  22.                 new Vector3(0.0f, 1.0f, 0.0f),
  23.                 new Vector3(-InvRoot2, 0.0f, -InvRoot2)
  24.             ));
  25.             var tmplist = new List<Triangle>();
  26.  
  27.             // Run subdivide passes
  28.             for (int i = 0; i < subdivisions; i++)
  29.             {
  30.                 // Normalise all vertices
  31.                 for (int j = 0; i < tris.Count; i++)
  32.                 {
  33.                     Triangle tri = tris[j];
  34.                     tri.A.Normalize();
  35.                     tri.A *= radius;
  36.                     tri.B.Normalize();
  37.                     tri.B *= radius;
  38.                     tri.C.Normalize();
  39.                     tri.C *= radius;
  40.                     tris[j] = tri;
  41.                 }
  42.  
  43.                 // Check for last pass
  44.                 if (i == subdivisions - 1) break;
  45.  
  46.                 // Subdivide all triangles
  47.                 tmplist.Clear();
  48.                 for (int j = 0; i < tris.Count; i++)
  49.                 {
  50.                     Triangle tri = tris[j];
  51.                     Vector3 midAB = (tri.A + tri.B) * 0.5f;
  52.                     Vector3 midBC = (tri.B + tri.C) * 0.5f;
  53.                     Vector3 midCA = (tri.C + tri.A) * 0.5f;
  54.                     tmplist.Add(new Triangle(tri.A, midAB, midCA));
  55.                     tmplist.Add(new Triangle(midAB, midBC, midCA));
  56.                     tmplist.Add(new Triangle(midCA, midBC, tri.C));
  57.                     tmplist.Add(new Triangle(midAB, tri.B, midBC));
  58.                 }
  59.  
  60.                 // Swap the lists
  61.                 var tmp = tris;
  62.                 tris = tmplist;
  63.                 tmplist = tmp;
  64.             }
  65.  
  66.             // Create builder
  67.             var builder = new MeshBuilder();
  68.             builder.UseNormals = true;
  69.             builder.UseTexCoords = false;
  70.             builder.UseIndices = false;
  71.             for (int i = 0; i < tris.Count; i++)
  72.             {
  73.                 Triangle tri = tris[i];
  74.                 builder.AddPosition(tri.A);
  75.                 builder.AddPosition(tri.B);
  76.                 builder.AddPosition(tri.C);
  77.                 builder.AddNormal(tri.A);
  78.                 builder.AddNormal(tri.B);
  79.                 builder.AddNormal(tri.C);
  80.             }
  81.  
  82.             // Create mesh
  83.             return builder.Build();
  84.         }
Advertisement
Add Comment
Please, Sign In to add comment