我正在尝试在 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);
}
}
问题可能与算法有关,也可能与我选择观点的方式有关。
有什么想法和/或帮助吗?