Algoritma pembuatan kota

8

Dalam posting RPG.SE ini halaman yang telah lama hilang dengan beberapa generator online disebutkan.

Saya sangat ingin tahu tentang cara kota dihasilkan. Ambil gambar ini misalnya:

Sebuah kota PCG dari Irony Games yang mati

Meskipun banyak hal yang dapat ditingkatkan dari segi grafis, itu sangat bagus mengingat alat yang tersedia saat itu (pertengahan hingga akhir 90-an):

  • Tata ruang jalan tampak cukup organik (meskipun mempertimbangkan semua jalan ditempatkan secara orthogonal).
  • Tidak semua jalan harus terhubung, tetapi rasanya benar .
  • Bangunan ditempatkan di tempat-tempat yang dapat dipercaya .
  • Bahkan pohon tampaknya ditempatkan di tempat yang logis .

Saya pikir akan menyenangkan untuk mencobanya dan mencobanya sendiri. Terutama karena upaya saya sebelumnya terlalu "ganjil":

Upaya terbaru saya di generasi kota

Anda akan melihat bahwa saya menggambarkan banyak kualitas dengan kata sifat yang tidak terlalu terukur ( sepertinya , terasa , dapat dipercaya , dll) jadi saya mengalami kesulitan menerjemahkannya ke instruksi dan akhirnya ke sebuah algoritma.

Apakah ada algoritma yang dicoba-dan-benar untuk pembuatan kota?

Saya mengerti ini sepertinya terlalu luas, jadi pertimbangkan ini: Jika saya meminta algoritma untuk menghasilkan peta massa daratan, saya akan mendapatkan referensi untuk Perlin dan algoritma kebisingan lainnya segera; diikuti oleh Voronoi.

Saya telah melihat pertanyaan seperti ini tetapi mereka tampaknya sudah memiliki gagasan yang lebih konkret (yaitu: 2x2 rumah, jumlah rumah tetap, pembatasan kanal dan penempatan jalan).

Yang ingin saya miliki adalah sesuatu yang tidak terlalu dibatasi. Kecuali mungkin untuk tata letak grid, yang seharusnya jauh lebih mudah untuk upaya pertama daripada, katakanlah, sistem-L.

Roflo
sumber
Algoritma pencatatan untuk domain masalah yang luas biasanya berakhir terlalu luas untuk dijawab dengan baik dalam format Tanya Jawab kami. Kami umumnya lebih beruntung dengan "Bagaimana saya bisa menghasilkan konten game dengan karakteristik khusus ini " - di mana Anda memberikan sejumlah kriteria atau contoh positif / negatif yang dapat kita gunakan untuk mengevaluasi jawaban potensial dan menilai proposal terbaik. Bisakah Anda mencoba mengedit pertanyaan Anda untuk menjelaskan secara lebih rinci apa yang membuat output kota yang cocok versus yang kurang cocok?
DMGregory
terlalu luas, terutama karena generator seperti itu kemungkinan besar komposit (misalnya langkah 1 menghasilkan jalan, langkah 2 menghasilkan rumah, langkah 3 menghasilkan pohon). Jika Anda dapat mempersempit hal-hal menjadi generator tertentu, dan masalah khusus apa yang Anda alami dengan itu, itu akan menjadi kurang luas.
congusbongus
1
Kami juga memiliki pertanyaan tentang generasi kota prosedural ini . Mungkin membantu jika Anda dapat mengartikulasikan bagaimana kebutuhan Anda berbeda dari pertanyaan itu.
Pikalek
1
Tidak ada jawaban yang bagus di sini, tetapi satu hal yang saya perhatikan adalah bahwa dalam contoh yang baik, setiap bangunan berada di sebelah jalan, sedangkan dalam contoh Anda, mereka tidak.
user1118321
@ user1118321: Sebenarnya, rumah tidak selalu di sebelah jalan, tetapi plotnya (pendekatan modern) atau setidaknya ada jalan ke jalan berikutnya (mungkin pendekatan yang lebih tua, tidak seperti rumah di halaman belakang). Jadi ruang tidak begitu tidak wajar, seperti pasar misalnya.
PSquall

