Algoritma Wave Function Collapse menghasilkan bitmap yang secara lokal mirip dengan bitmap input.
Kemiripan lokal berarti itu
- (C1) Setiap pola piksel NxN dalam output harus muncul setidaknya sekali dalam input.
- (Kondisi lemah C2) Distribusi pola NxN dalam input harus sama dengan distribusi pola NxN dalam sejumlah besar set output yang signifikan. Dengan kata lain, probabilitas pertemuan pola tertentu dalam output harus dekat dengan kepadatan pola tersebut dalam input.
Dalam contoh, nilai standar N adalah 3.
Algoritma WaveFunctionCollapse (WFC) menginisialisasi bitmap output sebagai keadaan yang sama sekali tidak dapat diobservasi di mana nilai setiap pixel adalah superposisi dari warna bitmap input (jadi jika gambar input berwarna hitam dan putih, maka status unobservable ditampilkan sebagai warna abu-abu yang berbeda). Koefisien dari superposisi ini adalah nyata, bukan bilangan imajiner, sehingga algoritme tidak menggunakan mekanika kuantum nyata, melainkan diilhami olehnya. Kemudian program masuk ke siklus observasi-propagasi:
- Pada setiap tahap pengamatan, di antara ruang yang tidak teramati, wilayah NxN dengan entropi Shannon terendah dipilih. Keadaan wilayah ini kemudian runtuh ke keadaan kepastian sesuai dengan koefisien dan distribusi pola NxN dalam data input.
- Pada setiap tahap distribusi, informasi baru yang diperoleh selama runtuhnya tahap sebelumnya disebarluaskan sesuai dengan output.
Pada setiap tahap, total entropi menurun, dan pada akhirnya kita mendapatkan kondisi yang dapat diamati sepenuhnya, keruntuhan fungsi gelombang berakhir.
Bisa terjadi bahwa selama proses propagasi semua koefisien untuk piksel tertentu menjadi sama dengan nol. Ini berarti bahwa algoritme telah mencapai kontradiksi dan tidak dapat dieksekusi lebih lanjut. Tugas menentukan apakah bitmap yang diberikan memberikan kondisi memuaskan bitmap nontrivial lainnya (C1) adalah NP-hard, sehingga tidak mungkin untuk membuat solusi cepat yang selalu melengkapi algoritma. Namun, dalam praktiknya, algoritma ini jarang sekali menemukan kontradiksi.
Algoritma runtuhnya fungsi gelombang diimplementasikan dalam
C ++ ,
Python ,
Kotlin ,
Rust ,
Julia ,
Haxe ,
JavaScript dan diadaptasi untuk
Unity . File yang dapat dieksekusi resmi dapat diunduh dari
itch.io atau
dijalankan di browser . WFC menghasilkan level di
Bad North ,
Caves of Qud ,
beberapa gim
kecil , dan juga banyak prototipe. Penciptaannya menyebabkan
studi baru .
Untuk pekerjaan terkait lainnya ,
penjelasan ,
demo interaktif ,
panduan ,
tutorial, dan
contoh, lihat bagian
port, fork, dan spin-off .
Tonton demonstrasi algoritma WFC di YouTube:
https://youtu.be/DOQTr2Xmlz0Algoritma
- Baca bitmap yang masuk dan hitung jumlah pola NxN.
- (opsional) Tambahan data pola dengan pola yang diputar dan dipantulkan.
- Buat array dengan ukuran data output (disebut "gelombang" di sumber). Setiap elemen dari array ini menunjukkan keadaan wilayah ukuran NxN dalam output. Keadaan wilayah NxN adalah superposisi pola NxN dari data input dengan koefisien Boolean (yaitu, keadaan piksel dalam output adalah superposisi warna yang masuk dengan koefisien nyata). Koefisien False berarti bahwa pola yang sesuai dilarang, koefisien benar berarti bahwa pola yang sesuai belum dilarang.
- Inisialisasi gelombang dalam keadaan yang sama sekali tidak dapat diobservasi, yaitu, di mana semua koefisien Boolean benar.
- Ulangi langkah-langkah berikut:
- Pengamatan:
- Temukan elemen gelombang dengan entropi bukan nol minimal. Jika tidak ada elemen seperti itu (jika semua elemen memiliki entropi nol atau tidak terbatas), maka selesaikan siklus (4) dan lanjutkan ke langkah (5).
- Perkecil elemen ini ke dalam tingkat kepastian sesuai dengan koefisiennya dan distribusi pola NxN dari data input.
- Penyebaran: menyebarluaskan informasi yang diperoleh pada langkah pengamatan sebelumnya.
- Pada titik ini, semua elemen gelombang memiliki keadaan yang dapat diamati sepenuhnya (semua koefisien, kecuali satu, sama dengan nol) atau berada dalam keadaan kontradiksi (semua koefisien sama dengan nol). Dalam kasus pertama, kembalikan hasilnya. Dalam kasus kedua, keluar tanpa mengembalikan apa pun.
Pembuatan Kartu Tile
Kasus non-sepele yang paling sederhana dari algoritma adalah pola NxN = 1x2 (lebih tepatnya, NxM). Jika kita lebih menyederhanakannya, menjaga bukan probabilitas pasangan warna, tetapi probabilitas warna itu sendiri, maka kita akan mendapatkan apa yang disebut "model ubin sederhana". Fase propagasi dalam model ini hanyalah penyebaran ketergantungan lingkungan. Lebih mudah menginisialisasi model ubin sederhana dengan daftar ubin dan data lingkungan mereka (data lingkungan dapat dianggap sebagai sejumlah besar sampel yang sangat kecil), daripada bitmap sampel.
GIF |
GIFVDaftar semua pasangan ubin yang mungkin ada di dalam ubin praktis bisa sangat panjang, jadi untuk mempersingkat penghitungan, saya menerapkan sistem simetri untuk ubin. Dalam sistem ini, setiap ubin harus diberi jenis simetri.
Perhatikan bahwa ubin memiliki simetri yang sama dengan huruf yang diberikan kepadanya (dengan kata lain, tindakan kelompok D4 dihedral adalah isometrik untuk ubin dan huruf yang sesuai). Berkat sistem ini, cukup untuk membuat daftar pasangan ubin tetangga hanya dengan simetri mereka, mempersingkat daftar tetangga untuk tileset dengan banyak ubin simetris beberapa kali (bahkan di ubin di medan Musim Panas, walaupun faktanya gambarnya tidak simetris, sistem menganggap ubin seperti itu simetris).
Perhatikan bahwa ubin yang tidak terbatas yang diatur dari node (di mana semua 5 ubin itu valid) tidak menarik untuk algoritma WFC, karena Anda tidak bisa masuk ke situasi di mana tidak mungkin untuk menempatkan ubin. Kami menyebut tileset dengan properti ini "sederhana". Tanpa heuristik yang kompleks, tileset sederhana tidak menciptakan struktur global yang menarik, karena korelasi dalam tileset sederhana pada jarak cepat berkurang. Banyak ubin sederhana dapat ditemukan di
cr31 . Lihat di sana di tileset "Dual" dua sisi. Bagaimana dia bisa membuat node (tanpa koneksi berbentuk T, itu sulit), sementara pada saat yang sama menjadi sederhana? Jawabannya adalah ia hanya dapat menghasilkan jenis simpul yang sempit dan tidak dapat membuat simpul sembarang.
Juga patut dicatat bahwa Circuit, Summer, dan Rooms tilesets bukan ubin Van. Artinya, data lingkungan mereka tidak dapat dihasilkan dari pewarnaan tepi. Misalnya, dalam rangkaian ubin sirkuit (sirkuit terpadu), dua sudut tidak dapat berdekatan, meskipun mereka dapat dihubungkan dengan koneksi (Sambungan), dan trek diagonal tidak dapat mengubah arah.
Dimensi yang lebih tinggi
Algoritma WFC dalam dimensi yang lebih tinggi bekerja persis sama dengan dua dimensi, tetapi kinerja menjadi masalah di sini. Model voxel ini dihasilkan pada N = 2 dalam model ubin dengan tumpang tindih menggunakan blok 5x5x5 dan 5x5x2 dan heuristik tambahan (ketinggian, kepadatan, kelengkungan ...).
Tangkapan layar dimensi lebih tinggi:
1 ,
2 ,
3 .
Model Voxel yang dihasilkan menggunakan WFC dan algoritma lainnya akan berada dalam repositori terpisah.
Sintesis Terbatas
Algoritma WFC mendukung pembatasan. Oleh karena itu, dapat dengan mudah dikombinasikan dengan algoritma generatif lain atau pembuatan manual.
Inilah cara WFC secara otomatis menyelesaikan level yang diprakarsai orang:
GIF |
GIFVAlgoritma
ConvChain memenuhi versi kondisi ketat (C2): distribusi batas pola NxN dalam data output yang dibuatnya persis sama dengan distribusi pola dalam data input. Namun, ConvChain tidak memuaskan (C1): sering membuat artefak yang terlihat. Adalah logis untuk memulai ConvChain terlebih dahulu untuk mendapatkan konfigurasi sampel yang baik, dan kemudian WFC untuk memperbaiki artefak lokal. Ini mirip dengan strategi umum dalam optimasi: pertama kita jalankan metode Monte Carlo untuk menemukan titik. dekat dengan global optimal, dan kemudian lakukan gradient descent dari titik ini untuk akurasi yang lebih besar.
Algoritma
sintesis tekstur P.F. Harrison jauh lebih cepat daripada WFC, tetapi memiliki masalah dengan korelasi yang panjang (misalnya, algoritma ini sulit untuk mensintesis tekstur dinding bata dengan batu bata yang dibuat dengan benar). Dalam kasus seperti itulah WFC menunjukkan keunggulannya, dan algoritma Harrison mendukung keterbatasan. Masuk akal untuk pertama-tama menghasilkan skema dinding bata yang ideal menggunakan WFC, dan kemudian melakukan algoritma sintesis tekstur terbatas untuk skema ini.
Komentar
Mengapa heuristik entropi minimum digunakan? Saya perhatikan bahwa ketika orang menggambar sesuatu, mereka sering mengikuti heuristik dari entropi minimal sendiri. Itu sebabnya algoritma ini sangat menarik untuk ditonton.
Model yang tumpang tindih sesuai dengan model sederhana dengan cara yang sama seperti rantai Markov orde tinggi sesuai dengan rantai Markov orde pertama.
Perlu dicatat bahwa entropi dari simpul apa pun tidak dapat meningkat pada tahap propagasi, mis. probabilitas tidak bertambah, tetapi dapat diatur ulang ke nol. Ketika tahap propagasi tidak dapat mengurangi entropi lebih lanjut, kami mengaktifkan tahap observasi. Jika tahap pengamatan tidak dapat mengurangi entropi, ini berarti bahwa algoritme telah selesai bekerja.
Fase propagasi dalam algoritma WFC sangat mirip dengan algoritma propagasi keyakinan loopy. Sebenarnya, saya awalnya memprogram propagasi kepercayaan (BP), tetapi kemudian saya beralih ke propagasi dengan kendala dengan distribusi stasioner yang tetap, karena BP jauh lebih lambat tanpa paralelisasi masif (dalam CPU) dan tidak menghasilkan hasil yang jauh lebih baik untuk tugas saya.
Perhatikan bahwa sampel "Simpul Sederhana" dan "Simpang Simpul" tidak memiliki 2, tetapi 3 warna.
Satu dimensi mungkin waktu. Secara khusus, WFC d-dimensi menampilkan perilaku dari setiap otomat seluler dimensi (d-1).
Referensi
Proyek ini didasarkan pada karya Paul Merrell pada sintesis model, khususnya, pada bab tentang sintesis model diskrit dari
disertasinya . Paul menyebar keterbatasan lingkungan di apa yang kita sebut model ubin sederhana, dengan heuristik yang berupaya menghitung penyebaran di area bergerak kecil.
Proyek saya juga sangat dipengaruhi oleh bab tentang sintesis tekstur deklaratif dari
disertasi Paul F. Harrison . Paul menetapkan data pada lingkungan ubin, menandai batas-batas mereka dan menggunakan pencarian kembali untuk mengisi peta ubin.
Majelis
WFC adalah aplikasi konsol yang hanya bergantung pada perpustakaan standar. Unduh
.NET Core untuk Windows, Linux, atau macOS dan jalankan
dotnet run WaveFunctionCollapse.csproj
Atau Anda dapat menggunakan instruksi pembangunan komunitas untuk platform berbeda dalam
masalah terkait . Casey Marshall membuat
permintaan tarik yang menyederhanakan penggunaan program baris perintah dan termasuk paket snap.
Port, garpu, dan spin-off yang menarik
- Emil Ernerfeld membuat port di C ++ .
- Max Eller menciptakan Perpustakaan Kotlin (JVM) yang disebut Kollapse . Joseph Roscopf menciptakan port line-by- port pada versi 2018 yang dioptimalkan oleh Kotlin . Edwin Jacobs membuat perpustakaan Kotlin lain.
- Kevin Chapelier membuat porta di JavaScript .
- Oscar Stalberg telah memprogram model ubin tiga dimensi, model ubin dua dimensi untuk grid yang tidak rata dalam sebuah bola. Berikut adalah ubin 3D yang indah untuk mereka: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 .
- Joseph Parker mengadaptasi WFC untuk Unity dan menggunakannya untuk menghasilkan skatepark dalam game Proc Skater 2016 , dataran tinggi yang fantastis di game Swapland 2017 dan level platform di Bug 2018 dengan game Gun .
- Martin O'Leary menerapkan algoritma mirip WFC untuk menghasilkan puisi: 1 , 2 , 3 , 4 .
- Nick Nenov menciptakan voxel tileset tiga dimensi berdasarkan Castleet tileset saya. Nick menggunakan opsi output teks ke model ubin untuk menciptakan kembali model 3D di Cinema 4D.
- Sean Lefler telah menerapkan model dengan tumpang tindih pada Rust .
- rid5x membuat versi WFC di OCaml .
- Saya menerbitkan model ubin tiga dimensi yang sederhana sehingga orang dapat membuat tileset 3D sendiri tanpa menunggu repositori lengkap dari algoritma tiga dimensi.
- Saya membuat model interaktif dari model yang tumpang tindih. Eksekusi GUI dapat diunduh dari halaman WFC di itch.io.
- Brian Buckley merakit pipa pembangkitan level untuk game Caves of Qud , yang menggunakan WFC dalam beberapa lintasan: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 14 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 .
- Danny Wine telah menerapkan model ubin tiga dimensi .
- Arvi Teikari telah memprogram algoritma sintesis tekstur heuristik entropi pada Lua. Headchant mem- portingnya untuk bekerja dengan LÖVE.
- Isaac Curt menciptakan port pada model Python dengan tumpang tindih.
- Oscar Stalberg telah menciptakan versi interaktif model ubin yang berjalan di browser.
- Matt Ricks menerapkan model ubin tiga dimensi ( 1 , 2 , 3 , 4 ) dan menciptakan model ubin tiga dimensi di mana salah satu dimensi adalah waktu ( 1 , 2 , 3 , 4 , 5 ).
- Nick Nenov membuat panduan visual untuk sistem simetri ubin.
- Isaac Curt dan Adam M. Smith menulis sebuah artikel penelitian di mana mereka merumuskan WFC sebagai tugas ASP, menggunakan pemecah kendala umum clingo umum untuk menghasilkan bitmap, bereksperimen dengan kendala global, menelusuri sejarah WFC dan memberikan deskripsi rinci tentang algoritma.
- Sylvain Lefebvre menciptakan implementasi C ++ dari sintesis model tiga dimensi, menggambarkan proses pemikiran membuat sampel, dan menunjukkan contoh di mana pembatasan lingkungan memastikan bahwa output terhubung (Anda dapat memotongnya).
- Saya menggeneralisasi WFC tiga dimensi sehingga bekerja dengan grup simetri kubus dan menciptakan adegan menghasilkan tileset dengan gaya Escher .
- Ada banyak cara untuk memvisualisasikan keadaan gelombang yang dapat diamati sebagian. Dalam kode tersebut, nilai warna dari opsi yang mungkin dirata-ratakan untuk mendapatkan warna akhir. Oscar Stalberg menunjukkan sebagian yang dapat diamati sebagai persegi panjang transparan: semakin banyak pilihan, semakin besar persegi panjangnya. Dalam skema voxel, saya memvisualisasikan keadaan gelombang dengan pemilihan piksel demi piksel.
- Remy Devo mengimplementasikan model ubin di PICO-8 dan menulis artikel tentang pembuatan data yang koheren dengan penjelasan tentang WFC.
- Untuk permainannya Bad North, Oscar Stalberg menggunakan heuristik yang mencoba untuk memilih ubin seperti itu sehingga pada setiap tahap zona yang diamati diamati lumayan.
- William Manning menerapkan model yang tumpang tindih dalam C #; Pertama-tama, ia berusaha membuat kode tersebut dapat dibaca, dan menambahkan WPF dengan antarmuka grafis.
- Joseph Parker menulis tutorial WFC untuk Procjam 2017.
- Aman Tiwari merumuskan kendala koneksi sebagai tugas ASP untuk clingo.
- MatveyK telah memprogram model tiga dimensi dengan tumpang tindih .
- Silvan Lefebvre , Lee Yu Wei dan Connelly Barnes sedang menjajaki kemungkinan menyembunyikan informasi di dalam tekstur. Mereka menciptakan alat yang dapat menyandikan pesan teks sebagai ubin WFC dan mendekode kembali. Teknik ini memungkinkan penggunaan ubin WFC sebagai kode QR.
- Mathieu Fer dan Nathaniel Kuran secara signifikan meningkatkan runtime WFC, untuk model yang tumpang tindih dengan urutan besarnya. Saya mengintegrasikan perangkat tambahan mereka ke dalam kode.
- Vasu Mahesh mem-porting model ubin 3D ke TypeScript, menciptakan tileset baru dan memvisualisasikan proses pembuatan di WebGL.
- Kim Huanghee bereksperimen dengan WFC tiga dimensi dan menciptakan / mengadaptasi banyak ubin voxel: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 .
- Oscar Stalberg membuat presentasi tentang generasi tingkat di Bad North di Konferensi Prosedural Semuanya 2018.
- Saya menulis tentang cara membuat (kurang-lebih) jalur tidak terdistorsi antara dua titik menggunakan WFC dan algoritma lainnya.
- Aiser Curt dan Adam M. Smith menerbitkan pracetak yang menggambarkan sistem berbasis WFC, yang belajar dari contoh-contoh positif dan negatif, dan membicarakannya dalam konteks umum dialog dengan generator sampel.
- Brandan Anthony menggunakan WFC untuk menghasilkan hiasan dinding di Rodina .
- Tim Kong telah menerapkan model yang tumpang tindih pada Haxe .
- Boris the Brave menerapkan metode pahat pada WFC untuk menghasilkan struktur yang terhubung. Dia telah menerbitkan perpustakaan yang mendukung jerat heksagonal, pembatasan tambahan, dan pengulangan.
- Marian Kleineberg menciptakan untuk Procjam 2018 sebuah generator kota berdasarkan model ubin. Dia menulis sebuah artikel yang menggambarkan pendekatannya untuk mengatur lingkungan, kembali dan variasi online WFC.
- Sol Bekic memprogram model ubin berbasis GPU menggunakan PyOpenCL. Alih-alih menyimpan antrian node dari mana distribusi dilakukan, model ini secara bersamaan melakukan distribusi dari setiap node grid.
- Wouter van Oortmerssen menerapkan model ubin dalam fungsi C ++ tunggal dengan struktur untuk mempercepat pengamatan, mirip dengan antrian prioritas.
- Robert Hoenig menerapkan model dengan tumpang tindih pada Julia dengan opsi untuk mendistribusikan pembatasan hanya secara lokal.
- Edwin Jacobs menerapkan WFC ke transfer gaya dan dithering .
Ucapan Terima Kasih
Beberapa contoh diambil dari game Ultima IV dan
Dungeon Crawl . Lingkaran Tileset diambil dari
Mario Klingemann . Gagasan menghasilkan sirkuit terintegrasi diusulkan oleh
Moonasaur , dan gaya mereka diambil dari game
Ruckingenur II oleh Zachtronics. Contoh tumpang tindih Cat diambil dari video Nyan Cat, contoh Qud dibuat oleh
Brian Buckley , Kantor Ajaib + contoh Spiral adalah rid5x, Kota Berwarna + Tautan + Tautan 2 + Mazelike + Red Dot + Senyum overlay Kota contoh adalah Arvi Teikari. Musim Panas Tileset diciptakan oleh Hermann Hillmann. Model Voxel disajikan dalam
MagicaVoxel .