根据本文,我已经实现了菱形平方算法:http : //www.lighthouse3d.com/opengl/terrain/index.php?mpd2
问题是我在地图上到处都是陡峭的悬崖。递归地细分地形时,它发生在边缘:
来源如下:
void DiamondSquare(unsigned x1,unsigned y1,unsigned x2,unsigned y2,float range)
{
int c1 = (int)x2 - (int)x1;
int c2 = (int)y2 - (int)y1;
unsigned hx = (x2 - x1)/2;
unsigned hy = (y2 - y1)/2;
if((c1 <= 1) || (c2 <= 1))
return;
// Diamond stage
float a = m_heightmap[x1][y1];
float b = m_heightmap[x2][y1];
float c = m_heightmap[x1][y2];
float d = m_heightmap[x2][y2];
float e = (a+b+c+d) / 4 + GetRnd() * range;
m_heightmap[x1 + hx][y1 + hy] = e;
// Square stage
float f = (a + c + e + e) / 4 + GetRnd() * range;
m_heightmap[x1][y1+hy] = f;
float g = (a + b + e + e) / 4 + GetRnd() * range;
m_heightmap[x1+hx][y1] = g;
float h = (b + d + e + e) / 4 + GetRnd() * range;
m_heightmap[x2][y1+hy] = h;
float i = (c + d + e + e) / 4 + GetRnd() * range;
m_heightmap[x1+hx][y2] = i;
DiamondSquare(x1, y1, x1+hx, y1+hy, range / 2.0); // Upper left
DiamondSquare(x1+hx, y1, x2, y1+hy, range / 2.0); // Upper right
DiamondSquare(x1, y1+hy, x1+hx, y2, range / 2.0); // Lower left
DiamondSquare(x1+hx, y1+hy, x2, y2, range / 2.0); // Lower right
}
参数:(x1,y1),(x2,y2)-定义高度图上区域的坐标(默认为(0,0)(128,128))。范围-基本上最大 高度。(默认为32)
帮助将不胜感激。
不用仔细看代码,看起来在最后的4个递归调用中,您可能在错误的调用中遇到了错误的角落。该地图看起来像每个正方形在计算下一组之前都已旋转/翻转,因此将地图细分为奇特的悬崖。右上角正方形的底部边缘看起来像它与左上角正方形的右边缘匹配,依此类推。
—
DampeS8N 2012年
我不确定你是什么意思。坐标系的中心在左上角,x轴指向右侧,y轴指向下方。因此在第一次迭代中(x1 = 0,y1 = 0),(x2 = 128,y2 = 128)和(x1 + hx = 64,y1 + hy = 64)是正方形的中心。正方形因此分为4个子正方形:((0,0)(64,64)),((64,0)(128,64)),((0,64)(64,128))和((64, 64)(128,128))。在我看来很好...
—
kafka 2012年