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 は、私が探していたタイプのエフェクトを生成するために、暗がりで試行錯誤する長い学習プロセスでした。しかし、多分それは役立つでしょう。