大面积钻石广场地形生成

时间:2014-01-01 23:23:56

标签: c++ opengl terrain procedural-generation

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

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

  • 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);
    }
}

问题可能出在算法上,也可能与我选择积分的方式有关。

有任何想法和/或帮助吗?

1 个答案:

答案 0 :(得分: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);
...