マップ生成のランダムシード関数?


28

マップの視覚的境界が(マップを通過することで)変化するときに、ランダムなタイルベースのマップを生成する関数を探しています。マップを無限に大きくし、迷路のような構造にする必要があります。

ただし、世界が無限である場合、プレイヤーが以前にいた場所に戻ると問題が発生します。ゲームは、そこにあるすべてのものが実際にどのように見えるかを覚えていなければなりません。

だから、私は考えていました-「Minecraftはこの問題をどのように解決するのですか?」そして、シードを持つ何らかの乱数関数を使用する必要があると思いました。それは前方にも後方にも進むことができ、そのようにして、古いインスタンスを正確に、しかし新しいインスタンスで再生成します。

これについてどう思いますか?


私の答えは+5ですが、質問は+2だけですか?これは、現在、フロントページにある最高の質問の1つです。

2
Minecraft は、あなたが既に訪れた/変更したチャンクを単に保存しないのですか?
FxIII

@FxIII:ランドスケープを変更できるため、Minecraftは必須です。それができない場合、チャンクを保存するのは無駄であるか、少なくとも複雑すぎます。

@ジョー・レシュニッヒ:わかりました、わかりました...本当に大きなものを見逃したのではないかと心配しました!
FxIII

回答:


20

気づいたのは、乱数ジェネレーターノイズ関数の違いです。乱数ジェネレーターは、呼び出すたびに異なる数値を吐き出します。ノイズ関数はいくつかの引数(たとえば、マップxとy)を取り、ランダムな統計特性を持つ数値を吐き出します、毎回同じ引数に対して同じ値、つまり適切な数学関数です。

2つは非常に密接に関連しています。例えば-ノイズ関数は、異なる値の各時間を通過させることにより、乱数発生器をシミュレートすることができるnoise(1)noise(2)など。そして、巨大なテーブルにダンプされた乱数ジェネレーターは、ノイズ関数として機能できます。ただし、どちらの場合も、ジョブに間違ったツールを使用しています。

特に、Minecraftの用途ノイズパーリン、安い計算することである、とされての望ましい特性があるノイズの種類連続あなたが必要として多くの寸法などには-あなたはグラフ場合f(x)f(x + 1)、任意の突然のジャンプができなくなります。これにより、テクスチャの変調、体積の雲とガス、地形の生成など、多くのことに役立ちます。

プレイを開始する実装を探している場合、Ken Perlinの改良されたPerlinノイズジェネレータは、最も単純な実装の1つです。


3
多くの乱数ジェネレーターはシードを使用し、同じシードが与えられると同じ数のセットを生成することに注意してください。
-thedaian

3
@thedaian:すべての数値を再生成する場合を除き、この場合は特に役立ちません。ノイズ関数を使用すると、499を生成することなく、500番目の数値を取得できます。

Perlin Noiseアルゴリズムが与えられた場合、それを調整することは可能ですか?アルゴリズムが壁タイルのパックを生成し、次にスペースタイルのパックを生成する可能性を高めたいと考えてください。
マティアスリュックガードローレンツェン

3
あなたは私が6分で与えたリンクを読んで理解していません。

1
この答えは、ノッチのブログ記事を完備しています:notch.tumblr.com/post/3746989361/terrain-generation-part-1
deceleratedcaviar

3

Minecraftがその生成を制御する方法は、ゲームのすべての乱数生成をシードするために使用されるレベルシードを作成することです。チャンクが要求されたときにディスク上に存在しない場合、レベルのシードに基づいてノッチの生成機能を使用して生成されます。その後、後で使用するためにディスク保存されます。

同様の動作を実現しようとしているように聞こえるので、これは安全な方法です。


2

ジョーが指摘したように、あなたはハッシュ関数を探しています。一般的に、ランダム関数は、最後に返された数値をシードしたハッシュ関数です。したがって、Random()返されたHash(seed)=1234場合、2番目の呼び出しRandom()はなどを返しHash(1234)ます。

擬似乱数の単純なハッシュ関数を探している場合は、MurMurHashをチェックしてください。私はそれをC#で実装しており、興味があればどこかに投稿できます。このようなハッシュ関数を使用するPerlin Noiseの詳細については、こちらをご覧ください。C#での実装についてはこちらをご覧ください

これらの情報はすべて、1年前にここでStack Overflowについて尋ねた質問に基づいています。探しているものは手続き型コンテンツ生成と呼ばれるので、さらに情報が必要な場合は検索してください。幸せな地形生成!


-1。Perlinノイズのハッシュは、現時点では、MMHまたは他の暗号化ハッシュルーチンで使用される技術とは似ていません。そのC#コードは、ランダムな値の間で線形補間を行うように見えるゴミです。適切なパーリンノイズよりもはるかに多くのメモリが必要であり、実行速度が遅い可能性があります。

1
@Joe-Perlin Noiseの実装について非常に強く感じて申し訳ありません。パーリンノイズ自体は、ハッシュ関数を連続ノイズ関数に変換する概念です。MurMurHashを使用して、非常に効果的に多くのPerlin Noiseを生成しています。C#コードに関しては、2D Perlin Noiseの単一ポイントの値をプログラムで決定する方法の例です。私は本番環境では決して使用しませんが、私の意見では、あなたが投稿したコードよりも簡単です。
dlras2

1
OPにはノイズやハッシュの知識がなかったため、必要に応じて実装方法をさらに調査して決定することを期待して、単に参照を提供しようとしました。
dlras2

「パーリンノイズ自体は、ハッシュ関数を連続ノイズ関数に変える概念です。」いいえ、PerlinノイズはKen Perlinによって発明された連続ノイズ関数の1つです(彼が「シンプレックスノイズ」と呼んだものではありません)。すべての連続ノイズ関数がパーリンノイズではありません。すべての連続ノイズ関数が勾配ノイズであるとは限りません。その中のパーリンノイズが特定の例です。あなたがリンクしたものは勾配ノイズではなく、値ノイズです。

リンク内のコードは、Perlinノイズではないため、「簡単に確認できます」。それほど滑らかではありません。はるかに多くのリソースを使用します。要するに、それは暗いため、歩くのが簡単です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.