Strona główna VFX Dym VFX — Stable Fluids

💨 Dym VFX — Stable Fluids

Symulacja dymu w czasie rzeczywistym solwerem Stable Fluids Josa Stama (niejawna dyfuzja + adwekcja + projekcja). Wzmocnienie wirowości dodaje zawirowań. Przeciągaj myszą, by wytwarzać dym.

VFX3DŚredni60 FPS
smoke-vfx ↗ Otwórz osobno
Interfejs samej symulacji jest w języku angielskim.

Jak to działa

Symulator implementuje dwuwymiarowy solwer Stable Fluids na siatce 128×67. Każdy krok symulacji: (1) przyłożenie sił myszy do pola prędkości, (2) dyfuzja prędkości metodą iteracji Gaussa-Seidla, (3) projekcja wymuszająca nieściśliwość (rozwiązanie równania Poissona), (4) adwekcja prędkości metodą semi-lagranżowskiego śledzenia wstecz, (5) zastosowanie wzmocnienia wirowości, (6) dyfuzja i adwekcja gęstości dymu.

Naviera-Stokesa: ∂u/∂t = -(u·∇)u + ν∇²u + f, ∇·u = 0 Adwekcja: q(x,t+dt) = q(x - u(x)·dt, t) [semi-lagranżowska] Projekcja: ∇·u = 0 poprzez ∇²p = ∇·u*, u = u* - ∇p Wirowość: f_vc = ε(η × ω), η = ∇|ω|/|∇|ω||

Najczęściej zadawane pytania

Czym jest metoda Stable Fluids?

Stable Fluids to metoda opracowana przez Josa Stama (1999) do bezwarunkowo stabilnej symulacji płynów w czasie rzeczywistym. Wykorzystuje niejawne całkowanie czasowe dla dyfuzji oraz krok adwekcji semi-lagranżowskiej, który nigdy nie staje się numerycznie niestabilny, niezależnie od wielkości kroku czasowego.

Czym są równania Naviera-Stokesa?

Nieściśliwe równania Naviera-Stokesa opisują ruch płynu: ∂u/∂t = -(u·∇)u + ν∇²u + f, przy ∇·u = 0 dla nieściśliwości. Poszczególne wyrazy odpowiadają odpowiednio adwekcji (transportowi przez przepływ), dyfuzji (lepkości) i siłom zewnętrznym.

Czym jest adwekcja semi-lagranżowska?

Adwekcja semi-lagranżowska śledzi każdą komórkę siatki wstecz w czasie wzdłuż pola prędkości, aby znaleźć pochodzenie płynu, a następnie interpoluje gęstość/prędkość w tym punkcie. Jest bezwarunkowo stabilna, ale wprowadza dyfuzję numeryczną, przez co przepływ z czasem wygląda na rozmyty.

Czym jest krok projekcji w symulacji płynów?

Krok projekcji wymusza nieściśliwość (∇·u = 0), rozwiązując równanie Poissona dla ciśnienia i odejmując gradient ciśnienia od prędkości. Zapobiega to gromadzeniu się lub zanikaniu płynu, zachowując jego całkowitą ilość.

Czym jest wzmocnienie wirowości?

Wzmocnienie wirowości przeciwdziała dyfuzji numerycznej adwekcji semi-lagranżowskiej. Wykrywa obszary o dużej wirowości (rotacji prędkości) i przykłada siły skupiające ruch wirowy, dając bardziej turbulentne i realistyczne efekty dymu i ognia.

Czym jest dyfuzja numeryczna w symulacji płynów?

Dyfuzja numeryczna to sztuczne wygładzanie wprowadzane przez dyskretyzację równań adwekcji. Metody semi-lagranżowskie z interpolacją dwuliniową są na nią szczególnie podatne, przez co dym z czasem wygląda na rozmyty bez technik korekcyjnych, takich jak wzmocnienie wirowości.

Jak w Stable Fluids adwekowana jest gęstość dymu?

Gęstość dymu jest skalarem pasywnym transportowanym przez pole prędkości. Pełny krok czasowy: (1) dodanie sił, (2) dyfuzja prędkości, (3) projekcja do pola bezźródłowego, (4) adwekcja prędkości, (5) ponowna projekcja, (6) adwekcja gęstości. Gęstość jest mnożona przez współczynnik zanikania, by symulować zanikanie dymu.

Jaka rozdzielczość siatki jest potrzebna do symulacji płynów w czasie rzeczywistym?

Symulacje Stable Fluids w czasie rzeczywistym zwykle używają siatek od 64×64 do 256×256 dla 60 kl./s w JavaScript. Implementacje na GPU (WebGL) mogą działać z siatką 512×512 lub większą. Wyższa rozdzielczość oddaje więcej szczegółów turbulencji, ale wymaga więcej obliczeń na klatkę.

Czym jest metoda Gaussa-Seidla w symulacji płynów?

Iteracja Gaussa-Seidla rozwiązuje układy liniowe wynikające z niejawnej dyfuzji i projekcji ciśnienia. Każda komórka jest aktualizowana z użyciem najnowszych wartości sąsiadów w powtarzanych przebiegach aż do zbieżności — zwykle 4-20 iteracji na klatkę dla dobrego kompromisu jakości i szybkości.

Jak działa siła wzmocnienia wirowości?

Wirowość ω = ∇×u jest obliczana w każdej komórce. Gradient |ω| wskazuje kierunek ku centrom wirów. Siła wzmacniająca f = ε(η×ω), gdzie η = ∇|ω|/|∇|ω||, popycha płyn do rotacji wokół istniejących wirów, przywracając rotację utraconą wskutek dyfuzji numerycznej.

Podobne symulacje