Jawaban:

9

Perangkat Lunak Introversi membuat generator kota yang sangat mengesankan untuk proyek Subversion mereka yang dibatalkan tanpa batas waktu :

Generator Kota Subversion

Algoritma ini dirancang untuk menghasilkan metropol besar dan modern. Tetapi teknik yang sama dapat digunakan untuk menghasilkan lebih banyak pemukiman pedesaan.

Ini adalah algoritma top-down yang menghasilkan garis besar kasar pertama dan kemudian menghasilkan lebih banyak dan lebih detail untuk masuk ke dalamnya (untuk pendekatan bottom-up yang berlawanan dengan generasi prosedural, periksa jawabannya oleh uliwitness). Berikut adalah video yang memvisualisasikan algoritma yang sedang berjalan .

Algoritme tampaknya berfungsi sebagai berikut (sedikit disederhanakan):

  1. Pusat kota: Pilih beberapa titik peta yang masih kosong sebagai simpul lalu lintas utama. Mereka harus didistribusikan secara merata di sekitar peta
  2. Jalan Raya: Hubungkan simpul lalu lintas utama ke tetangga mereka dan ke dunia luar menggunakan jalan utama.
  3. Jalan raya: Membagi sel yang dihasilkan oleh jalan utama dengan membuat beberapa jalan kecil.
  4. Jalan: Ulangi proses pembagian ini secara rekursif dengan jalan yang lebih kecil dan lebih kecil sampai Anda mencapai ukuran blok bangunan yang diinginkan
  5. Blok: Tentukan tujuan setiap blok bangunan (perumahan, ritel, perusahaan, industri ...). Faktor yang relevan adalah ukuran jalan tetangga dan jarak dari pusat.
  6. Penjatahan: Bagi tepi semua blok bangunan menjadi banyak (ini berarti setiap lot memiliki setidaknya satu sisi yang terhubung ke jalan).
  7. Bangunan: Hasilkan bangunan yang pas untuk setiap lot.

Mengenai penempatan pohon: Pendekatan pertama saya adalah mengintegrasikan mereka dalam algoritma generasi bangunan. Sebuah bangunan tidak perlu mengisi lotnya sepenuhnya. Anda dapat mengisi ruang kosong dengan benda-benda dekoratif yang sesuai.

Masalah dengan pendekatan top-down adalah bahwa sementara itu mungkin menghasilkan kota yang masuk akal, itu mungkin tidak menghasilkan kota yang masuk akal dengan semua yang Anda inginkan . Katakanlah setiap kota dalam gim Anda membutuhkan satu toko senjata, satu toko baju besi, satu toko ramuan, dan satu penginapan. Algoritme di atas memilih bangunan berdasarkan persyaratan lot, sehingga Anda mungkin berakhir dengan 12 toko baju besi tetapi tidak satu pun penginapan. Saya akan mendekati masalah itu dalam fase pembuatan generasi. Sebelum Anda mulai membuat bangunan secara acak, telusuri daftar bangunan yang harus dimiliki dan pilihlah lot yang paling sesuai untuk masing-masingnya. Kemudian isi banyak yang tersisa dengan bangunan acak.

Saya menantikan untuk menjelajahi kota-kota yang dihasilkan secara prosedural dalam game Anda.

Philipp
sumber
Saya benar-benar lupa menyebutkan jalan dengan berbagai ukuran, bagus!
uliwitness
Terima kasih! Tidak yakin apakah saya akan mencoba top-down atau bottom-up berikutnya ... tetapi menyadari bahwa saya memiliki dua pilihan, otak saya langsung kembali. ;)
Roflo
5

Dapatkan kendala dari kehidupan nyata

