Minecraftの洞窟に似た洞窟を生成する方法は?


34

しばらくの間、3Dプロシージャルワールドに取り組んでいますが、洞窟システムの追加を開始したいと考えています。現在、地形生成に2D / 3D Perlin Noiseを使用し、より滑らかな地形にマーチングキューブを組み合わせています。長い相互接続洞窟に関しては困惑しています。

私はMinecraftの洞窟システムのようなものを手に入れたいと思っています。それらは非常に接続されているようで、ほぼあらゆる方向にランダムに分岐しており、洞窟内のほぼすべてのポイントは、全体的にかなり等しい半径のかなり円形の外観を持っています(最良の言い回しではありませんが、他にどのように置くかはわかりません) 。

私が望んでいるような洞窟を生成するための最大の課題は、その場で世界を生成することです。ワールドは現在、チャンクごとに生成され、プレイヤーがいる場所から始まり、そこから外側に生成されます。私は世界のいずれかを生成し、その後、さまよえるパターン、セルオートマトンなどを使用して洞窟を掘り出したいとは思わないでしょう。

これに使用できる既知のアルゴリズムはありますか?もしそうなら、誰も彼らが似たようなことをする方法を共有したいですか?どんな助けでも大歓迎です。

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


5
ここを、下にスクロールします。
ウィリアムマリアガー

過去24か月以内にゲーム開発者向けの雑誌号があり、あなたがやろうとしていることをどのように行うかについて詳細に議論しています。私は彼らのサイトをヒットするでしょう。
ジョーイグリーン

@JoeyGreen雑誌の名前は何ですか?または、彼らのサイトへのリンクはありますか?
ジャンプネット

1
それはゲーム開発者誌と呼ばれています。gdmag.com。過去10年以上にわたって、雑誌の定期購読とPDFバージョンを入手できます。サインアップすると、以前の問題を検索して必要な問題を見つける方法があります。
ジョーイグリーン

回答:


30

Minecraftの洞窟は「perlin worms」メソッドによって生成されます。発電機は地形を蛇行し、トンネルを掘り出します。Minecraft 、地形に接続されていないポケットを残す傾向があるため、洞窟の生成に3Dパーリンノイズを使用しません。Minecraftの洞窟は、非常に初期のAlphaバージョン以降、3D Perlinノイズによって生成されていません。

perlin worm」メソッドから生成されたGnomescrollの洞窟を次に示します。

ノームスクロール洞窟システムの一人称視点1

ノームスクロール洞窟システムの一人称視点2

ノームスクロール洞窟システムサードパーソンビュー2

これらは、libnoiseチュートリアルのlibnoise "Perlin Worms"です。この手法は、Minecraftで生成された洞窟を厳密に再現します。

LinoiseチュートリアルPerlin Worms

蛇行パラメータは、洞窟システムの品質に影響し、洞窟の垂直度と方向の変化の速さを決定します。Minecraftブランチの洞窟と洞窟トンネルの半径は、洞窟の長さによって変化します。

Minecraftは、チャンクごとに洞窟を生成します。必要なアプローチは複雑であり、サーバーモデラーの関心にもかかわらず、Minecraftの洞窟ジェネレーターを完全にリバースエンジニアリングした人はいません。

最も可能性の高いアプローチは、無限マップが生成されて外側に拡張するときに、チャンクごとに蛇行洞窟を生成します。現在のチャンク上の洞窟は、いくつかのNの最も近いNチャンク上の洞窟シードの関数です。チャンク座標の関数である乱数ジェネレーターを使用して洞窟をシードすると、現在のチャンク上の洞窟を有限のチャンク半径内のチャンクのみを評価しながら、無限のマップ。


3
この「perlin worms」について学ぶために、いくつかの情報やリソースを追加できますか?
デヴィッドゴーベイア

1
これは「perlin
HaltingState

必ずしも必要ではありませんが、最後の段落について詳しく説明していただければ幸いです。ワームを生成するには、ワームごとに開始点が必要であると想定します。これは、ワームの最大長がNであるプレーヤーのNチャンク内にある必要があります。
神話

3
まさに。各ワームには開始点があり、特定のチャンク半径の外側をさまよう場合は終了します。チャンク座標の関数である擬似乱数列を決定論的に生成する乱数ジェネレーターがあります。これらの乱数により、そのノードで発生するワームの場所と数が決まります。ワームも分岐できます。ワームがより「ローカル」であり、小さなチャンク半径を超えてベンチャーできない場合、計算負荷は減少します。
HaltingState

たぶん、私が聞きたかったことではなく、私が期待していたことです。再びHaltingStateに感謝します。:)
神話

7

地形がしっかりしているエリア内にポイントのクラウドを生成します-さまざまな密度で実験できます。次に、最小スパニングツリーのようなアルゴリズムを使用して、すべてのポイントを接続します。これにより、すべてのエリアに到達できるようになります。次に、ノードからノード(つまり、ボクセルの太い線)に大きな中空(空気で構成される)領域を単純に描画します。


私はあなたがこれが何を意味するかを正確に理解していないかもしれませんが、世界が生成するようにチャンクごとにオンザフライでこれをどのように行うのですか?
神話

可能な方法の1つは、各チャンク内で最小スパニングツリーを個別に生成し、2つのチャンク間の最も近い2つのノードを見つけて各チャンクを接続することです。チャンクがデフォルトのテレインアルゴリズムで満たされた後、最小スパニングツリーの周りをくり抜くことができます。
ギャバンウールリー

1
別の(より簡単な)解決策は、効率は悪く、おそらく「ノイズが多い」が、ブラウン運動を使用してパスを切り開くことです(蟻がランダムに掘り起こすようなものです)。
ギャバンウールリー


1

ノイズ関数を使用してすべてのチャンクに値を割り当て、トンネルがあるかどうかを判断し、それらを使用して洞窟を配置する場所を決定します。トンネルが必要な場合は、より多くのノイズ関数(異なるシードを使用)を使用し、その値を使用してトンネルがあるかどうかを判断します。その後、通常の「描画」機能を使用してトンネルを作成します。すべてをよりリアルにするには、より多くのノイズを使用して、上記の洞窟/トンネルの原点のランダムな変位を行います。

複数のノイズ関数を使用したくない場合は、より長い距離でプローブすることができます-たとえば、(2,2,2)do noise3d(2,2、 16)そして、1つの値に(2,2,16)、2番目の値に(2,2,17)などを使用します...そして、それに応じて周波数を調整し、すべての値を独立させるか、短いスケールで相関させます。

世界全体で洞窟の密度を変えるには、上記の値に影響を与える別の低周波関数を使用します。

これが乱雑な洞窟になる場合は、単に相互接続されたポイントの距離を増やすか、アルゴリズムを調整します。

Minecraftがこのように洞窟を作るかどうかはわかりませんが(そうは思いますが)、この解決策は満足のいく結果をもたらすはずです。


-5

ここは

上記のような大部分の洞窟はPerlinワームを使用しますが、一部の人々はむしろ手動でそれをしたいと思います。このようにして、彼らはそれをブロックごとに正確に望むようにすることができます。Perlinワームを使用して作成された洞窟は不正確であり、高さ5フィート、幅6フィートにしかならない場合があります。

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