回答:
これを実現する1つの方法は次のとおりです。
何が起こるかは、繰り返しごとに景色の細部が細かくなることです。
境界ケースの処理方法はユーザー次第です。たとえば、(0、height / 2)および(width、height / 2)のポイントを想定できます。
お役に立てれば!
編集:これは私が説明のために作った写真です:
あなたが実際に滑らかな地形を望んでいると仮定して、私はノイズベースの答えから離れて、それらがどこから来たかを理解することを提案します。「ノイズ」信号は、本質的に、ランダムな振幅の無限に多くの正弦波の合計であり、周波数fの関数によって与えられる特定の周波数での「平均」振幅です。この方法で、ほとんどの一般的な「ノイズ」定義を取得できます。たとえば、ブラウン運動は1 / f ^ 2周波数応答(つまり、特定の周波数での平均振幅は周波数の2乗に反比例します):これは、信号の高周波成分が非常に大きいため、近くのポイントが互いにかなりの相関関係があることを意味します減衰しました。対照的に、古典的なフラクタルノイズ(中間点変位、パーリンノイズなど)には1 / f周波数応答があります。近くの点の間にはより多くの分散がありますが、それでもかなりの相関関係があります。さらに一歩進むと、ホワイトノイズには一定の周波数応答があります。どの点にも相関はありません。
これは何の役に立つ?さて、いくつかの正弦波を加算するだけで、任意の周波数で適切な振幅を確保することで、少しノイズの多い滑らかな信号を得ることができます。周波数を「ランダム」にしたいので、それらの2つが公倍数を持たないようにします(そうしないと、丘の全体的な形状に周期的な成分が得られます)。そのため、次の手順(完全な作業例付き):
Wolfram Alphaにプロットされた私の実行例は次のとおりです-グラフのサイズは表示目的で固定されていますが、上記の定数を介して結果の水平および垂直ストレッチを十分に制御する必要があることに注意してください:
中間点の変位アルゴリズムは美しい2D地形を生成することができます。
中点の変位と@tykelが示唆しているものの間には微妙な違いがあります。タイケルのアルゴリズムは地平線を細分化し、新しい高さを選択します。これにより、山が等間隔に配置される地形が作成されます。人間は規則性を選ぶのが得意なので、生成地形は自然ではなく生成されたように見えます。
ミッドポイントのパワーは、ミッドポイントを選択し、そのラインの法線に沿って移動することから得られます。これにより、ピークが上下および左右に変化します。結果として生じる地形はフラクタルであり、人間はフラクタルを自然であると認識します。
ランダムな高さの変位は、さらにいくつかのパラメーター(水平変位、最大勾配など)を投入した場合、下降地形になります。これは、MPDのもう1つの強みを強調しています。チューニングは非常に簡単です。2つのパラメーター、凹凸と詳細レベル。
ノイズ関数を使用して、ランダムな高さを生成できます。最も単純なものは値ノイズであり、説明とまったく同じように機能します。ランダムな整数の高さをいくつか生成し、それらの間の高さを補間します。最もよく使用される補間方法は、キュービックSカーブマッピングです。
h0
ポイントx0
に高さ、ポイントに高さがあるとh1
しますx1
。次に、任意のポイントで高さを取得するにはx
(x0<=x<=x1
)、使用します
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
この方法で得られた高さは、滑らかでランダムになりますが、あまり面白くありません。地形を改善するために、フラクタルノイズを使用できます。これは次のように機能h(x)
します。特定の座標で高さを返す関数を生成したと仮定します(上記の方法を使用)。この関数には、元のインターガーの高さの頻度によって決定される頻度があります。フラクタルを作成するには、いくつかの周波数を持つ関数を組み合わせます。
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
この例では、オリジナル、ダブル、4倍、8倍の4つの周波数を組み合わせます。重みを小さくすると周波数が高くなります。理論的には、フラクタルは無限大になりますが、実際にはわずかな用語しか必要ありません。fbm
式では、フラクショナルブラウン運動の略です-これは、この関数の名前です。
これは強力なテクニックです。周波数の乗数、さまざまな周波数の重み、またはノイズを歪めるための機能を追加できます。たとえば、より「うねった」感触をh(x)
得るには、1-abs(h(x))
(想定-1<=h(x)<=1
)に変更できます
ただし、これはすべて素晴らしいことですが、この手法には重大な制限があります。「ハイトライン」ベースのアプローチを使用すると、地形の「オーバーハング」は発生しません。そして、それらは「ムーンバギー」のようなゲームで持っている非常に素晴らしい機能であると思います。
素敵なオーバーハングを追加するのは難しい作業です。私が考えることができる1つのこと-あなたはフラクタル「高さ線」から始めて、それを一連のスプラインまたはベジェ曲線に「テッセレーション」することができます。次に、テレインラインは複数の「キーポイント」によって定義されます。これらのキーポイントにジッターを適用します。これにより、地形がランダムに変形し、おそらく興味深い形状が形成されます。ただし、このアプローチでは、特にジッタ量が多いと、地形の自己交差が問題になる場合があります。
テレインハイトマップを生成するには、2つの一般的な方法があります。
ここで与えられたいくつかの答えは、すでにダイヤモンド二乗アルゴリズムに基づいていますが、名前を知っていると、より多くの情報を検索しやすくなります。パーリンノイズには他の用途もあるため、とにかくチェックすることをお勧めします。