Seringkali jawaban tentang bagaimana menemukan algoritma yang tepat dimulai dengan melihat bagaimana hal-hal ini terjadi dalam kehidupan nyata. Apakah Anda sudah melihatnya? Dari atas kepala saya, saya bisa memikirkan hal berikut:

  • Ada jalan untuk menghubungkan bangunan dan tempat menarik lainnya
  • Bangunan ditempatkan di sepanjang jalan yang ada, jika memungkinkan
  • Jika tidak ada jalan, bangunan diletakkan di tempat kosong dan terhubung ke jalan terdekat melalui jalannya sendiri
  • Bangunan ditempatkan di dekat bangunan lain yang menarik bagi penghuninya: Orang-orang pindah untuk tinggal di dekat tempat kerja mereka, makanan dan toko pakaian dll.
  • Bangunan ditempatkan di dekat sumber daya yang diperlukan untuk tujuan penggunaannya. Misalnya penggergajian kayu ditempatkan di dekat hutan, atau bahkan di pembukaan hutan. orang membutuhkan air dan makanan (tanaman, hewan) untuk hidup di suatu tempat.
  • Bangunan ditempatkan jauh dari bangunan lain yang merusak kegunaan yang dimaksudkan, atau bahwa mereka akan merugikan. Misal toko pewarna berbau mengerikan, jadi biasanya tidak diletakkan di area perumahan. Demikian pula, warung dan restoran keras, sehingga penghuni tidak ingin tinggal di atasnya, tetapi membutuhkan pelanggan, jadi harus dekat dengan daerah perumahan.
  • Beberapa negara memiliki undang-undang zonasi yang juga memengaruhi penempatan bangunan. Biasanya ini adalah cara yang lebih formal untuk mengantisipasi jenis bangunan apa yang dapat saling merugikan, atau sumber daya apa yang unik untuk daerah tersebut (seperti, tanah berkualitas tinggi untuk ladang, bukan untuk membangun tempat parkir).
  • Bangunan adalah untuk penghuni, dan gaya dan preferensi pribadi mereka tercermin di dalamnya. Misalnya, jika populasi miskin, mereka lebih cenderung berbagi tanah (gedung pencakar langit, gedung apartemen), jika mereka lebih kaya, mereka mungkin mendapatkan kondominiom, jika mereka kaya, mereka mendapatkan vila mandiri. Jika kelompok tertentu tidak menyukai kelompok lain, mereka cenderung tidak akan tinggal bersama. Jika ada kedekatan antara kelompok-kelompok tertentu, mereka dapat pindah ke bidang yang sama.

Terapkan ke topografi Anda

Setelah Anda memiliki kendala ini, Anda dapat mencoba membangun algoritma di sekitarnya. Misalnya, hasilkan topografi Anda dan bagikan sumber daya yang dibutuhkan di sekitar peta (mungkin mengawasi penempatan simpanan kecil dari sumber daya paling penting di area awal, lalu simpanan yang lebih besar semakin jauh dan dari satu sama lain). Di sinilah kebutuhan permainan Anda dan mekanik ikut bermain, tentu saja, tetapi Anda mungkin juga akan menambahkan elemen acak.

Kemudian bangun bisnis (dan bangunan tempat tinggal mereka) di dekat sumber daya yang menggunakannya. Misalnya tambang di sebelah gunung besar. Kemudian tambahkan infrastruktur yang dibutuhkan oleh mereka. Misalnya sebuah pos perdagangan dengan kantor pos dan kedai tempat mereka dapat melakukan bisnis dan menjual produk mereka, seorang pandai besi untuk menyediakan alat, dll.

Untuk memutuskan apa yang terjadi, pisahkan peta menjadi ubin tempat Anda menghitung angka untuk setiap ubin seberapa diinginkannya untuk tujuan tertentu, menggunakan fungsi pembobotan. Letakkan bangunan di ubin yang paling diinginkan untuk bangunan semacam itu. Tambahkan aturan seperti "satu pos perdagangan dapat menangani 50 bisnis atau 100 rumah", yang meningkatkan kemungkinan menambahkan pos perdagangan lain jika suatu kota mencapai ukuran tertentu.

