都市通りネットワークを生成する方法は?


16

ゲーム用の都市ジェネレーターを作成したいのですが、生成の最初の段階で問題に直面しています:道路システムです。

中世の世界なので、多くの近代的な都市のようなグリッドプランは必要ありません。理想的には、道を迷うことは可能ですが、完全な迷路ではなく、ある程度のロジックを備えた、大通りと小さな通りの擬似ランダム生成を好むでしょう。
自然に成長した町のように見えるもの。

シンプルにするために、私の都市は平坦で安定した地形にあり、川の横断や救助の問題はないとします。後でソリューションに統合してみることができました。

私は自分の都市の正確なサイズや配置を決めていませんでしたので、正確な形(正方形、円形、長方形など)の都市でのみ動作するソリューションがあれば、それを採用します。


2
Subversion用に作成したIntroversion Softwareの手続き型都市ジェネレーターをご覧ください。ゲーム自体はキャンセルされましたが、ジェネレーターからの映像がたくさんあります。
フィリップ

あなたがしたいことの例(目標期間からの実例、別のゲームからの例、スケッチなど)がありますか?「グリッドではない」と「完全な迷路ではない」の間に多くのオプションがあります。
ピカレック

@Pikalek持っていないので、これ以上の精度は与えません。迷路もグリッド計画も生成しない生成の例は、非常に具体的なものを探しているわけではありません。
アラクトール

回答:


21

手続き型の都市生成から始めるのに適した場所は、パリッシュとミュラーの都市手続き型モデリングです。彼らの論文は、人口密度と道路パターン(長方形グリッド、放射状および最小標高の変化)に関する規則を組み合わせて修正し、ウォーターフロントや道路の美観などの局所的な制約に対応するLシステムを提示しています。このシステムの結果は印象的ですが、不必要に複雑であると批判されています。バレットの代替ソリューションは、RudziczのSpare Parts devブログで次のように書き直されています。

  • 「提案された」道路のリストを維持する
  • それらを何らかの順序で評価する
  • それらが受け入れられる場合(いくつかの小さな変更の有無にかかわらず)
  • 承認された各道路を保存し、そこからいくつかの分岐を「提案」する

このアプローチにより、パリッシュおよびミュラーのLシステムに継承されているシンボル書き換えハウスキーピングのほとんどが削除されます。ここでこのアプローチのデモを見ることができます

このアプローチの利点は、都市形状にとらわれないことです。アウトライン制約を必要に応じて追加できるため、都市の形状はアルゴリズムではなくゲームデザインのニーズによって決定できます。都市の規模によっては、これで十分な場合があります。セグメント制限が100のここに画像の説明を入力してください 場合の上記のデモの結果は次のとおり です。セグメント制限が500の結果は次のとおりです。 ここに画像の説明を入力してください

部分的には、道路の分岐ルールを変更したり、90度の角度を避けたりすることで、これを調整できます。レイアウトがまだ規則的すぎる場合は、次の修正を行います。

街のグリッドをグラフに変換します。各ストリートはエッジで、各交差点はノードです。次に、任意のアルゴリズムを使用して、グラフを迷路に変換します。迷路に変わった最後の例を次に示します。 ここに画像の説明を入力してください

現在、出力には逆の問題があり、迷路のようです。しかし、Jamis BuckのDungeon GeneratorのSecret Workingsからいくつかのテクニックを適用できます。まず、行き止まりの廊下をいくつか削除して、疎らを増やします。次に、ループを作成する(つまり、グラフにサイクルを導入する)道路を追加して、接続性を高めます。結果の例を次に示します。 ここに画像の説明を入力してください

注:都市グリッドにエッジ除去のみを適用することにより、(迷路を生成する前に)以前のグリッド指向レイアウトステージから直接同じ最終結果を達成することが可能です。このアプローチの問題は、エッジを削除しても都市が分割されないようにし、それによって部分が到達不能になるようにする必要があることです。


6

Google中世/旧の都市計画を探すと、主に都市の起源に基づいたさまざまなバリエーションが見つかります(ランダムな居住地と組織化された軍事的地位など)。

もっと自然に成長した/混settlementとした集落を探していると思います。

これらについては、次のようなアプローチを試してみます。

  • 主要道路が一方の端からもう一方の端まで続くことから開始します(理想的には他のいくつかの集落を接続します。必要に応じて、集落を開始するジャンクションを得るために3番目の道路を作成します。
  • 道路に沿っていくつかの家を置きます(片側のみ)。
  • 今、家に沿ってその道を広げて、反対側に主なランドマークを追加します(通常は教会ですが、これはいくつかの工場や同様のものである可能性があります)。これがあなたのセンター/マーケットプレイスになります。
  • 次に、家のあるエリアの外側の2つの位置を選択し、家を囲む新しい道路を作成します。
  • 必要に応じて、古い道路と新しい道路を接続する家の間に小さな同盟者を作成します。
  • 「コア」に満足するまで繰り返します。
    • さらに家をいくつか追加します。
    • それらを囲む別の道路を追加します。
    • 道路を結ぶ路地を追加します。
  • それに満足したら、完了です。町である場合は、壁で囲み、最後の手順をさらに数回繰り返して、壁の外側に家を追加します。

3

まず第一に、手続き生成を行う方法はたくさんありますが、どれも簡単なものではありません。

理解しやすいため、JSで擬似コードを作成します。

1ºエントリポイントを定義します。正方形から始める中世の都市を構築したいので、300平方ユニットが町にあり、正方形が中央にあるとします(Xで表されます)。

       300
________________
|               |
|               |
|               | 300
|       X       |
|               |
|               |
|_______________|

const square = [ 150, 150 ];

2º今、私たちは通りになります、それらの乱数があります、彼らはまっすぐになり、中央の広場または他の道から始まります

let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square

for av in av_from_square
  avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
  // we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size

これにより、広場とカップルのメインストリートができます。

       300
________________
|   \\          |
|    \\         |
|     \\        | 300
|       X=====  |
|               |
|               |
|_______________|

ここで、メイン広場で始まらない道を設定する必要があります。それらは他の道と交差します

for av in (n_avenues - av_from_square){
  const av_to_intersect = avenues[RANDOM(0,avenues.length)];

  //check av_to... and get a perpendicular vector (explained bellow)
  av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
  av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];

}

垂直ベクトルを取得するには、x、yコードを交換し、新しいyを無効にする必要があります。

スワイプ== x:noswiped.y、y:-1 *(noswiped.x)

今、あなたはこれに似たものを持っているはずです、それは町のように見えませんか?:P

       300
________________
|   \\  //      |
|    \\//  ||   |
|     \\   ||   | 300
|    //\X=====  |
|   //     ||   |
|          ||   |
|_______________|

3ºこれで、通りを短い通りと相互接続するだけでよく、また、町中にランダムな正方形をスポーンし、それらすべてについて上記と同じようにするか、いくつかの二次的な正方形から小さな通りをスポーンできます。

覚えておいて、あなたの街が最短で、町が混chaとしているように見えます。

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