C#パーリンノイズ-「エンドレス」テレインチャンクの生成?


7

私は現在、C#の学習と楽しみの両方のために、C#で小さなサイドスクローラーを作成しています。現在、私は世界を生成する単純な乱数ジェネレーターを持っていますが、それはそれほど優れているわけではありません。そのため、いくつかの調査により、Perlin Noise生成がかなり役立つことを発見しました。問題は、いくつかのチャンクで構成された「無限の」風景が欲しいということです。

基本的に私の質問/懸念は:

  1. 例としてminecraft(3次元を無視)を使用して、Notchはどのように各チャンクを互いに完全に接続するのですか?トンネル、洞窟、鉱脈、山、平坦な土地、バイオームなどは、各チャンクが個別に生成される場合でも、場合によっては後日生成される場合でも、すべて相互に接続されています。これは私にとって重要です。プレイヤーが右に歩くことができるようにして、彼らが歩いているときに、地下のトンネルや洞窟システムなど、以前の風景に接続するより多くの風景を生成します。
  2. #1から離れると、各チャンクが正方形であり、世界の高さが10正方形で、幅が無限の正方形であるという仮定の下で、これはどのように達成されますか?つまり、各「チャンク」は128x128タイルであり、世界は合計で1,280タイルです。(これは、選択した場合に無限に深いマップを作成できるようにするためです。また、チャンク/スクエアの4辺すべてを接続して、前のスクエア/チャンクが行っていた処理を続行できる必要があることを示すためです)。

回答:


10

Simplex NoiseのC#実装を見つけます。Perlinに似ていますが、動作が速く、高速です。

PerlinやSimplexのような連続ノイズ関数の特徴は、それらが確定的であり、ノイズがランダムではないことです。ほとんどのノイズ実装が使用するのは、生成されたノイズにオフセットするシード値です。これにより、シード= 1とシード= 2が異なります。

上記の観察により、シードを再利用し続けることができ、ノイズ関数を移動するときに生成されるすべての新しい地形は、中断したところから再開するため、一致します。

この部分は非常にシンプルで非常に優れています。生成されたノイズを使用して行うのは、魔法が発生する場所です。

ジェームズにとってそれは可能ですが、3Dノイズを使った私の個人的な速度テストは、シンプレックスが3の方が速いことを示しましたが、私の個人的なテストではいくつもの要素である可能性がありますが、それは文献の一般的な考えと一致しました。それが遅くても、perlinが行う「正方形」のアーティファクトが表示されないため、シンプレックスをお勧めします。

Jonにとって、Noiseは数学関数であり、パラメーターから結果を出力し、同じパラメーターを指定すると、同じ数を返します。混乱の原因がどこにあるのかわかります。

このノイズ関数は次のようにサンプリングされます。number= noise(x、y、z); 3次元ノイズの場合。例として、最初のマップはX = 0.0からX = 1.9の範囲でサンプリングされ、そのすぐ右側のマップが続き、X = 2.0から3.9の範囲でサンプリングされます。

ノイズを使用する技術の一部は、サンプリングする適切な範囲を見つけ、オクターブの数を決定し、フィルタリングと処理などを行うことです。いくつかの例と実際のPerlinのソースコードを確認するには、便利なノイズライブラリをご覧ください。


2
シンプレックスは、パーリンノイズよりも3次元または4次元よりも高い次元でのみ高速であると思いましたか?そのパーリンは、より高い次元を補償するために特にシンプレックスを組み立て、彼の元のアルゴリズムが遭遇した速度を落としました。
James

したがって、基本的に、ワールドの作成時にランダムシードを生成し、そのシードを供給し続ける場合、最初のノイズマップの右側に配置する新しいノイズマップを作成すると、それは継続しますか?つまり、最初のノイズマップに最終的には鉄鉱脈が含まれる場合、その鉄鉱脈は新しいマップでも継続されますか?これはどのように機能しますか?アルゴリズムは、左、右、上、または下側のノイズマップを「継続」する必要があることをどのようにして知るのでしょうか。
Jon

@Jon回答を編集して、ノイズ関数が何をするかをよりよく説明しようとしましたが、ノイズを使用して一度に1つの連続的なマップを作成する方法の点で、より意味があると思います。最も重要な考え方は、ノイズはランダムではないということです。
Patrick Hughes

@PatrickHughesすごい編集でかなりクリアになりました、ありがとう。次に、シンプレックスノイズ生成を処理するための単純なC#/ XNAクラスを見つける必要があります。
ジョン

2

ノイズテーブルは、他のシームレステクスチャマップと同じように、シームレスにタイリングするように事前計算されています。これがポイントXに移動できる理由であり、常に同じであり、アニメーションでは非常に重要なので、テクスチャはフレームごとに変化しません。

Answers.unity3d.com(手続き型サイドスクローラーレベルの生成)にこれに関するスレッドがあります

また、1994年の本「手続き型モデリングとテクスチャリング」では、ノイズとマルチフラクタル(周波数と回転が異なる層状ノイズ)について説明しています。


私はあなたを誤解しているかもしれません、または私は自分自身をうまく説明していませんでした-シームレスに並べたくありません。互いに接続するユニークな「チャンク」(ノイズマップ)の束を生成したいのです。それらのいずれかを同じにしたいのですが、「私の隣にいる人が途中にトンネルを持っている-私はそのトンネルを続けなければならない」と気づかせてほしいだけです。Minecraftの方法とまったく同じですが、2Dです。
Jon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.