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();
        }
Exemple #2
0
    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));
    }
Exemple #3
0
    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);
    }