Perlin noise, pembuatan konten prosedural, dan ruang yang menarik

Mungkin hal terburuk yang terjadi di bidang pembuatan konten prosedural (dengan asumsi bahwa ini memang bidang pembuatan konten prosedural, yang saya tidak sepenuhnya yakin) adalah kebisingan Perlin. Suara Perlin sangat cocok (setidaknya jika Anda tidak melihat terlalu dekat) untuk menghasilkan lanskap yang menarik. Dalam generasi subreddit / r / prosedural, seminggu tidak berlalu tanpa seseorang menerbitkan "sistem generasi prosedural" yang ternyata adalah suara perlin divisualisasikan dalam warna yang berbeda. (Selama penulisan artikel ini, dua posting seperti itu muncul!)


Saya tidak ingin mempermalukan kebisingan Perlin. Ini adalah alat yang sangat berguna untuk pembuatan prosedural, yang telah menjadi titik masuk di bidang ini bagi banyak orang, termasuk saya. Tetapi pada saat yang sama, ini sangat membingungkan, karena ini menyiratkan bahwa generasi prosedural jauh lebih sederhana daripada yang sebenarnya. Sebagian besar postingan mingguan tentang “sistem generasi prosedural” di / r / generasi prosedural menghilang tanpa jejak ketika penulis mereka menemukan bahwa langkah selanjutnya dalam pembuatan prosedural jauh lebih rumit. Yang benar adalah, suara Perlin adalah semacam kebetulan yang bahagia. Ini bagus untuk menghasilkan lanskap yang menarik, tetapi tidak ada alasan sistematis atau berulang.

Mike Cook baru-baru ini menerbitkan tutorial yang kontras dengan ruang kemungkinan dengan ruang generasi. Jika Anda membuat sistem pembangkitan untuk membuat X, maka ruang kemungkinan sama dengan semua X yang mungkin, dan ruang pembangkitan adalah semua X yang benar-benar dapat dihasilkan oleh sistem Anda. Mike menggambarkan ide ini dengan Minecraft:


Dalam kasus permainan Dragons Abound saya, ruang kemungkinan mencakup setiap peta yang mungkin, termasuk banyak kasus yang merosot, misalnya, peta yang seluruhnya terdiri dari lautan dengan satu pulau kecil. Ruang generasi adalah ruang yang lebih kecil dari semua kartu yang sebenarnya dapat dihasilkan oleh Naga . Berkat berbagai aturan yang digunakan, Dragons Abound tidak dapat menghasilkan peta dari lautan dengan pulau kecil, sehingga peta ini tidak ada dalam ruang pembuatan game. Membandingkan ruang kemungkinan dengan ruang generasi adalah tampilan yang menarik dan bermanfaat pada generasi prosedural, jadi saya sarankan Anda membaca posting Mike , yang menjelaskan ide ini secara lebih rinci, dan ada beberapa contoh interaktif.

Selain ruang kemungkinan dan ruang generasi, juga berguna untuk memikirkan "ruang yang menarik". Jika kita membuat X, maka ini adalah ruang dari semua X yang menarik. Artinya, dalam kasus gim saya, ini adalah ruang dari semua kartu fantasi yang menarik . Ruang yang menarik adalah bagian dari ruang kemungkinan dan, kami harap, berpotongan dengan ruang generasi - misalnya, saya berharap bahwa setidaknya beberapa kartu yang dihasilkan oleh permainan saya ternyata menarik.

Sebelum melanjutkan, saya langsung mengakui bahwa "minat" adalah konsep yang kabur dan subyektif. Ide-ide saya dan Anda tentang hal-hal menarik kemungkinan besar tidak sesuai. Saya bahkan tidak selalu tahu apa yang tampak menarik bagi saya - seringkali saya melihat sesuatu yang baru dan merasa menarik, meskipun saya tidak berpikir bahwa saya akan menyukainya sampai saya melihatnya. Lebih buruk lagi, semakin menarik kita melihatnya, semakin tidak menarik. Ketika Anda melihat fitur menarik pada dua puluh kartu berturut-turut, sepertinya tidak lagi menarik. Karena itu, "minat" tidak mudah dipahami. Di masa depan, saya akan berbicara lebih banyak tentang apa yang membuat hal-hal menarik (dan di masa lalu saya punya sesuatu untuk dikatakan tentang ide dekat ruang kreativitas ), tetapi sejauh ini ini tidak terlalu penting. Cukuplah bagi kita untuk sepakat bahwa beberapa hal lebih menarik daripada yang lain, dan bahwa hal-hal yang lebih menarik berada dalam "ruang yang menarik", sedangkan hal-hal yang kurang menarik tidak.

