我正在尝试在OpenGL中实现菱形方形地形生成算法。
到目前为止,我有一个2D平面(实际上是一个3D,但所有Z坐标都设置为0),由多达1024个不同的正方形组成。坐标被组织成二维数组
我们有例如:
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);
}
}
问题可能出在算法上,也可能与我选择积分的方式有关。
有任何想法和/或帮助吗?
答案 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);
...