14

リアルな2D地形図を生成できるアルゴリズムを探しています。現実的とは、人がそのような地図を、人工的に作成されたものではなく、「通常の」地形図と見なすことを意味します。写実的な地図を作成したくありません。地理アトラスで表示できる地図に似たものです。

これまでのところ、高さマップにパーリンノイズを使用しており、次に湖、川、山、沼地などを追加しています。あなたはそれが下の写真でどのように見えるかを見るかもしれません:

地形図http://www.freeimagehosting.net/uploads/1f1e9372bf.png

私はそれに満足していません。それは現実的ではありませんが、私は自分で何かより良いものを理解することはできません。時間は問題ではないので、アルゴリズムは大量の計算になる可能性があります。

御時間ありがとうございます。

編集後:

役立つ記事が1つ見つかったと思います:http: //portal.acm.org/citation.cfm? id = 1255047.1255077

ただし、無料では入手できないので、まだ答えやアイデアを探しています。

4

4 に答える 4

6

以前に地形生成で遊んだことがあります。目的がビットマップであると仮定すると、川のようなものを作成し、一般的に見栄えを良くする方法を見つけました: Erosion.

他の方法で地形を生成したら、それを少し侵食します。ピクセルの高さで表現された世界が必要です。マップ上のスポットを取り、1 単位の高さを最も低い隣に移動します。カーソルをこの隣に移動し、動かなくなるまで繰り返します。他のピクセルについて繰り返します。

川がビットを下に移動する場所を通過する回数をカウントするようにします。一番ヒットするスポットは川です。

フォローアップ: 十分に風化するまで、各ピクセルを侵食するのではなく、単純に多数のランダムなピクセルを侵食しました。それらを実際に侵食する理由は、これがビットを運び去り、穴を埋めるためです。それがなければ、流れを閉じ込める死体が存在するため、川は存在しません。流れるピクセルが小さな穴を埋め、有効な水路を作ります。

申し訳ありませんが、サンプルを提供することはできません。これは何年も前のことであり、古いコードはおそらくどこかにあると思いますが、どこを見ればよいかわかりません。

于 2009-09-20T17:48:55.930 に答える
3

地形は、さまざまな時間スケールで無数のさまざまな原因によって作成されます。本当にリアルな地形を作成するには、これらをシミュレートする必要があります。

「短期」的には、水圏がほとんどの特性を決定します。おそらく、主要な機能 (山脈など) を含むボクセル/パーティクル/高さマップ/メッシュ地形から始めて、それを不変として扱い、大量の水のシミュレーションで後処理することができます。河川や湖がどこにあるのか、それらがどのようにベースランドスケープを浸食しているか、堆積物を形成する場所を計算する必要があります。これをコーディングする必要があるとしたら、おそらく 3D ボクセル ワールドから始めるでしょう。

これは膨大な作業であり、数分ではなくミリ秒で特定の地形タイプを生成するために利用できるトリックがたくさんあると確信しています。どのような地形を作成しようとしていますか? 山岳?低地?工業化?森?荒野?諸島?

簡単に言うと、人間 (結局のところ、この種の専門家である傾向がある) にとってリアルに見える地形が必要な場合は、実際の地質学的プロセスをシミュレートして作成する必要があります。

于 2009-09-20T17:25:46.647 に答える
2

Terra3D での私の方法は、ランダムな高さの値を生成してから、アルゴリズムに少し再形成して 3 つのスムージング パスを作成することでした。再形成により、水線の下の地形が少し下に移動し、水線より上のすべてが少し上に移動します。ただし、効果は多くの丘と小さな湖です。そして、それはあなたが正確に探しているものではないかもしれません.

ただし、私のメソッドの背後にあるプリンシパルを使用して、必要なものを取得できないとは確信していません。再形成/平滑化アルゴリズムにさらに条件を書き込む必要がある場合があります。たとえば、標高の高い地形でスムージングの量を減らすと、岩山のような外観になります。そして、高度の低い部分をさらに拡張する複雑な平滑化 (またはガウス) アルゴリズムを作成すると、それらの湖が引き寄せられて自然の川が形成される可能性があります。

興味のある方のために、 Terra3Dでの地形生成のコードを次に示します。

  // GENERATE TERRAIN
  for (i = 0; i < MAX; i++)
  {     
    for (i2 = 0; i2 < MAX; i2++)
    {
        if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10)
        field[i][i2].y=0;
      else
        field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05;
    }
  }

  // SMOOTH/RESHAPE TERRAIN
  for (int cnt = 0; cnt < 3; cnt++)
  {  
    for (int t = 1; t < MAX-1; t++)
    {
      for (int t2 = 1; t2 < MAX-1; t2++)
      {
        field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4;

        if (cnt == 0)
        {
          if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2;
          else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5;
        } 
      }
    }
  }

10年くらい前に書いたずさんなコードです。Terra3D は、私が探していたタイプのエフェクトを生成するために、暗がりで試行錯誤する長い学習プロセスでした。しかし、多分それは役立つでしょう。

于 2010-02-03T20:24:29.743 に答える
1

これは非常に古い質問であることは承知していますが、私のように優れた地形ジェネレーターを探している将来の人々のためにこれに答えています。World Machine 2 の無料版を使用してください。これは、あなたが求めていることを正確に実行できる地形ジェネレーターです。プロが画像、3D 世界地形、さらにはあなたが提案しているような地図を生成するために使用されています。無料版は非営利目的でのみ使用できることに注意してください。

于 2011-02-17T19:34:46.280 に答える