2Dゲームの滑らかな地形を生成する最も簡単な方法は何ですか?


23

「Moon Buggy」や「Route 960」などの2Dゲームで滑らかな地形を生成する最も簡単な方法は何ですか?

stackoverflow.comで、ランダムな高さの配列を生成し、後でそれらをぼかすことについての回答を得ました。はい、大丈夫です。しかし、いくつかのポイントを与えて、滑らかな曲線を取得する方が良いでしょう。

回答:


13

これを実現する1つの方法は次のとおりです。

  • 画面の中央に、ランダムな高さのポイントを作成します。これで2つのセクションがあり、このポイントの両側に1つあります
  • すべてのセクションについて、このセクションの中央にポイントを配置して2つに分割し、その2つの隣接点の間の(範囲の)ランダムな高さで
  • n回繰り返します。

何が起こるかは、繰り返しごとに景色の細部が細かくなることです。

境界ケースの処理方法はユーザー次第です。たとえば、(0、height / 2)および(width、height / 2)のポイントを想定できます。

お役に立てれば!

編集:これは私が説明のために作った写真です:

テラインゲン

これは同じ考えです!


12

あなたが実際に滑らかな地形を望んでいると仮定して、私はノイズベースの答えから離れて、それらがどこから来たかを理解することを提案します。「ノイズ」信号は、本質的に、ランダムな振幅の無限に多くの正弦波の合計であり、周波数fの関数によって与えられる特定の周波数での「平均」振幅です。この方法で、ほとんどの一般的な「ノイズ」定義を取得できます。たとえば、ブラウン運動は1 / f ^ 2周波数応答(つまり、特定の周波数での平均振幅は周波数の2乗に反比例します):これは、信号の高周波成分が非常に大きいため、近くのポイントが互いにかなりの相関関係があることを意味します減衰しました。対照的に、古典的なフラクタルノイズ(中間点変位、パーリンノイズなど)には1 / f周波数応答があります。近くの点の間にはより多くの分散がありますが、それでもかなりの相関関係があります。さらに一歩進むと、ホワイトノイズには一定の周波数応答があります。どの点にも相関はありません。