Setelah Anda memilikinya, Anda harus mendapatkan beberapa peta yang cukup baik. Jika Anda melihat bahwa peta semua berakhir sebagai bentuk yang tidak alami, tambahkan hukuman ke fungsi bobot Anda untuk bentuk itu, seperti "jika jalan saya berakhir tepat di sebelah jalan lain, -100 keinginan", atau "jika jalan saya melintasi sendiri, -100 keinginan "dll. Anda selalu dapat menambahkan elemen acak untuk memungkinkan ini untuk merasa lebih unik, atau menambahkan mekanik lain seperti" jika persimpangan memiliki lebih dari N bangunan terhubung ke jalan-jalannya, ubahlah menjadi bundaran ".

Anda bahkan dapat menggunakan batasan-batasan ini untuk memberikan nuansa berbeda pada peta yang berbeda, seperti membuat negara tertentu memiliki lebih banyak gunung dalam topografinya, atau memiliki budaya tertentu membangun jalan yang lebih berliku, dan yang lain lebih suka jalan lurus dll. Semua hanya dengan memodifikasi salah satu dari Anda fungsi pembobotan.

Menyederhanakan

Tentu saja, pendekatan ini terlalu rumit untuk gim yang bukan simulasi perdagangan, tetapi tetap selesaikan ini, dan lihat jenis bangunan apa yang masuk akal untuk gim Anda, dan hilangkan yang tidak dibutuhkan. Kemudian muncul dengan aturan yang disederhanakan seperti "tempatkan kota di dekat sungai, gunung atau tanah yang bagus. 1 bangunan per 100 sumber daya, bisnis berdasarkan jenis sumber daya, 10 bangunan tempat tinggal untuk setiap rangkaian penuh sumber daya makanan / kerajinan ... atau hanya" 1m sungai / 1sqm tanah dapat mendukung 10 bangunan tempat tinggal ... apa pun yang masuk akal untuk sebuah game. Namun, begitu Anda tahu berapa banyak area yang Anda miliki (mis. Tidak ada bangunan di sisi gunung yang curam), dan berapa banyak bangunan yang dapat didukung oleh area tersebut, cukup tempatkan set bangunan di area itu hingga penuh (seperti, 1 bangunan bisnis, 10 perumahan) , 3 infrastruktur, atau apa pun) dan menghubungkannya dengan jalan.

uliwitness
sumber
1
Jawaban ini menjelaskan pendekatan bottom-up untuk generasi prosedural. Ini sangat sesuai dengan jawaban saya yang menggambarkan contoh dari pendekatan top-down yang berlawanan. Kedua pendekatan memiliki kelebihan dan kekurangan. Keuntungan dari bawah ke atas adalah Anda memiliki kontrol yang sangat baik atas objek apa yang Anda miliki di kota yang Anda hasilkan. Kerugiannya adalah Anda memerlukan aturan yang jauh lebih kompleks dan rapuh untuk menghasilkan kota yang terlihat realistis secara keseluruhan.
Philipp
Ya. Juga sangat tergantung pada jenis permainan dan tata letak kota yang diinginkan. Bottom-up bekerja lebih baik untuk kota-kota kecil, gaya abad pertengahan, yang tumbuh secara alami, sedangkan top-down bekerja lebih baik untuk kota-kota dan metropolis gaya AS. Demikian pula, jika Anda memiliki permainan yang melibatkan bangunan fungsional dan manajemen sumber daya, bottom-up dapat memberi Anda kontrol yang lebih baik, sedangkan top-down adalah optimalisasi terbaik untuk kota-kota di game balap dll. Di mana Anda benar-benar tidak peduli dengan fungsi bangunan .
uliwitness
Terima kasih atas jawabannya. Have you looked into that?Saya sudah. Yah, semacam (saya tidak bisa memikirkan banyak "aturan kehidupan nyata"). Tetapi ini cukup membuka mata dibandingkan dengan usaha saya sebelumnya: Saya gagal mengenali sumber daya yang mungkin tidak saya gambar (yaitu: ada hutan di timur ... terlepas dari apakah saya menggambarnya atau tidak).
Roflo