Apakah mungkin untuk menggambarkan ruang yang menarik dengan cara yang sama seperti Mike menunjukkan ruang kemungkinan dan ruang generasi? Seperti yang disarankan di atas, ruang yang menarik adalah bagian dari ruang kemungkinan, yang (jika Anda beruntung) bersinggungan dengan ruang generasi:


Generator yang baik berpotongan kuat dengan ruang yang menarik; generator yang buruk lemah.

Pola-pola ini hanya sebuah metafora, tetapi dalam kerangka metafora ini saya ingin mengajukan pertanyaan berikut: apakah saya telah dengan benar menunjukkan bentuk - bentuk ruang yang berbeda? Bentuk ruang kemungkinan tidak terlalu penting, hanya saja harus mengandung dua ruang lain. Tetapi bentuk ruang pembangkitan dan ruang yang menarik adalah pertanyaan yang lebih menarik. Saya melukis keduanya sebagai bentuk kompak tunggal dalam ruang kemungkinan. Apakah ini masuk akal?

Saya percaya bahwa menetapkan ruang pembangkitan sebagai elips kompak adalah pilihan yang baik untuk banyak generator prosedural, dan terutama untuk sesuatu seperti kebisingan Perlin. Bentuknya menyiratkan bahwa generator menciptakan semua solusi dalam satu ruang yang jelas dan kompak. Jika generator dapat membuat X, maka biasanya dapat membuat semua tetangga X. Biasanya tidak ada "lubang" besar atau distorsi aneh di ruang generasi.

Ruang generasi biasanya terlihat seperti ini karena dua alasan. Pertama, pada tingkat penerapan praktis, generator adalah sejumlah kecil kode yang terkait dengan ruang kemungkinan. Saat ini, Dragons Abound berisi sekitar 28 ribu baris kode sumber. Dibandingkan dengan banyak generator kartu prosedural lainnya, ini banyak (mungkin bahkan sebuah catatan), tetapi masih sangat kecil dibandingkan dengan ruang kemungkinan semua kartu fantasi. Oleh karena itu, tidak peduli seberapa pintar kode gim ini, ruang generasinya hanya akan menempati sebagian kecil dari ruang kemungkinan, dan karena kode komputer, menurut definisi, algoritmik dan deterministik, ruang ini akan relatif kompak. Artinya, jika permainan dapat membuat satu jenis kartu, hampir pasti akan membuat banyak kartu serupa lainnya.

Alasan kedua bahwa ruang pembangkitan kompak adalah strategis. Bagi saya, tujuan menciptakan Dragons Abound adalah untuk menghasilkan peta yang menarik sehingga mereka bersinggungan dengan ruang yang menarik sebanyak mungkin. Dan sulit untuk masuk ke ruang yang menarik, sangat kecil dibandingkan dengan ruang kemungkinan. Faktanya, itu sangat, sangat kecil. Semua ruang ini memiliki sejumlah besar dimensi, dan ukuran ruang pada dasarnya tumbuh sebagai kekuatan jumlah dimensi. Hubungan nyata antara ruang yang menarik dan ruang kemungkinan terlihat seperti ini:


Hanya ruang yang menarik yang jauh, jauh lebih kecil. Ini memaksa generasi prosedural untuk mematuhi strategi tertentu. Misalnya, mengapa game tidak membuat peta yang sepenuhnya acak? Maka ruang generasi akan terlihat seperti ini:


Hanya titik-titik hijau yang jauh lebih kecil. Peluang untuk mendapatkan dari salah satu kartu acak ke dalam ruang kecil yang menarik pada dasarnya adalah nol. Untuk meningkatkan peluang memasuki ruang yang menarik, pencipta generasi prosedural menggunakan pengetahuan tentang ruang kemungkinan dan ruang yang menarik untuk mengendalikan generasi - pencipta menggeser ruang generasi sehingga sebagian besar terletak di lingkungan ruang yang menarik, dan tidak hanya didistribusikan secara acak.

Karena semua alasan ini, masuk akal untuk menganggap ruang pembangkitan sebagai area yang terhubung dan kompak.

Tapi saya percaya bahwa menggambar ruang yang menarik mungkin akan sepenuhnya salah. Ini harus dideskripsikan sebagai kumpulan area berbentuk aneh yang tersebar. Mengapa Karena (1) hal-hal dapat menarik karena berbagai alasan ortogonal, dan (2) minat adalah fungsi yang terputus-putus.

Pertimbangkan, misalnya, dua fragmen peta ini:



