← На главную

rskupnik сделал туториал по симуляции жидкости Navier-Stokes в Godot

26.05.2026 22:15 · hackernews

Разработчик под ником rskupnik опубликовал подробный туториал по симуляции жидкости Navier-Stokes в Godot. Он признаётся, что сам не математик, и пишет этот материал, чтобы другим было проще разобраться. Код выложен на GitHub с привязкой коммитов к главам блога.

В основе симуляции лежат уравнения Навье-Стокса, но для нужд геймдева автор жертвует точностью в пользу скорости. Он использует небольшую сетку с крупными ячейками, произвольные временные шаги и приближённые вычисления вроде релаксации Гаусса-Зейделя. Все расчёты идут исключительно на CPU — это сделано специально, чтобы код было проще читать.

Сначала создаётся сетка (N+2) x (N+2) с переменными density, u (горизонтальная скорость) и v (вертикальная скорость). Все данные хранятся в одномерных массивах PackedFloat32Array. Для удобства индексации написана функция IX(i, j). Границы сетки отрисовываются другим цветом по сравнению с внутренними ячейками.

Пользователь может кликать или тащить мышкой по ячейкам — так добавляется плотность и скорость.Реализовано затухание (fade) и для плотности, и для скорости, чтобы сетка не забивалась. Скорость визуализируется стрелками.

Главный шаг — адвекция плотности. Вместо того чтобы толкать плотность вперёд по направлению скорости, автор делает обратный трекинг (backwards tracking). Для каждой ячейки он вычисляет, откуда могла прийти её текущая плотность: берёт скорость в этой ячейке, инвертирует её и умножает на временной шаг. Полученная точка почти никогда не попадает в центр ячейки. Тогда код находит четыре соседних ячейки вокруг неё, вычисляет веса (s0, s1, t0, t1) и применяет билинейную интерполяцию, чтобы взять правильную порцию плотности из каждого соседа. Перед этим массив density копируется в density_prev, чтобы итерация не портила данные.

Автор подчёркивает, что такой подход — осознанный компромисс: он работает, потому что в плавном поле скоростей резких скачков не бывает, а погрешность для игры вполне приемлема.

Весь код и ссылки на коммиты есть в репозитории github.com/rskupnik/godot-fluid-simulation-demo.

Читать оригинал →