🗺️ Wave Function Collapse — Процедурна Генерація
Інтерактивний алгоритм WFC для процедурної генерації тайлових карт. Вибір за ентропією та поширення обмежень. Тайлсети Природа та Підземелля, налаштування розміру сітки.
Про цю симуляцію
Ця демонстрація запускає алгоритм Wave Function Collapse (WFC) — метод розв'язання обмежень для процедурної генерації карт. Кожна клітинка сітки починає в суперпозиції всіх дозволених тайлів. На кожному кроці симуляція «схлопує» клітинку з найнижчою ентропією — тут це просто кількість тайлів-кандидатів, що лишилися — а потім поширює цей вибір назовні, відсіюючи сусідів, чиї краєві роз'єми більше не збігаються. Запозичена квантова термінологія є метафоричною, але отримані карти виходять узгодженими й на диво органічними.
🔬 Що показано
Тайловий розв'язувач WFC на квадратній сітці. Кожен тайл має чотири краєві роз'єми (північ, схід, південь, захід); два тайли можуть стояти поруч, лише якщо їхні суміжні роз'єми мають однаковий id. Схлопування випадково обирає клітинку з найменшою кількістю кандидатів серед рівних, фіксує один тайл, а крок поширення на основі стека фільтрує кожного зачепленого сусіда. Незадовольнимі клітинки підраховуються як суперечності.
🎮 Як користуватись
Натисніть «Нова карта» для скидання, «Крок» — щоб схлопнути одну клітинку, або «Авто» для безперервного запуску. Вкладки Повільно/Середньо/Швидко задають затримку між кроками (200, 30 або 0 мс). Повзунок розміру сітки охоплює від 10 до 50 клітинок на сторону, і можна перемикатися між тайлсетами «Природа» та «Підземелля». Панель статистики відстежує схлопнуті клітинки, ті, що лишилися, та будь-які суперечності.
💡 Чи знали ви?
Wave Function Collapse опублікував Максим Гумін у 2016 році, назвавши на честь квантово-механічної ідеї про те, як вимірюваний стан «схлопується» до одного результату. Ця техніка тепер зустрічається в комерційних іграх, як-от Townscaper і Bad North, а також в архітектурних інструментах і синтезі текстур.
Поширені запитання
Що таке алгоритм Wave Function Collapse?
Це техніка процедурної генерації, яка заповнює сітку тайлами так, щоб кожна пара сусідів дотримувалася набору правил суміжності. Кожна клітинка спочатку містить усі можливі тайли, і алгоритм послідовно фіксує одну клітинку та поширює наслідки, доки вся сітка не стане узгодженою. Назва — це аналогія до квантового вимірювання, а не справжня фізика.
Як тут працює крок схлопування?
Розв'язувач шукає несхлопнуту клітинку з найменшою кількістю тайлів-кандидатів, що лишилися, розв'язуючи нічию випадково. Він призначає цій клітинці один випадковий тайл із її кандидатів, а потім виконує прохід поширення: кожен сусід залишає лише ті тайли, чий суміжний краєвий роз'єм збігається, а будь-яка зміна поширюється далі назовні через стек.
Що роблять керування та тайлсети?
«Нова карта» очищує й перезапускає, «Крок» виконує одне схлопування, а «Авто» циклічно повторює з обраною швидкістю (200, 30 або 0 мс на крок). Повзунок сітки задає довжину сторони від 10 до 50 клітинок. «Природа» будує воду, пляж, траву, ліс і гори; «Підземелля» будує порожнечі, стіни, коридори, кімнати, факели й лаву — кожен зі своєю сумісністю роз'ємів.
Що таке ентропія в цьому контексті?
Ентропія — це міра того, наскільки клітинка ще «не визначилася». У цій симуляції вона наближено оцінюється кількістю тайлів, якими клітинка ще може стати; класичний алгоритм використовує ентропію Шеннона, зважену частотами тайлів. Схлопування клітинок із низькою ентропією першими зберігає узгодженість найбільш обмежених ділянок і знижує ймовірність глухих кутів.
Чому інколи виникають суперечності?
Суперечність виникає, коли поширення залишає клітинку без жодного допустимого тайлу, тобто жоден тайл не може задовольнити всіх її сусідів. Оскільки ця демонстрація використовує просте впорядковане схлопування без відкату, вона розв'язує такі клітинки, примусово призначаючи резервний тайл і рахуючи цю подію, а не перезапускаючи процес. Розвиненіші реалізації відкочуються або перезапускаються, щоб гарантувати повністю коректну карту.