無限の地形のための手続き型の川または道路の生成


28

私は中世のように考えているので、道ではなく道を言うべきです。また、リアリズムを探していません。私が探している答えは、リアリズムではなく、私が説明する型に収まることです。

曲線的な方法で手続き型の道路/川を生成する方法を探していますが、無限の地形タイプのシステムでそれを行いたいと思っています。perlinノイズがブロブを生成する方法と同じように、ランダムな長さのラインセグメント(場合によっては無限の長さ)を生成したいと考えています。

私はここにある提案された答えのような戦略を知っていますが、それは指定された開始点と終了点に依存するため、指定された開始点と終了点がありません。任意の座標を使用して単純に関数を呼び出し、特定の座標が川/道路の一部であるかどうかを返すことができるようにしたいと思います。

地形を事前に生成する必要はありません。これには、ハイトマップが含まれます(降雨シミュレーションなどに使用されます)。また、開始点/終了点を必要としません。

私が説明しようとしていることを達成するために、誰かが知っているかもしれないノイズアルゴリズムにそのようなアルゴリズムまたは微調整がありますか?

名前を適切に使用している場合、これまでに最も近いのはマルチリッジフラクタルです。値ノイズの絶対値を取得し(-1から+1にスケーリングされると仮定)、しきい値を設定しています。これに関する私の主な問題は、線が頻繁に重なりすぎて、ほとんどが円形であり、時にはきれいであるが望ましくない大きな湖を形成するように収束し、線の太さが非常に異なることです。

ここに私がこれまで2Dで持っていたものの写真がありますが、より詳細を示すために非常に高い頻度で:

ここに画像の説明を入力してください


川は「流れる」ため、ノイズを使用して原点を決定するだけで簡単に川を決定できます。その後、生のハイトマップデータを使用してパスを決定します。
戦争

道路は少し難しいかもしれませんが、使用に基づいて道路を構築することを検討しました。プレーヤー/すべてのプレーヤーが定期的に何らかの地形を歩いた場合、それはパスになります。
戦争

1
@ user19142 OK、重複ではありません。あなたにもこの質問/答えのいくつかの使用を見つけることがあります。gamedev.stackexchange.com/questions/53400/...をそして「関連」と私は再び以前のリンクが含まれますgamedev.stackexchange.com/questions/45403/... gamedev。 stackexchange.com/questions/29044/...の gamedev.stackexchange.com/questions/31263/...
MichaelHouse

4
ノイズが発生すると、道路はあまり信頼できないと思います。道路は物理学や時間ではなく知性によって作成されます。それらは時々互いに似ているかもしれませんが、あなたはおそらく両方に同じアルゴリズムを使用することができないほど十分に異なっています。
マイケルハウス

1
そのプロジェクトの道路は、特定の高さに沿った等高線であるため、ローカルで生成できます。そこでは機能しましたが、高さマップ Perlinノイズで生成されませんでした
-amitp

回答:


11

(多くの)事前計算と無限の世界の可能性なしで、あなたが望むものをアーカイブする私のアイデア。

アルゴリズムの最初のポイントは、Voronoi-Diagrammsの使用法です。世界をグリッドに分割します。各グリッドには(xgrid、ygrid)という形式のアドレスがあります。あなたが道路を作成する必要のある各セルのためには、番号を返すハッシュ関数へのXgridとYGRID変数を入れセルシードを。あなたが使用セルシードをボロノイDiagrammための点の座標を生成する乱数発生器のシードとして。

ここで、ダイアグラムのエッジと、複数のエッジが衝突するノードを検索する必要があります。より簡単にアクセスできるように、情報をグラフに保存することもできます。

このステップの後、有効なネットワーク経由のパスを検索できます。

有効なパスについては、道路を作成できるようになりました(エッジはシャープになります)。

:また、セルの端に境界線がないように、すべてのneightborセルのVoronioダイアグラムの座標を生成する必要があります。

エッジをシャープにしたくない場合は、各接続の中間点を計算し、グラフ内の2つのエッジ間のベジェ補間の方向として接線を使用できます。

ボロノイ図の使用について

道路構造のような都市をアーカイブするには、擬似ランダム関数のポイントをグリッド上に整列させることができるため、ウェイは長方形になります。