これは何の役に立つ?さて、いくつかの正弦波を加算するだけで、任意の周波数で適切な振幅を確保することで、少しノイズの多い滑らかな信号を得ることができます。周波数を「ランダム」にしたいので、それらの2つが公倍数を持たないようにします(そうしないと、丘の全体的な形状に周期的な成分が得られます)。そのため、次の手順(完全な作業例付き):

  1. [1..10]の範囲でランダムに4つの(実際の)数値を選択します-これらは正弦波の周波数になります。random.orgで「さいころを転がし」、f 0 = 1.75、f 1 = 2.96、f 2 = 6.23、およびf 3 = 8.07を得ました。数字の4(より多く使用できますが、それより少ない数を使用すると個々の正弦波がより明確になります)または1〜10の範囲(これは単に最高と最低を確認する方法です周波数はそれほど離れていませ)。既知の「支配的な」正弦波が得られるように、範囲[1..2]の1つの周波数と範囲[2..10]の残りの周波数を選択することは理にかなっているかもしれません。
  2. これら四つの(又はしかし、多くの)周波数のそれぞれについて、F 、I、振幅を選択し、A Iとの間の範囲内のどこかにF〜C / IおよびC / F I一部定数のCを。ここで選択する値は、波の全体的な振幅を制御します。便宜上、C = 1 を選択しました。次に、範囲[-1 / 1.75(= -0.571).. 1 / 1.75(= 0.571)の乱数が必要でした]、および同様に[-0.338 .. 0.338]、[-0.161 .. 0.161]、および[-0.124 .. 0.124]の範囲です。4回もう一度サイコロを転がし、私が得た0 = -0.143、1 = -0.180、2 = -0.012を、そしてa 3 = 0.088 (これはおそらくこのステップを実行するのに最適な方法ではないことに注意してください-関数の可能な最大値は振幅の合計abs(a 0)+ abs(a 1)+ abs(a 2)+ abs(a 3)、生成した4つのa i値のそれぞれをこの合計で除算し、関数に到達できる正確な最大値がCであることを確認できるように、それぞれにCを掛けることがより意味があるかもしれません)
  3. 4「オフセット」を選んでoをの範囲内の各[0..2π](0..6.28)、 -これらは、彼らはすべて私が得た0から始まっていないので、あなたの波の開始点を微調整しますoを0 = 1.73、o 1 = 4.98、o 2 = 3.17、o 3 = 4.63
  4. 関数f(x) = a 0 sin(f 0(kx + o 0)+ a 1 sin(f 0(kx + o 1)+ a 2 sin(f 0(kx + o 0)+ a 3 sin(f 0(kx + o 0)-ここでkは別の定数で、関数の水平方向の「ストレッチ」を制御します。これが自分のアプリケーションにとって何であるかを理解する必要があります。便宜上、私はkを選んだ= 1なので、全体の関数はf(x) = -0.143 sin(1.75(x + 1.73))-0.180 sin(2.96(x +4.98))-0.012 sin(6.23(x +3.17))+ 0.088 sin (8.07(x +4.63))。

Wolfram Alphaにプロットされた私の実行例は次のとおりです-グラフのサイズは表示目的で固定されていますが、上記の定数を介して結果の水平および垂直ストレッチを十分に制御する必要があることに注意してください:

単純なランダム正弦波


10

中間点の変位アルゴリズムは美しい2D地形を生成することができます。

地形の例

中点の変位と@tykelが示唆しているものの間には微妙な違いがあります。タイケルのアルゴリズムは地平線を細分化し、新しい高さを選択します。これにより、山が等間隔に配置される地形が作成されます。人間は規則性を選ぶのが得意なので、生成地形は自然ではなく生成されたように見えます。

ミッドポイントのパワーは、ミッドポイントを選択し、そのラインの法線に沿って移動することから得られます。これにより、ピークが上下および左右に変化します。結果として生じる地形はフラクタルであり、人間はフラクタルを自然であると認識します。

ランダムな高さの変位は、さらにいくつかのパラメーター(水平変位、最大勾配など)を投入した場合、下降地形になります。これは、MPDのもう1つの強みを強調しています。チューニングは非常に簡単です。2つのパラメーター、凹凸と詳細レベル。


7

ノイズ関数を使用して、ランダムな高さを生成できます。最も単純なものは値ノイズであり、説明とまったく同じように機能します。ランダムな整数の高さをいくつか生成し、それらの間の高さを補間します。最もよく使用される補間方法は、キュービックSカーブマッピングです。

h0ポイントx0に高さ、ポイントに高さがあるとh1しますx1。次に、任意のポイントで高さを取得するにはxx0<=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つのこと-あなたはフラクタル「高さ線」から始めて、それを一連のスプラインまたはベジェ曲線に「テッセレーション」することができます。次に、テレインラインは複数の「キーポイント」によって定義されます。これらのキーポイントにジッターを適用します。これにより、地形がランダムに変形し、おそらく興味深い形状が形成されます。ただし、このアプローチでは、特にジッタ量が多いと、地形の自己交差が問題になる場合があります。


4

テレインハイトマップを生成するには、2つの一般的な方法があります。

ここで与えられたいくつかの答えは、すでにダイヤモンド二乗アルゴリズムに基づいていますが、名前を知っていると、より多くの情報を検索しやすくなります。パーリンノイズには他の用途もあるため、とにかくチェックすることをお勧めします。


OPは2D、マリオスタイルの風景について話しますが、それでも良いリンクです。
-tenpn

1

私の考えは、平滑化されたノイズ関数を作成することです。まず、「ランダムな」intを返すintNoise(int)メソッドを使用しますが、入力に依存します。同じ入力を2回使用すると、結果は同じになります。

次に、平滑化方法を使用して、入力の周りの2つの整数を使用して乱数を作成するfloatNoise(float)を作成します。

次に、X位置を入力として使用し、Yを出力として使用します。結果は、滑らかな曲線になりますが、高さはランダムになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.