如何从表示为浮点数组的高度图创建 3D 网格

How to create a 3D mesh from a heightmap represented as a float array

我试图了解如何根据存储为一维浮点数组的高度图构建 3D 网格。我之前看到的唯一示例使用了 2D 浮点数组,我正在努力思考这里涉及的数学问题。任何对此的见解将不胜感激。为了您的方便,我已经注释了我还不太了解的代码。

代码来源:https://github.com/SebLague/Hydraulic-Erosion

public void ContructMesh () {
    Vector3[] verts = new Vector3[mapSize * mapSize];
    int[] triangles = new int[(mapSize - 1) * (mapSize - 1) * 6];
    int t = 0;
    //Note that default mapSize is 255
    for (int i = 0; i < mapSize * mapSize; i++) {
        //Following code is not properly understood
        int x = i % mapSize;
        int y = i / mapSize;
        int meshMapIndex = y * mapSize + x;

        Vector2 percent = new Vector2 (x / (mapSize - 1f), y / (mapSize - 1f));
        Vector3 pos = new Vector3 (percent.x * 2 - 1, 0, percent.y * 2 - 1) * scale;

        pos += Vector3.up * map[meshMapIndex] * elevationScale; //Elevation scale is 20 by default
        verts[meshMapIndex] = pos;

        //End of misunderstood code
        if (x != mapSize - 1 && y != mapSize - 1) {
            t = (y * (mapSize - 1) + x) * 3 * 2;

            triangles[t + 0] = meshMapIndex + mapSize;
            triangles[t + 1] = meshMapIndex + mapSize + 1;
            triangles[t + 2] = meshMapIndex;

            triangles[t + 3] = meshMapIndex + mapSize + 1;
            triangles[t + 4] = meshMapIndex + 1;
            triangles[t + 5] = meshMapIndex;
            t += 6;
        }
    }
    Mesh mesh = new Mesh();
    mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
    mesh.vertices = verts;
    mesh.triangles = triangles;
    mesh.RecalculateNormals ();

具体有什么地方不明白?

        int x = i % mapSize; // Get the x location of the current point
        int y = i / mapSize; // Get the y location of the current point

        // This should be equal to i, IDK why this is even calculated 
        int meshMapIndex = y * mapSize + x; 

        // How far along either direction are we?
        Vector2 percent = new Vector2 (x / (mapSize - 1f), y / (mapSize - 1f)); 

        // Make a new vector that scales the X and Y coordinates up. 
        // The Y coordinate is set to the Z element in this vector
        // Presumably because whatever you use to render uses the Y element as "up"
        // And the X-Z plane is the horizontal plane
        // Also normalize X and Z to lie between -1*scale and 1*scale
        Vector3 pos = new Vector3 (percent.x * 2 - 1, 0, percent.y * 2 - 1) * scale; 

        // Add the value at the current index, times the scale, as the Y element of pos
        pos += Vector3.up * map[meshMapIndex] * elevationScale; //Elevation scale is 20 by default
       
        // The X-Z values of pos give you the location of the vertex in the horizontal plane
        // The Y value of pos gives you the height
        // save the newly calculated pos in verts
        verts[meshMapIndex] = pos;