Fragmen pertama menarik karena garis pantainya terperinci dan berisi banyak pulau kecil. Fragmen kedua memiliki garis pantai yang membosankan dan mulus, tetapi pantai ini memiliki fitur menarik - tidak berpenghuni dan memiliki nama yang tidak menyenangkan "Bleak Shore". Dalam arti, kedua fragmen ini menarik, tetapi untuk alasan yang sama sekali berbeda. Oleh karena itu, kami tidak akan berharap bahwa dua bagian ruang yang menarik ini adalah tetangga.

Terlebih lagi, kedua bagian ruang yang menarik ini kemungkinan besar bahkan tidak terhubung. Sama sekali tidak mungkin untuk secara bertahap mengkonversi peta menarik pertama menjadi peta menarik kedua tanpa membuat beberapa peta yang tidak menarik di sepanjang jalan. Oleh karena itu, dua bagian ruang yang menarik ini dipisahkan.

Jadi, ruang yang menarik bukanlah area tunggal, tetapi seperangkat area yang dibagi. Apakah setiap ruang yang menarik memiliki bentuk yang halus dan padat?

Saya ulangi, saya tidak menyatakan bahwa saya dapat memberikan definisi lengkap tentang "minat." Namun dalam beberapa aspek, kita dapat menyepakati beberapa poin. Pertama, jika X menarik, maka ini tidak berarti bahwa 2X akan dua kali lebih menarik. Ambil contoh Pantai Sad - satu area pantai misterius di peta itu menarik, tetapi selusin di antaranya akan sangat tidak menarik. Anda mungkin dapat menemukan contoh lain tentang bagaimana "minat" berperilaku dengan cara yang aneh dan berlawanan dengan intuisi. Jadi, minat memiliki beberapa elemen diskontinuitas - itu bukan fungsi mulus yang berubah secara rasional dan dapat diprediksi saat bergerak melalui ruang kemungkinan.

Semua ini membuat kita mengerti bahwa kita harus menunjuk ruang yang menarik sebagai serangkaian area yang terbagi dengan bentuk yang aneh.


Anda sudah mulai mengerti mengapa membuat generator prosedural yang baik adalah tugas yang sulit. Karena cara kerja algoritma dan keterbatasan kemampuan kami, ruang generasi akan menjadi kecil dan kompak. Pada saat yang sama, kami ingin memasuki sebanyak mungkin bidang ruang yang aneh dan tersebar. Sungguh menakjubkan bahwa kami bahkan berhasil masuk ke mereka!

Sekarang biarkan saya kembali ke topik Perlin noise. Seperti apa skema ini untuk ruang pembangkitan kebisingan Perlin di ruang lanskap? Saya pikir kira-kira seperti ini:


Generator kebisingan Perlin memiliki lebih banyak persimpangan dengan ruang menarik tertentu di dalam alam semesta dari semua lanskap yang dimungkinkan. Dan ini luar biasa - hampir semua yang dapat dibuat menggunakan Perlin noise masuk ke area ini dan terlihat cukup menarik.

Tetapi keberhasilan cepat ini menyesatkan. Jika Anda baru mengenal generasi prosedural, Anda akan melihat bagaimana kebisingan Perlin bekerja dengan baik dan kemungkinan besar memutuskan bahwa kebisingan Perlin adalah tongkat ajaib untuk menghasilkan semua jenis lanskap yang menarik, belum lagi semua jenis generasi prosedural. Tetapi seperti ditunjukkan dalam diagram, ruang penghasil kebisingan Perlin sebenarnya jauh dari banyak bagian lain dari ruang lanskap yang menarik. Langkah kedua standar dalam pembuatan lansekap prosedural adalah penambahan sungai. Tetapi jika Anda mencoba untuk merealisasikan sungai dengan bantuan suara Perlin, Anda akan menemukan bahwa itu tidak mungkin! Dengan cara apa pun seseorang tidak dapat memperluas batas-batas ruang penghasil kebisingan Perlin untuk mencapai ruang-ruang menarik yang jauh yang berisi sungai-sungai realistis.

Suara Perlin menyesatkan dalam arti lain. Sebelumnya, saya berbicara tentang fakta bahwa ruang yang menarik sangat kecil sehingga jika Anda ingin masuk ke dalamnya, Anda perlu memiliki pengetahuan tertentu tentang ruang kemungkinan dan ruang yang menarik untuk mengendalikan generasi prosedural. Tetapi algoritma kebisingan Perlin tidak tahu apa-apa tentang bentang alam, proses geologi, apa yang orang temukan menarik, namun, entah bagaimana itu bekerja dengan baik tanpa sepengetahuan ini! Kebisingan Perlin ternyata menjadi pengecualian yang menegaskan aturan (*). Tetapi jika Anda baru mengenal generasi prosedural, maka kemungkinan besar Anda tidak tahu aturan ini. Bahkan, Anda menyimpulkan aturan yang salah - semua generasi prosedural secara keseluruhan harus bekerja seperti suara Perlin.

