ワームスタイルの地形を生成するにはどうすればよいですか?


48

私はワームスタイルのゲームに取り組んでおり、いくつかの地形を手続き的に生成したいと考えています。以前はパーリンノイズを使用して多くの地形生成を行ってきましたが、これがこのゲームで使用し始めたものです。唯一の問題は、単純すぎて退屈で、丘ができてしまうことですが、私が望む複雑さではありません。洞窟やぶら下がった山などの機能が欲しいのですが、浮島などは気にしません。次のようになりますが、もっとクレイジーでも構いません

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

最初に古典的なパーリンノイズを使用して地形を生成し、次にパーツを削除して洞窟を作成するかどうかを考えましたが、それらのパーツの削除をガイドするのに苦労しています。そのような地形を生成する代替手段はありますか?


赤は洞窟を表しますか、それとも地形の一部ですか?
リチャードマースケル-ドラキル

それは地形の一部です。私はちょうどその画像をグーグル、私が達成したいものに最も近かった。「洞窟」の部分は、それが左の地形の内側にさらに続く場合、右の小さな穴かもしれません。
Xeon06

@Drackir、画像を編集しました。
Xeon06

関連:gamedev.stackexchange.com/questions/6721/…(ただし、実装アルゴリズムと生成アルゴリズムに重点を置いているように見えるため、重複はありません)。
ジョシュ

@JoshPetrie確かに。私は破壊に満足しています。それは私が問題を抱えている世代です。
Xeon06

回答:


51

2D Perlin-noiseから始めることをお勧めします。このようなもの:

パーリンノイズ

次に、画像にしきい値を適用して、次のようにいくつかの孤立した島を取得します。

しきい値付きパーリンノイズ

0.04のしきい値を選択しました。しきい値を超えるものはすべて青色になります。残りは黒のままです。その後、どの「島」を維持し、どれを捨てるかを決定します。

考えられるアプローチは、さまざまな高さで画像を左から右に実行し、一定の確率で交差する「島」を選択することです。この図の例では、最下行の確率は100%であるため、交差するすべての島が選択されます(白で塗りつぶされます)。2番目の行の確率は50%で、一番上の行の確率は10%です。

島にそのようにマークを付けたら、モルフォロジー演算dilate)を適用して、その間のギャップを閉じることができます

膨張した島

そして、可能性のある風景があります。

ノイズの「粒度」は、あなたの世界の細部がどのくらい小さくなるかを決定します。したがって、これらの値を試してみることをお勧めします。

また、「選択ライン」が配置される確率と場所によって、結果は大きく異なります。画像の上部に島を「選択」する可能性の高い線がある場合は、ある種の洞窟の風景などを構築できます。


詳細でイラスト入りの素晴らしい回答をありがとう!これはまさに私がやろうとしていることです。
Xeon06

このレベルの詳細など、パーリンノイズの生成に関するヒントはありますか?私は夜中ずっと試してきましたが、どこにも行きません。
Xeon06

@ Xeon06 flashが提供するPerlinノイズ関数を使用していました。パラメータは24baseXおよびbaseY1オクターブで、グレースケールノイズを出力することを選択し、「フラクタル」を無効にしました。これをどの言語で実装していますか?
bummzack

JavaScriptを実装しています。1週間は同様の結果が得られるが、何も見つからない適切な実装をWebで探し回っています。
Xeon06


6

慎重にフィルタリングされたパーリンノイズから始めます。質問に添付されている写真のように、浮島で終わります。Justeは、ここで説明しようなカウントアルゴリズムを使用して、後で浮島を削除します


ああ、私は今それを得ると思います。1Dではなく2Dパーリンノイズを使用する必要があります。上記のフィルタリングについて詳しく説明していただけますか?
Xeon06

2
今は写真を投稿できませんが、if(0.3> pixelValue> 0.5)KeepIt();という単純なしきい値フィルターについて話しているだけです。「慎重に」ビットとは、0.3と0.5を正しく取得することです。また、上部に高いアルファで始まり、下部に徐々に0になる線形の(またはそうでない)勾配を持たせることもできます。そのため、空のスペースができ、地面はほとんど埋められます。お役に立てば幸いです。
ラバコール

@Ravachol写真へのリンクを投稿すると、より多くの担当者があなたの投稿に追加できます。
リチャードマースケル-ドラキル

「if(0.3> pixelValue> 0.5)」、これは単なる誤植だと思いますが、投稿に矛盾するものがあると混乱する可能性があります...編集してください。
jcora

コメントを編集できないようです。明らかに「if(0.3 <pixelValue <0.5)」を読んでください。
ラバコール

4

bummzackの優れた答えから始めて、実際にこれを実装しました。

ここに私が終わった手順があります:

  1. パーリンノイズを含む画像を生成する
  2. 地形が必要な場所にフラッドフィルする
  3. 膨張+侵食による小さすぎるくぼみの除去
  4. 地形内の残りの背景領域を削除します
  5. アンチエイリアシング

そして、これは結果の例です: 生成された地形の例

ここでプロセス全体に関する詳細な記事を書きましたが、コード(JavaScript)はオープンソースです。使用する準備ができている場合はチェックしてください ;)

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