Stable Fluids
Основные поля:
- \(\mathbf{u}=(u,v)\) — поле скорости
- \(p\) — давление
- \(d\) — поле красителя
- \(\omega\) — вихрь
Основные уравнения
1. Уравнение движения жидкости (уравнение Навье-Стокса)
\[
\frac{\partial \mathbf{u}}{\partial t}
+ (\mathbf{u}\cdot\nabla)\mathbf{u}
= -\nabla p + \nu \Delta \mathbf{u} + \mathbf{f}
\]
Что означает:
- \((\mathbf{u}\cdot\nabla)\mathbf{u}\) — перенос скорости потоком (адвекция)
- \(-\nabla p\) — влияние давления
- \(\nu \Delta \mathbf{u}\) — вязкая диффузия скорости
- \(\mathbf{f}\) — внешние силы, включая добавление импульса и вихревую силу
2. Условие несжимаемости (уравнение неразрывности при константной плотности жидкости)
\[
\nabla \cdot \mathbf{u} = 0
\]
Это означает, что жидкость не сжимается и не расширяется.
Для этого после каждого шага вычисляется давление и скорость корректируется.
3. Уравнение для давления
\[
\Delta p = \nabla \cdot \mathbf{u}
\]
После решения этого уравнения скорость исправляется:
\[
\mathbf{u} \leftarrow \mathbf{u} - \nabla p
\]
4. Уравнение для красителя
\[
\frac{\partial d}{\partial t} + (\mathbf{u}\cdot\nabla)d = \kappa \Delta d
\]
То есть краситель:
- переносится потоком
- может немного диффундировать
- затем затухает через коэффициент диссипации
5. Вихревой член
Сначала вычисляется скалярный вихрь:
\[
\omega = \frac{\partial v}{\partial x} - \frac{\partial u}{\partial y}
\]
Затем добавляется вихревая сила, которая усиливает мелкие завихрения:
\[
\mathbf{f}_{vort} = \varepsilon \, \mathbf{N} \times \omega
\]
где
\[
\mathbf{N} = \frac{\nabla |\omega|}{\left|\nabla |\omega|\right|}
\]
Численная схема
Симуляция считается на регулярной 2D-сетке с конечными разностями.
Производные считаются примерно так:
\[
\frac{\partial u}{\partial x} \approx \frac{u_{i+1,j} - u_{i-1,j}}{2},
\qquad
\frac{\partial v}{\partial y} \approx \frac{v_{i,j+1} - v_{i,j-1}}{2}
\]
Краткий алгоритм одного шага
-
Добавление вихревой силы
Сначала вычисляется вихрь \(\omega\), затем к скорости добавляется \(\mathbf{f}_{vort}\),
чтобы поток выглядел более “живым” и закрученным.
-
Диффузия скорости
Решается уравнение:
\[
(I - \nu \Delta t \Delta)\mathbf{u}^* = \mathbf{u}^n
\]
Это делается итерационно методом Гаусса–Зейделя.
-
Проекция на несжимаемое поле
Вычисляется дивергенция скорости, решается уравнение Пуассона для давления,
после чего скорость корректируется:
\[
\mathbf{u} \leftarrow \mathbf{u} - \nabla p
\]
-
Перенос скорости
Используется полулагранжев метод:
\[
\mathbf{u}^{n+1}(x) = \mathbf{u}^n(x - \Delta t\,\mathbf{u}(x))
\]
Значение берётся из “предыдущей” точки вдоль траектории частиц.
Для этого применяется билинейная интерполяция.
-
Повторная проекция
Ещё раз корректируется скорость в соответствии с уравнением несжимаемости.
-
Диффузия красителя
Краситель слегка размазывается по сетке.
\[
(I - \nu \Delta t \Delta)\mathbf{d}^* = \mathbf{d}^n
\]
-
Перенос красителя потоком
\[
d^{n+1}(x) = d^n(x - \Delta t\,\mathbf{u}(x))
\]
Также с билинейной интерполяцией и затуханием.
Добавление краситиеля \(d\)
Пользователь по клику лкм добавляет локально:
- импульс в поле скорости
- краситель в поле плотности/цвета
Это имитирует, например, струю дыма/чернил.