(* Bukan hanya kebetulan bahwa ia "ternyata" menjadi pengecualian. Kebisingan Perlin menjadi titik awal yang populer justru karena itu merupakan pengecualian. Sangat mudah untuk memulai dengan Perlin noise tanpa harus mempelajari sejumlah besar informasi tentang lanskap.)

Pertimbangkan titik awal populer lainnya dalam pembuatan konten prosedural: skema penjara bawah tanah. Tidak seperti generasi lansekap, skema ruang bawah tanah tidak memiliki algoritma yang mirip dengan kebisingan Perlin, yang secara ajaib menciptakan solusi dalam ruang yang menarik. Berdasarkan apa yang kita ketahui tentang ruang pembangkitan dan ruang yang menarik, kita dapat menebak bahwa generator ruang bawah tanah harus (1) memasukkan pengetahuan khusus tentang hari-hari berikutnya dan kesenangan, atau (2) membuat ruang bawah tanah yang sebagian besar tidak menarik. Memang, jika Anda melihat generator penjara bawah tanah yang diterbitkan selama setahun terakhir di / r / generuralgeneration, Anda akan melihat bahwa kebanyakan dari mereka tidak mengandung pengetahuan tentang ruang bawah tanah selain memeriksa koneksi semua kamar, dan oleh karena itu data yang ditampilkan oleh proyek-proyek ini lebih cenderung acak daripada menarik. .


Jadi, jika Anda menganggap bahwa Anda kurang lebih setuju dengan apa yang saya tulis, lalu pelajaran apa yang bisa dipetik dari konsep ruang yang menarik ini?

  • Generasi prosedural pada dasarnya kompleks karena ruang yang menarik adalah target yang sangat kecil dan sulit dicapai.
  • Terlepas dari pengecualian sesekali seperti kebisingan Perlin, orang seharusnya tidak berharap bahwa algoritma sederhana dan naif akan berhasil menghasilkan konten yang menarik. Generasi prosedural yang baik harus mencakup dan menggunakan pengetahuan luas dan mendalam tentang bidang subjek dan pemahaman tentang apa yang membuat konten menarik.
  • Tetapi bahkan dalam algoritme pembangkitan terbaik, ruang pembangkitan adalah kompak, tetapi ruang yang menarik tidak, oleh karena itu, diharapkan generasi prosedural akan sering terlewatkan, dan oleh karena itu sistem perlu dibangun sesuai.
  • Di area subjek yang kompleks, ruang yang menarik dibagi dan memiliki bentuk yang aneh. Anda seharusnya tidak berharap bahwa suatu algoritma atau pendekatan yang bekerja dengan baik di satu bagian ruang yang menarik tentu akan bekerja dengan baik di bagian lain. Oleh karena itu, kita harus berharap bahwa generasi prosedural akan mencakup banyak algoritma yang berbeda menggunakan bagian berbeda dari ruang yang menarik.

Jika Anda baru mulai bekerja dengan generasi prosedural, maka saya sarankan Anda untuk memikirkan kesenangan. Apa yang akan membuat output menarik? Apa yang perlu dipahami oleh algoritma untuk menghasilkan data yang seringkali menarik? Apa cara lain untuk menampilkan data yang mungkin menarik? Algoritma baru apa yang saya perlukan untuk menghasilkan jenis minat ini? Bagaimana cara menggabungkan / menyeimbangkannya dengan algoritma pertama?

Misalnya, jika saya ingin membuat generator penjara bawah tanah, maka saya berpikir tentang ruang bawah tanah untuk sementara waktu, dan memutuskan bahwa menurut pendapat saya ruang bawah tanah itu menarik jika:

  1. Mereka terlihat seperti diciptakan untuk menjadi gudang, sel penjara
    dan infrastruktur bawah tanah lainnya dari kastil besar
  2. Kemudian mereka dipenuhi dengan monster dan dibangun kembali oleh mereka untuk memenuhi kebutuhan mereka akan tempat tinggal, makanan, air, perlindungan dari serangan, dll.

Sekarang Anda dapat berpikir tentang bagaimana tingkat gudang bawah tanah akan terlihat seperti, bagaimana algoritma untuk generasi variasi prosedural dari tema ini akan terlihat, dan bagaimana monster dapat mengubah skema ini. Saya percaya bahwa memikirkan masalah-masalah seperti itu akan memungkinkan Anda untuk belajar lebih banyak tentang pembuatan prosedural daripada penerapan generator lanskap lain dalam kebisingan Perlin atau generator penjara bawah tanah dari ruang dan koridor acak.

Source: https://habr.com/ru/post/id440286/


All Articles