Beispiel #1
0
    //Mesh generation, with a heightMap, heightRate, a curve, and a level of details (number of edges)
    public static MeshDatas GenerateMesh(float[,] heightMap, float heightRate = 1, AnimationCurve heightCurve = null, int levelOfDetail = 0)
    {
        int   width    = heightMap.GetLength(0);
        int   height   = heightMap.GetLength(1);
        float topLeftX = (width - 1f) / (-2f);
        float topLeftZ = (height - 1f) / 2f;


        int meshDetails = levelOfDetail * 2;//to have 1 edge of 1,2,4,6,8,10,12 drawn

        if (meshDetails == 0)
        {
            meshDetails = 1;
        }

        int verticePerLine    = (width - 1) / meshDetails + 1;
        int verticePerColumns = (height - 1) / meshDetails + 1;


        MeshDatas mesh        = new MeshDatas(verticePerLine, verticePerColumns);
        int       vertexIndex = 0;

        for (int j = 0; j < height; j += meshDetails)// draw 1 edge of meshDetails on the heightMap
        {
            for (int i = 0; i < width; i += meshDetails)
            {
                if (heightCurve == null)//vertice
                {
                    mesh.vertices[vertexIndex] = new Vector3(topLeftX + i, heightMap[i, j] * heightRate, topLeftZ - j);
                }
                else
                {
                    mesh.vertices[vertexIndex] = new Vector3(topLeftX + i, heightCurve.Evaluate(heightMap[i, j]) * heightRate, topLeftZ - j);
                }
                mesh.uvs[vertexIndex] = new Vector2(i / (float)width, j / (float)height); //textures

                if (i < width - 1 && j < height - 1)                                      //edges
                {
                    mesh.AddTriangle(vertexIndex, vertexIndex + verticePerLine + 1, vertexIndex + verticePerLine);
                    mesh.AddTriangle(vertexIndex + verticePerLine + 1, vertexIndex, vertexIndex + 1);
                }

                vertexIndex++;
            }
        }
        return(mesh);
    }
 //3D Scene Rendering
 public void DrawMeshes(MeshDatas mesh, Texture2D texture)
 {
     meshFilter.sharedMesh = mesh.CreateMesh();
     meshRenderer.sharedMaterial.mainTexture = texture;
 }