3Dパーリンノイズ関数は、地形の生成にどのように使用されますか?


20

高さの値を生成するために2Dパーリンノイズ関数を使用して頭をラップできますが、3Dパーリンノイズ関数が使用される理由がわかりません。Notchのブログhttp://notch.tumblr.com/post/3746989361/terrain-generation-part-1で、彼はMinecraftでの地形生成に3Dパーリンノイズ関数を使用することについて言及しました。誰がそれがどのように行われ、なぜそれが役立つのかを知っていますか?x、y、およびzの値を渡す場合、それはすでに高さがあることを意味しませんか?

回答:


19

2D perlinノイズは高さマップに適していますが、この場合、彼は高さマップを使用していないようです。代わりに、彼は3Dグリッドを使用しており、どのセルも空にすることができます。これにより、特定の2D位置で地面の高さが単一の値ではない洞窟などの形成が可能になります。


14

「地面の高さ」をサンプリングする代わりに、ノイズ値を「密度」として扱いました。0より低い値は空気であり、0以上の値は地面です。

簡単に言えば、ブロックが存在する可能性のあるすべての場所について、ノイズ関数が評価され、> 0の場合、ブロックが配置されます。Notchのノイズ関数は、水位からその値に高さを追加することによって歪められます。そのため、低い領域はほとんど固体であり(高さが大きい負なので、高さ+ノイズも負です)、高い領域はほとんど空です(高さが大きい正なので、高さ+ノイズも正です)。

どのような種類のブロックを生成するかを決定し、洞窟を彫るために、おそらくいくつかの追加の錬金術があります。しかし、私はそれがこのノイズ関数に直接関係していないと思います。

また、Minecraftにはボクセルベースの地形があるため、この方法はNotchでも機能することに注意してください。ポリゴンベースの世界でそれを引き出そうとした場合、単にノイズ関数をサンプリングするだけでは十分ではありません。サンプルをサーフェスに変換するアルゴリズムを使用し、このサーフェスに近いポリゴンを作成する必要があります。そのようなアルゴリズムの1つは、キューブのマーチングです。


8

地形に洞窟ネットワークとオーバーハングが必要な場合、3Dノイズは必須になります。

密度情報から等値面を抽出するための最も一般的な2つの手法は、マーチングキューブ(MC)と新しいデュアルコンターリング(DC)です。必要なデータ構造は、選択した方法によって大きく異なります。

前述したように、GeissのGPU Gems 3の記事は、GPUでMC地形を理解して実装するための非常に有益な出発点です(彼のMCアプローチは完全にGPUで実行され、少なくともSM4-GS対応のものが必要です)。

MCボクセルの密度データはボクセルのエッジ上にしかとどまらないため、従来のMCはシャープエッジフィーチャを保持せずにボリュームの輪郭を描く場合があります。密度情報は、ボクセル内の任意の場所に配置された3Dポイント(QEFミニマイザー)と各コーナーの記号として表されるため、DCにはこの欠点がありません。

一方、MCは生成されたすべての三角形が対応するボクセルに囲まれているため、自己交差する面の影響を受けませんが、DCは生成された面間の交差を防ぐために追加の計算が必要です。DCの作成者は、アルゴリズムの改良バージョンでこの問題に対処しました。

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

このフェローは、自己交差を回避するための凸/凹分析に基づいた、よりクリーンなアプローチを提案しています。彼は、エッジの方向を維持するために、より優れたクワッド分割ルールも使用しています。

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Classic MCは、すぐに使用できる「クラックフリー」ではないため、無制限のoctreeで実行した場合、クラックパッチを適用する必要があります。DCはこの最後の問題に悩まされていません。

以下は、ほとんどのメッシュ抽出技術の非常に素晴らしく完全な調査です:http : //www.cs.berkeley.edu/~jrs/mesh/

オクトツリー/ボクセルアプローチは本質的に「CSGフレンドリー」で、きちんと完全に「破壊可能な」ゲームレベル戦略の計画を容易にしますが、ゲームでこれをすべて実装する必要がある場合は、オクトツリーの深さもフラスタムにする必要があります-依存。

全体がメモリに収まるか、正しくストリーミングされる場合、データはAOのレンダリングと物理学/衝突の計算にも使用できます。


「地形に洞窟ネットワークとオーバーハングが必要な場合、3Dノイズが必須になります。」必須ですか?同様に、これが洞窟と張り出しを生成する唯一の方法ですか?いや。2Dパーリンノイズからハイトマップを生成してから、より自然な外観にするために、個別のステップとして洞窟とオーバーハングを彫ります。これが、手続き的に生成された世界で洞窟と張り出しを生成する唯一の方法であると言うのは、若いゲーム開発者の新進に誤解を招きます。
ドマリウス

5

私の推測では、その特定の例では、z値を使用して、岩盤、石、土、または空気の種類を決定していると思います。


-3

Minecraftは、マーチングキューブアルゴリズムを使用して3D地形を生成します。私はこれについて言及していません、すみません。彼がPerlin Noise関数について言及したとき、Notchが何について話していたか正確にはわかりません。おそらくマーチングキューブアルゴリズムの種です。詳細はこちら:

キューブのマーチングに興味がある場合は、GPU Gemsのすばらしい記事をご覧ください。


2
マーチングキューブは、スカラーフィールドからメッシュを生成するためのアルゴリズムです。つまり、最初にデータを取得する必要があり、次にデータに適合するメッシュを生成します。データや地形を生成するためではありません。
マイケルハウス

-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 

2
-1; あなたが追加した明確化でさえ、これはかなり悪い答えです、それはコードスニペットの目的や結果のデータへのその意味的影響を明確に説明せず、ユーザーが実際に持っていた質問のほとんどに対処しません。

コードを編集しましたが、今はどうですか?
マキシムDC

3Dノイズを使用して地形を作成する方法を説明しています。これは私の意見では正しいです
マキシムDC

次に、これを回答で説明し、ユーザーが抱いた質問に対処します。それ以外の場合は、デッドコードの回答です。
トム「ブルー」ピドック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.