道路のようなより多くの郡では、ポイントはより順不同でなければなりません。

ウィキペディアの図

ボロノイ図の点の位置を生成するための擬似乱数関数について

通常のランダム関数、または点のより均一な非塊状分布のためのHammersleyセットにすることができます。


ハッシュ関数の例はありますか?私は同じ目標(道路にボロノイを使用する無限の世界)を持っていますが、これをどのように行うべきかを理解できないようです。私が見つけることができるすべてのvoronoi libは、すぐに目的を無効にする境界ボックスの座標を期待します。
BotskoNet

いいえ、ハッシュ関数は、セルにスターティシードを割り当てるためだけのものです。x * prime1 + y * prime2 + z * prime3のように簡単なものにすることができます。素数が互いに等しくなく、理想的には大きい場合、ここでは64ビット整数/符号なしで計算する必要があります。libがバウンディングボックスを使用している場合は問題になりません。各セルについて、セル内のすべてのポイントに加えて、近隣セル(8つの近隣セル)のすべてのポイントを考慮する必要があるからです。
Quonux

libが単精度を使用する場合、または単精度を使用する場合、単精度で精度の問題が発生する可能性があります。libが単精度を使用するだけで、次のようにしない場合に問題をバイパスするには:位置を単精度に変換する前に、中心セルのグローバル位置をそれらから減算し、これを浮動小数点数としてlibに入れ、変換します結果を返します。
Quonux

私は実際にこのアルゴリズムを実装したことはありませんが、ハッシュ関数は確かに些細なものになり得ます。
Quonux

8

道路(および都市)の作成に関して、私が見つけた最高の論文は次のとおりです。

YパリッシュとPミュラーによる都市の手続きモデリング

これはL-Systemを使用し、米国およびEUの道路パターンを生成できます。都市全体の道路を生成したくない場合は、主要道路のみを生成できます。入力には、高さマップ、水マップ、および人口密度マップを使用できます。


紙が好きだったからといって+1。地形を動的に生成しながら、道路/小道/川の生成をどのように試みたいのか、実際には適合しませんでした。
神話

6

http://vterrain.org/Culture/Roads/セクション「3D道路の生成」には、道路生成に関する情報があります

道路の問題は、ランドマーク接続することです(ただし、AからBにまっすぐ進むのではなく、多くの場合、地形辿ります)。

個人的には、地形を生成し、次に川を配置し(浸食を使用して、http://vterrain.org/Water/セクション「水文地質学」を参照)、意味のある場所に都市を配置します(川やその他の近くに配置します)水源、または水路や給水塔とパイプを使用して水を輸送できる場所で)、最終的に都市間の道路を生成します。

これを手続き型の世界でより使いやすくするために、その場所で生成されたときに道路が最も行きそうな地形に中間点を作成し、その場所で実際に道路が作成された場合に中間点を接続できます。


4

まず、川と道路は非常に異なっています。道路は等値線をたどる傾向があります(同じ/類似した標高)-その理由は、あまり上昇または下降しない道路を走行する方がはるかに簡単だからです。一方、川は等値線/等値線に垂直に移動します(下り坂)。川は盆地(すべてが特定の谷に向かって下向きに流れる山の集まり)に形成され、樹木のような構造を形成する傾向があります。さらに、論理的な橋を形成するために、道路はしばしば川に垂直に移動します。最善のアイデアは、最初に川を生成し、次に論理道路(都市間の道路)を作成することです。残念ながらこれ以上詳しく説明する時間はありませんが、うまくいけば正しい軌道に乗ることができます。

当たり前のように思えるかもしれませんが、さまざまな種類の地形や道路でのGoogleマップを見てください。あなたは彼らがどのように見えるべきかのより良い感覚を得るでしょう。


1
質問を再度修正して、アルゴリズムが機能するのに必要な方法と同じくらい近くで、リアリズムに興味がないことをより理解できるようにしました。それにも関わらず、主に使用されている用語のいくつかについては、答えに感謝します。私の欲望を、必要な最小限のデータ(高さマップなど)で生成できる無限のランダムな長さの波線のように考えてみてください。
神話
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.