0

我正在尝试在 OpenGL 中实现菱形正方形地形生成算法。

到目前为止,我有一个由多达 1024 个不同的正方形组成的 2D 平面(实际上是 3D,但所有 Z 坐标都设置为 0)。坐标被组织成二维数组

  • x 坐标数组:xMap[1024][1024]
  • y 坐标数组:yMap[1024][1024]
  • z 坐标数组:zMap[1024][1024](开始时全部为 0;出于实验目的错误地假设 z 在我们的例子中是“垂直”轴)

例如,我们有:

Point1 (xMap[1][1], yMap[1][1], zMap[1][1]);

我正在使用以下代码生成地形。我遇到的问题是,虽然它在 4 X 4 点大的地图上按预期工作,但它不适用于更大的地图。当应用于 6 X 6 地图时,它将为 4 X 4 相应地生成地形,但不会触及添加的 2 个方格。

这是我用来生成地形的代码:

   void generateLandscapeRec(int xMin, int xMax, int yMin, int yMax, float disp) {

    float nDisp = (float)(disp * (float)pow(2, -(double)roughnes)); // New displacement

    int xMidpnt = (xMin + xMax) / 2;
    int yMidpnt = (yMin + yMax) / 2;

    GLfloat A = zMap[xMin][yMin];
    GLfloat B = zMap[xMax][yMin];
    GLfloat C = zMap[xMin][yMax];
    GLfloat D = zMap[xMax][yMax];

    GLfloat E = (A + B + C + D) / 4 + randDisp(disp); // Midpoint height

    zMap[xMidpnt][yMidpnt] = E; // Set E

    zMap[xMin][yMidpnt] = (A + C + E) / 3 + randDisp(disp);  // F
    zMap[xMidpnt][yMin] = (A + B + E) / 3 + randDisp(disp);  // G
    zMap[xMax][yMidpnt] = (B + D + E) / 3 + randDisp(disp);  // H
    zMap[xMidpnt][yMax] = (C + D + E) / 3 + randDisp(disp);  // I

    if ((xMidpnt - xMin) > 1) { // Subdivide if new midpoint length will be > 1

        generateLandscapeRec(xMin, xMidpnt, yMin, yMidpnt, nDisp);
        generateLandscapeRec(xMidpnt, xMax, yMin, yMidpnt, nDisp);
        generateLandscapeRec(xMin, xMidpnt, yMidpnt, yMax, nDisp);
        generateLandscapeRec(xMidpnt, xMax, yMidpnt, yMax, nDisp);
    }
}

问题可能与算法有关,也可能与我选择观点的方式有关。

有什么想法和/或帮助吗?

4

1 回答 1

1

我猜你遇到了舍入错误。如果您使用非二次幂范围(如 6x6),则仅检查 xMidPnt 与 xMin 的递归将不起作用,并且如果您的 y 范围大于您的 x 范围,也将不起作用。您将希望使用 4 个条件,每个季度一个。

if ((xMidpnt - xMin) > 1) || (yMidpnt - yMin > 1))
    generateLandscapeRec(xMin, xMidpnt, yMin, yMidpnt, nDisp);
if ((xMidpnt - xMin) > 1) || (yMax - yMidpnt > 1))
    gnerateLandscapeRec(xMin, xMidpnt, yMidpnt, yMax, nDisp);
...
于 2014-01-02T05:03:31.623 回答