Сітка простих правил, а не фізичний двигун
Пісок, дим, вогонь та вода в цій симуляції не моделюються за допомогою реальних рівнянь рідин — це клітинна автоматика: сітка комірок, кожна з яких містить тип матеріалу, і яка оновлюється що кадр на основі невеликого набору локальних правил, які враховують лише безпосередніх сусідів комірки. Це одна з тих самих технік, як у грі «Життє та доля» Конвея, але з більш ніж двома станами та правилами, відлагодженими для того, щоб виглядати як фізичні матеріали. Це той самий трюк, який використовується в класичних іграх «падаючого піску» — дешево обчислюється, легко зробити інтерактивним та візуально переконливим без вирішення жодної диференціальної рівняння.
Пісок: гравітація плюс кидок монети
Кожна клітинка піску запитує, кожен кадр: чи порожня клітина безпосередньо знизу? Якщо так, впадіть у неї. Якщо клітина безпосередньо знизу зайнята, але одна з двох діагональних клітинок нижче порожня, перемістіться туди замість цього – це те, що дозволяє формуватися реалістичні нахилені купи піску, які ви бачите, коли він падає, названі кутом спочинку, замість однієї незвичайної вертикальної колони. Коли обидві діагональні клітинки вільні, автомати встановлює один з двох випадковим чином, що дає купи піску трохи нерівні та природно виглядають краї замість ідеальних симетричних трикутників.
Дим і вогонь: дифузія та плавучість
Дим поводиться абсолютно протилежно до піску – він схильний підніматися та розповсюджуватися. Кожну клітинку диму має шанс переміщатися вгору або вбік у порожню сусідню клітину, і її щільність або життєва цінність повільно зменшуються з кожною кадровою послідовністю доти, поки вона не зникне – це і пояснює, чому димний стовп витончується та згасає, коли піднімається вгору. Вогняні клітини поводяться подібно до диму, але також мають правило для горіння: клітина вогню, що межує з легкозаймистою (наприклад, пісок, який замінює паливо), має шанс перетворити сусідню клітину на вогонь, і спалювані клітини перетворюються на дим, коли їхня цінність палива вичерпається. Цей локальний інфекційний та зникаючий шаблон достатньо для створення полум’я, яке мерехтить, розповсюджується по джерелу палива та залишає димову завісу – все це завдяки правилам, які завжди дивляться на одну клітину поруч.
SAND: if below empty → fall down
elif diag empty (either) → fall diagonally (random pick)
else → stay
FIRE: each frame: chance to ignite a flammable neighbour
fuel -= decay_rate; fuel <= 0 → convert to SMOKE
SMOKE: chance to move up/sideways into empty cell
life -= decay_rate; life <= 0 → cell becomes empty
Вода: повільний випадок
Водоподібні клітинки додають одне правило поверх поведінки піску, що падає: якщо водоподібна клітинка не може впасти вниз або по діагоналі, вона намагається переміститися горизонтально у порожній сусід, у будь-якому напрямку. Цей додатковий варіант – розповсюдження по горизонталі при блокуванні знизу – і є те, що перетворює правило піску, що падає, на такий, що утворює водойми, знаходить свій рівень і розтікається у ровелю замість накопичення в кучугурі.
Жодного з цього немає в тому, що є Navier-Stokes розв'язувач; немає тиску, немає терміну в’язкості, немає вектор швидкості на частинку. Що це захоплює – це якісний характер поведінки кожного матеріалу – купи піску, вода розтікається, дим підіймається і товщіє, вогонь їсть паливо та виробляє дим – що є рівнем реалізму, який потрібен для відчуття живості та реактивності у пісочницю на основі кліків та малювання з 60 кадрами в секунду на сітці з десятків тисяч клітинок.
Frequently asked questions
Чи це справжня симуляція рідини, як у гейм-двигуні, наприклад, вода?
Ні — це клітинний автомат, такий же тип, як Гра Життя Конвея. Кожна клітина просто перевіряє кілька сусідніх клітин і слідує за коротким списком правил руху та перетворення; не розв’язується поле тиску чи швидкості, що й робить симуляцію достатньо швидкою для роботи на великій сітці в реальному часі.
Чому з піску утворюються акуратні трикутні купи?
Тому що зерно, яке не може впасти прямо вниз, перевіряє дві діагональні клітини нижче перед тим, як здається, і ковзає вбік під час падіння, подібно до кута спокою справжнього піску. Випадковий вибір між двома діагоналями, коли обидві відкриті, і забезпечує природний вигляд поверхні купи замість ідеальної конусоподібної форми.
Як поширюється вогонь і врешті-решт згасає?
Кожна клітинка вогню має шанс підпалити горючу сусідню клітину що кадр, тому вогняна лінія повільно просувається на одну клітину за раз; кожне палаюче клітинка також має зменшувальне значення палива, і коли це досягає нуля, клітинка перетворюється на дим, що пояснює мерехтіння, поширення та зрештою відступ вогню до повільного диму.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Magic Sand & Smoke і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Magic Sand & Smoke