我在 Terra3D 中的方法是生成随机高度值,然后进行 3 次平滑处理,并在算法中写入一点整形。重塑导致水线以下的地形稍微向下移动,而水线以上的一切都向上移动一点。效果虽然是很多山丘和小湖。这可能不是您正在寻找的东西。
但是,我不相信我的方法背后的主体不能用来获得你想要的东西。您可能只需要在整形/平滑算法中写入更多条件。例如,在较高海拔的地形上减少平滑量将创建更多的落基山脉外观。然后编写一个更复杂的平滑(或高斯)算法,在低海拔地区进一步延伸,可以将这些湖泊拉在一起形成天然河流。
如果您有兴趣,这里是Terra3D中地形生成的代码:
// GENERATE TERRAIN
for (i = 0; i < MAX; i++)
{
for (i2 = 0; i2 < MAX; i2++)
{
if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
field[i][i2].y=0;
else
field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
}
}
// SMOOTH/RESHAPE TERRAIN
for (int cnt = 0; cnt < 3; cnt++)
{
for (int t = 1; t < MAX-1; t++)
{
for (int t2 = 1; t2 < MAX-1; t2++)
{
field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;
if (cnt == 0)
{
if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
}
}
}
}
这是我大约 10 年前写的草率代码。Terra3D 是一个漫长的实验学习过程,在黑暗中摸索以产生我正在寻找的效果类型。但也许它会有所帮助。