private void Start() { lineMaterial = new Material(Shader.Find("Hidden/Internal-Colored")); Vertex3[] vertices = new Vertex3[NumberOfVertices]; Random.InitState(seed); for (int i = 0; i < NumberOfVertices; i++) { float x = size * Random.Range(-1.0f, 1.0f); float y = size * Random.Range(-1.0f, 1.0f); float z = size * Random.Range(-1.0f, 1.0f); vertices[i] = new Vertex3(x, y, z); } voronoi = new VoronoiMesh3(); voronoi.Generate(vertices); RegionsToMeshes(); }
public static (List <Mesh> meshes, List <Vector3> centers) GetFull(int nverts, float scale, int seed, Material mat) { Vertex3[] vertices = new Vertex3[nverts]; Random.InitState(seed); for (int i = 0; i < nverts; i++) { float x = scale * Random.Range(-1.0f, 1.0f); float y = scale * Random.Range(-1.0f, 1.0f); float z = scale * Random.Range(-1.0f, 1.0f); vertices[i] = new Vertex3(x, y, z); } VoronoiMesh3 voronoi = new VoronoiMesh3(); voronoi.Generate(vertices); return(RegionsToMeshes(voronoi, scale, seed, mat)); }
private static (List <Mesh> meshes, List <Vector3> centers) RegionsToMeshes(VoronoiMesh3 voronoi, float scale, int seed, Material mat) { List <Mesh> meshes = new List <Mesh>(); List <Vector3> centers = new List <Vector3>(); foreach (VoronoiRegion <Vertex3> region in voronoi.Regions) { Vertex3 center = region.ArithmeticCenter; List <Vertex3> verts = new List <Vertex3>(); foreach (DelaunayCell <Vertex3> cell in region.Cells) { verts.Add(cell.CircumCenter); // if (!InBound(cell.CircumCenter, scale)) { // draw = false; // break; // } // else { // verts.Add(cell.CircumCenter); // } } // If you find the convex hull of the voronoi region it // can be used to make a triangle mesh. ConvexHull3 hull = new ConvexHull3(); hull.Generate(verts, false); List <Vector3> positions = new List <Vector3>(); List <Vector3> normals = new List <Vector3>(); List <int> indices = new List <int>(); for (int i = 0; i < hull.Simplexs.Count; i++) { for (int j = 0; j < 3; j++) { Vector3 v = new Vector3(); v.x = hull.Simplexs[i].Vertices[j].X; v.y = hull.Simplexs[i].Vertices[j].Y; v.z = hull.Simplexs[i].Vertices[j].Z; positions.Add(v); } Vector3 n = new Vector3(); n.x = hull.Simplexs[i].Normal[0]; n.y = hull.Simplexs[i].Normal[1]; n.z = hull.Simplexs[i].Normal[2]; if (hull.Simplexs[i].IsNormalFlipped) { indices.Add(i * 3 + 2); indices.Add(i * 3 + 1); indices.Add(i * 3 + 0); } else { indices.Add(i * 3 + 0); indices.Add(i * 3 + 1); indices.Add(i * 3 + 2); } normals.Add(n); normals.Add(n); normals.Add(n); } Mesh mesh = new Mesh(); mesh.SetVertices(positions); mesh.SetNormals(normals); mesh.SetTriangles(indices, 0); mesh.RecalculateBounds(); mesh.RecalculateNormals(); meshes.Add(mesh); centers.Add(new Vector3(center.X, center.Y, center.Z)); } return(meshes, centers); }