Perlinワームによる洞窟生成


11

私は現在、3Dシンプレックスノイズでボクセル地形のようなMinecraftを生成しようとしています。また、洞窟を実装したいと考えています。

このスレッドでPerlin Wormsのメソッドを見つけました。これは本当に素晴らしい結果を生成します。ただし、チャンクごとにそれを生成する方法についての手がかりはありません。これは可能ですか、それともチャンクごとに洞窟のような類似のワームを生成する代替策はありますか?

編集:これは私が解決する方法がわからない問題です。

Edit2:これは、2Dリッジマルチフラクタルノイズとシンプレックスノイズハイトマップを組み合わせた結果です。まだ少し調整が必要ですが、これはほとんど私が望んでいた結果です。Byte56に感謝します。


可能であれば、地形生成には直接公式を使用する必要があります。隣接するボクセルに関する情報がなく、その座標のみに基づいてボクセルを計算できる場合、チャンクは問題ではなくなりました。ボクセルごとに個別に計算できないと思うパーリンワームを使用する場合は、リンクした質問の承認済み回答の最後の段落を確認してください。
ダニジャー2013

1
基本的に、それが私の質問です。基本的な地形は与えられた座標だけで簡単に計算できますが、洞窟があるかどうかにかかわらず、計算方法はわかりません。
user000user 2013

回答:


5

ほとんどのパーリンノイズアルゴリズムでは、任意の場所のノイズ値をのように取得できますnoise(x,y,z)。これにより、チャンクごとにノイズを生成することはかなり簡単になります。チャンクの位置ではなく、グローバルな位置を渡すだけです。

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

ご覧のとおり、チャンクの境界を反復処理してチャンクの地形を生成し、そのグローバルな位置が安定しているかどうかを確認しています。これは、地形の生成に一般的に使用しているのと同じ方法です。

perlinNoise.getグローバルな位置を取り、その密度を返します。どこisSolidボクセルが固体の資格を得るのに「十分な密度」であるかどうかを確認する簡単なテストはにありますか。

perlinNoise.get単純なノイズアルゴリズムよりも複雑になる可能性があります。あなたの世界のボクセルの深さに基づいてチェックすることができます。たとえば、ボクセルが「絶対ベースグラウンドレベル」であると決定した値よりも低い場合、パーリンワームアルゴリズムを使用して密度を返すことができます。絶対ベースを超える場合は、通常の密度関数を使用してより多様な地形。ただし、この2つをブレンドすることをお勧めします。

さまざまなPerlinノイズ関数を組み合わせるのは、実際に操作して何が機能するかを確認する必要があるだけです。ゲームをリロードする必要なく、いくつかの値を変更して地形をホットスワップできるように環境をセットアップするのが最善です。幸せな実験。


2
答えてくれてありがとう。ただし、「通常の」Perlinまたはシンプレックスノイズを使用して、ワームのような洞窟を作成する方法はわかりません。それらは球状で、一方向にスケーリングされているか、それほど長くありません。また、Perlinワームアルゴリズムの場合、現在の位置がワーム内にあるかどうかを判別する方法がわからないので、頭の位置がわかりません。
user000user 2013

1
ワームのアルゴリズムは、「頭の位置」を知ることに依存していません。あなたが言っていることから、あなたの問題はチャンクごとにノイズを生成することではないようです。perlinワームを実装するためにリンクした質問に関するチュートリアルがあります。「通常の」地形を生成する方法については、こちらをご覧ください
MichaelHouse

3Dシンプレックスノイズを使用した基本的なテレイン生成は正常に機能しますが、チャンク内のワームの位置/セグメントを決定する方法がわかりません。私が理解したことから、ワームに頭の位置とn個のセグメントを与え、セグメント間の角度をノイズ関数で計算します。これは、私の問題が何であるかをよりよく説明する画像です:リンク
user000user 2013

2
ノイズにはさまざまな種類があります。ヘッドポジションを使ってそこからフォローするのが1つの方法です。このページの下部近くを見ると、最初に頭の位置を必要とせずに、希望の種類のノイズを作成するノイズが見つかります。
MichaelHouse

そのヒントをありがとう。3Dリッジマルチフラクタルノイズを実装しましたが、結果はやや満足のいくものではありませんでした。2Dと2Dの高さマップを組み合わせて、もう一度レポートしてみます。これにより、ワームのような洞窟が作成される場合があります。
user000user 2013

3

これがMinecraftでの動作方法だと思います。各ワームには最大長があります(これをと呼びましょうM)。各ワームの頭は、チャンクの位置に基づいて計算されます。各チャンクをレンダリングするときは、M半径内のすべてのチャンクをチェックし、それらのすべてのワームを追跡する必要があります。パフォーマンスの点では理想的ではありませんが、機能します。

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