Saat ini saya sedang membuat aplikasi yang banyak berfokus pada konten yang dihasilkan secara prosedural. Sejauh ini, saya telah berhasil mengimplementasikan generasi prosedural medan dan bentuk peta menggunakan noise simplex. Saya sangat senang dengan tampilannya. Sekarang saya mencoba melakukan hal yang sama untuk kota. Saya hanya perlu membuat tata letak 2D jalan dan bangunan. Saya sudah melihatnya dan sepertinya kebanyakan orang menyarankan menggunakan L-Systems. Namun sepertinya aku tidak bisa membungkus kepalaku dengan mereka. Saya mendapatkan konsep, tetapi tidak implementasi ke dalam kode. Apakah ada yang punya contoh kode L-Systems untuk kota yang dihasilkan secara prosedural, atau saran tentang cara lain untuk menangani kota?
2d
ios
game-mechanics
procedural-generation
pasawaya
sumber
sumber
Jawaban:
L-Systems , dari apa yang dapat saya katakan *, adalah seperangkat aturan substitusi seperti tata bahasa yang dapat Anda terapkan secara rekursif untuk mendapatkan hasil "organik" yang menarik.
Tanaman adalah tempat L-Systems sering digunakan, karena mereka menunjukkan banyak pertumbuhan rekursif (yaitu cabang terpecah menjadi lebih banyak cabang). Sebagai contoh sederhana, saya akan menunjukkan pohon "lollipop" yang dihasilkan menggunakan L-System:
Jadi pada generasi 1, kita baru saja memulai:
Pada generasi 2, kami mengikuti setiap aturan dan mengganti bagian yang ada sesuai dengan aturan. Kami mengganti "bola" dengan "bola dua tongkat":
Generasi 3:
Kami akan segera memiliki pohon besar yang cantik (jelek)!
Untuk melakukan ini dalam kode, Anda dapat melakukan ini secara rekursif (yaitu DFS), terus menerapkan aturan pada bagian yang sama sampai Anda mencapai akhir yang sewenang-wenang, atau Anda dapat melakukan ini secara iteratif (yaitu BFS) seperti yang telah kami lakukan dalam contoh ini , melakukan satu aturan "lulus" pada semua elemen dan mengulangi sejumlah langkah. Itu adalah:
Secara rekursif:
Secara berulang:
Banyak penggunaan L-Systems melakukan langkah "tumbuh" menggunakan subdivisi - yaitu, bagian-bagian terus semakin kecil karena mereka "tumbuh", bagian-bagian yang lebih besar baru saja dibagi. Kalau tidak, sistem Anda yang tumbuh mungkin mulai tumpang tindih dengan sendirinya. Anda akan melihat contoh pohon lollipop saya, saya secara ajaib memastikan dua cabang tidak tumpang tindih di tengah dengan mengubah bentuk cabang baru. Mari kita lakukan contoh kota menggunakan subdivisi:
Ini akan masuk akal dalam satu menit.
Generasi 1:
Satu blok vertikal tunggal yang membosankan. (The V adalah singkatan dari vertikal.)
Generasi 2: kami mengganti blok vertikal dengan blok horisontal dengan jalan vertikal di tengah
R berarti jalan! Saya sudah membagi spasi secara acak, kami tidak ingin bagian biasa membosankan di PCG.
Generasi 3: kami mengganti blok horizontal dengan blok vertikal yang dipisah dengan jalan horizontal. Jalan yang ada tetap; tidak ada aturan untuk mereka.
Perhatikan bagaimana jalan terhubung satu sama lain, yang bagus. Ulangi ini cukup kali dan Anda akan berakhir dengan sesuatu seperti ini (secara terang-terangan merobek jawaban terkait ):
Perhatikan bahwa ada banyak detail yang belum saya bahas, dan bahwa hasil ini terlihat "jelas" dihasilkan - kota-kota nyata terlihat agak berbeda. Itulah yang membuat PCG menyenangkan / sulit. Ada hal-hal tak berujung yang dapat Anda lakukan untuk mengubah dan meningkatkan hasil Anda, tetapi karena tidak terkait dengan L-Systems, saya akan meninggalkan jawaban ini di sini; Semoga ini bisa membantu Anda memulai.
* - Saya belum mempelajari L-Systems secara formal, walaupun saya telah menemukan tipe spesifik seperti tata bahasa dan vegetasi PCG; tolong perbaiki saya jika saya salah definisi atau konsep
sumber
@congusbongus jawabannya bagus, izinkan saya menambahkan beberapa hal.
Blok perlu dipisah menjadi area bangunan sesuai dengan semua jalan yang berbatasan dengan mereka. Ketika Anda memiliki jalan di sekitar, pola keseluruhan adalah sebuah cincin. Lihat tautan ini misalnya: http://oldurbanist.blogspot.fr/2012/01/city-blocks-spaces-in-between.html
(Tergantung pada kerapatan, mungkin tidak ada ruang di pusat cincin, lihat kowloon).
Setelah Anda selesai membuat blok, Anda harus membuat bangunan. Mereka agak rumit dan membutuhkan generasi dua lulus. Mereka sebagian saling tergantung: generator Anda seharusnya tidak membuat jendela di depan dinding samping bangunan berikutnya.
Dan untuk menambah kehidupan, Anda mungkin ingin mempengaruhi generasi dengan lingkungan seperti medan atau peta ekonomi: Jalan (kecuali di San Francisco) cenderung berputar di sekitar perbukitan besar, bukannya lurus dan jenis rumah sangat berat. dipengaruhi oleh bagian kota tempat mereka berada.
Selamat bersenang-senang.
sumber