Bagaimana saya bisa menghasilkan medan gaya Worms?

48

Saya sedang mengerjakan game bergaya Worms dan ingin menghasilkan beberapa medan secara prosedural. Saya sebelumnya telah melakukan banyak generasi medan menggunakan perlin noise, dan inilah yang saya mulai gunakan untuk game ini. Satu-satunya masalah dengan itu adalah itu terlalu sederhana dan membosankan, memberi saya beberapa bukit tetapi bukan kompleksitas yang saya inginkan. Saya ingin memiliki fitur seperti gua dan gunung gantung dan saya tidak keberatan pulau terapung dan semacamnya. Sesuatu seperti ini, tetapi lebih gila lagi tidak masalah:

masukkan deskripsi gambar di sini

Saya berpikir untuk membuat medan menggunakan kebisingan perlin klasik, kemudian hanya mengeluarkan bagian untuk membuat gua dan yang tidak, tapi saya mengalami kesulitan membimbing penghapusan bagian-bagian itu. Apakah ada alternatif untuk menghasilkan medan seperti itu?

Xeon06
sumber
Apakah merah mewakili gua atau itu hanya bagian dari medan?
Richard Marskell - Drackir
Itu bagian dari medan. Saya hanya Google gambar itu, adalah yang paling dekat dengan apa yang ingin saya capai. Bagian "gua" mungkin adalah lubang kecil di sebelah kanan, jika itu dilanjutkan lebih banyak di dalam medan di sebelah kiri.
Xeon06
@Rackir, mengedit gambar.
Xeon06
Terkait: gamedev.stackexchange.com/questions/6721/… (tapi bukan duplikat karena tampaknya berfokus pada implementasi versus algoritma generasi).
Josh
@ JoshPetrie memang. Saya baik dengan kehancuran. Ini generasi yang sedang saya hadapi.
Xeon06

Jawaban:

51

Saya sarankan Anda mulai dengan 2D Perlin-noise. Sesuatu seperti ini:

perlin-noise

Kemudian menerapkan ambang pada gambar, sehingga Anda mendapatkan beberapa pulau yang terisolasi, seperti yang ditunjukkan di sini:

kebisingan perlin dengan ambang batas

Saya memilih ambang 0,04, semua yang di atas ambang akan berwarna biru. Sisanya tersisa hitam. Kemudian setelah itu, saatnya menentukan "pulau" mana yang harus dijaga dan mana yang harus dibuang.

Pendekatan yang mungkin dilakukan adalah menjalankan gambar dari kiri ke kanan pada berbagai ketinggian dan memilih "pulau" berpotongan yang diberikan probabilitas tertentu. Pada contoh gambar, garis terendah memiliki probabilitas 100%, sehingga setiap pulau yang dilintasi akan dipilih (terisi putih). Baris kedua memiliki probabilitas 50% dan garis paling atas memiliki probabilitas 10%.

Setelah pulau Anda ditandai seperti itu, Anda dapat menutup celah di antaranya dengan menerapkan operasi morfologis ( melebarkan )

pulau melebar

Dan ada kemungkinan lanskap.

"Granularity" dari kebisingan akan menentukan seberapa kecil detail di dunia Anda nantinya. Jadi mungkin yang terbaik adalah bereksperimen dengan nilai-nilai ini.

Juga di mana dan dengan probabilitas apa "posisi" Anda diposisikan, hasilnya akan sangat berbeda. Jika Anda memiliki garis di dekat bagian atas gambar dengan probabilitas tinggi untuk "memilih" suatu pulau, maka Anda dapat membangun semacam lanskap gua, dll.

bummzack
sumber
Terima kasih banyak atas jawaban terperinci dan berilustrasi! Inilah yang akan saya lakukan.
Xeon06
Apakah Anda punya tips tentang generasi kebisingan perlin tersebut, dengan tingkat detail dan semacamnya? Saya sudah mencoba sepanjang malam dan tidak mendapatkan apa-apa.
Xeon06
@ Xeon06 Saya baru saja menggunakan fungsi noise Perlin yang disediakan oleh flash . Parameter 24untuk baseXdan baseY, 1 oktaf dan saya memilih untuk mengeluarkan suara skala abu-abu dan menonaktifkan "fraktal". Anda menggunakan bahasa apa ini?
bummzack
Saya menerapkannya JavaScript. Saya telah menjelajahi web untuk implementasi yang baik yang akan memberikan hasil yang sama selama seminggu tetapi tidak dapat menemukan apa pun.
Xeon06
Saya telah membuat pertanyaan lain mengenai bagian perlin noise gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06
6

Saya akan mulai dengan suara perlin, disaring dengan hati-hati. Anda akan berakhir dengan sesuatu seperti pada gambar yang terlampir pada pertanyaan, dengan pulau-pulau terapung. Juste menghapus pulau terapung setelah itu menggunakan algoritma penghitungan seperti yang dibahas di sini

Ravachol
sumber
Oh saya rasa saya mengerti sekarang. Saya perlu menggunakan noise perlin 2D, bukan 1D. Bisakah Anda menguraikan kata filtering?
Xeon06
2
Saya tidak dapat memposting gambar sekarang, tapi saya hanya berbicara tentang filter ambang sederhana à-la if (0,3> pixelValue> 0,5) KeepIt () ;. Bit 'hati-hati' adalah tentang mendapatkan 0,3 dan 0,5 tepat. Anda juga bisa memiliki gradien linier (atau tidak), dimulai dengan alfa tinggi di bagian atas, secara bertahap mencapai 0 di bagian bawah, sehingga Anda memiliki ruang untuk langit, dan tanah sebagian besar terisi. Semoga itu bisa membantu.
Ravachol
@Ravachol Jika Anda memposting tautan ke gambar, seseorang dengan lebih banyak perwakilan dapat menambahkannya ke posting Anda untuk Anda.
Richard Marskell - Drackir
"if (0.3> pixelValue> 0.5)", saya kira ini hanya salah ketik, tetapi bisa membingungkan untuk memiliki hal-hal yang bertentangan di posting Anda ... Bisakah Anda mengeditnya?
jcora
Sepertinya saya tidak dapat mengedit komentar. Baca "jika (0,3 <pixelValue <0,5)", jelas.
Ravachol
4

Saya benar-benar menerapkan ini mulai dari jawaban yang sangat baik bummzack.

Inilah langkah-langkah yang saya akhiri:

  1. Hasilkan gambar dengan Perlin noise
  2. Isi banjir di tempat yang Anda inginkan
  3. Pelebaran + erosi untuk menghilangkan lubang yang terlalu kecil
  4. Hapus wilayah latar belakang yang tersisa di dalam medan
  5. Antialiasing

Dan ini adalah contoh hasilnya: contoh medan yang dihasilkan

Saya menulis artikel terperinci tentang seluruh proses di sini dan kode (JavaScript) adalah open source, periksa apakah Anda ingin sesuatu siap digunakan;)

Julian Go
sumber