Strona głównaArtykułyEfekty Graficzne (VFX)

Stable Fluidy: Jak Gry Symulują Dym w Realnym Czasie

Przesuń myszką, aby wprowadzić dym do symulatora Stable Fluidy Josa Stama i zobacz, jak ograniczanie vortycji tworzy kręcące się plamy.

mysimulator teamZaktualizowano — czerwiec 2026≈ 9 min czytania▶ Otwórz symulację

Dlaczego proste rozwiązania zmiennych płynowych eksplodują

Równania Naviera-Stoksa opisują, jak ruchome są niekompresywne cieczy, a tradycyjny sposób symulacji ich numerycznej jest schematem różniczkowym explikitywnym: przesuwanie prędkości w przyszłość o mały krok czasowy, korzystając z pochodnych obecnej pól. Schematy takie jak ten są stabilne tylko jeśli krok czasowy pozostaje poniżej granic ustalonej przez warunek CFL — na podstawie tego, że nic nie może przekroczyć więcej niż jednego komórek siatki w ciągu jednego kroku. Zachowanie tej granicy przy przenośnych ramkach czasowych wymagałoby setek podkroków na każdą odpowiednio finansową siatkę. Artykuł SIGGRAPH Josa Stam z 1999 roku Stable Fluids uniknie całego problemu: osiąga stabilność dla dowolnego kroku czasowego, nawet bardzo dużego, zastępując eksplikitywną integrację prędkości interpolacją — co faktycznie nie może eksplodować.

demo na żywo · powiązana symulacja● LIVE

Trójkrotna procedura obliczeniowa

Każde ramka symulacji Graficznych Dymów Stabilnych wykonuje na siatce prędkości krótką pipeline: zastosuj siły zewnętrznego źródła, przesuń pole wzdłuż samego siebie, a następnie popraw je tak, aby zachować masę.

addForce(w, dt)     // buoyancy, an injected smoke source, wind
advect(w, w, dt)    // semi-Lagrangian: trace back, bilinear sample
project(w)          // enforce ∇·w = 0 — incompressibility

Adwecja semi-Lagrange'a: wymiana dokładności na stabilność

Zamiast pytać „gdzie się poruszy to zawartość komórki w przyszłości”, adwecja semi-Lagrange'a pyta odwrotnie dla każdej komórki: „od czego pochodzi zawartość tej komórki?”. Tracąc virualną cząsteczkę wstecz przez bieżący pol pole prędkości o jedną krok czasowy, a następnie czytając wartość poprzedniego ramek za pomocą interpolacji dwuliniowej:

dla każdej komórki x: x0 = x - dt * prędkość(x) // tracimy wstecz o jeden krok czasowy q(x) = interpolacjaDwuliniowa(q_poprzednia, x0) // czytamy wartość pola poprzedniego ramka tam Ponieważ aktualizacja nie jest niczym innym jak próbkowanie istniejącego pola, nie może rozszerzać wartości poza to, co już było obecne — brak pętli odwrotności do wzrostu błędu, więc metoda jest bezwarunkowo stabilna niezależnie od wielkości kroku czasowego. Cena za to jest difuzją numeryczną: interpolacja dwuliniowa cichutko średnicą detale na każdym kroku, co powoduje, że symulowane dymy widocznie rozszerzają się i stracają jasne struktury szybciej niż rzeczywiste dymy.

for each cell x:
  x0    = x - dt * velocity(x)        // trace backward one time step
  q(x)  = bilinearSample(q_prev, x0)  // read the previous field there

Krok projektowy: sprawdzenie niewsporniczości

Decompozycja Helmholtza-Hodge mówi, że dowolny pole wektorowe można podzielić na część bezdivergencji i gradient skalarnego pola. Krok projektowy wykorzystuje to bezpośrednio: rozwiązuje równanie Poissona dla pola napięcia skalarnego, a następnie odejmuje gradient tego napięcia z pola prędkości, pozostawiając rezultat o zerowej divergencji — dyskretny odpowiednik „nie jest stworzony ani nie zniszczony żaden płyn w dowolnym punkcie.”

∇²p = ∇·w // Równanie Poissona dla napięcia w = w - ∇p // odejmowanie gradientu napięcia → pole prędkości bezdivergencji Równanie Poissona jest rozwiązywane iteracyjnie na siatce — standardowe metody to relaksacja Gauss-Seidel lub Jacobi — zwykle wystarcza 20 do 40 iteracji, aby uzyskać płyn o wyglądzie niezawodnym i niewspornicznym przy interaktywnych klatkach.

∇²p = ∇·w        // Poisson equation for pressure
w   = w - ∇p     // subtract the pressure gradient → divergence-free velocity

Zapewnienie powrotu krzywizny: ograniczanie wortoncji

Jedynym rzeczywistym kosztem tego stabilnego schematu dyfuzyjnego jest to, że miękkie wirujące vorteksy, które rozwija prawdziwy dym, są zmywane przez powtarzane interpolacje, co pozostawia wynik wyglądający płasko i mokreamiączysto zamiast turbulenty. Technika ograniczania wortoncji Fedkiwa, Stam'a i Jensen'a z 2001 roku pomiarów lokalnej krzywizny pola prędkości, a następnie dodawania małej sztucznej siły, która przyciąga płyn do regionów o wyższej wartości wortoncji — świadomie ponownie wprowadzając energetykę rotacyjną, którą schemat numeryczny zawsze rozprasza, bez potrzeby używania znacznie finałnej, znacznie droższej siatki.

ω      = ∇ × w                       // vorticity — the curl of velocity
N      = ∇|ω| / |∇|ω||               // normalised gradient of vorticity magnitude
f_conf = ε * (N × ω)                 // confinement force added back into w

Dlaczego ta metoda nadal dominuje w VFX rzeczywistych czasu

Niewzruszona stabilność dla dużych kroków czasowych na grile o niskiej rozdzielczości jest dokładnie tym, co umożliwia interaktywne dym i ogień w gry i demo przeglądarki przy 60 ramek na sekundę. Produkcja filmowa offline, używająca solverów bazujących na cząsteczkach lub Houdini FLIP, działa z znacznie wyższą rozdzielczością oraz bardziej fizycznie akuratymi schematami, ponieważ nie ma ograniczeń czasu rzeczywistego do przestrzegania. Ale ta sama podstawowa recepta — adwersja semi-Lagrangowska, krok projektowania nacisku i ograniczanie wariacji prędkości rotacyjnej do odzyskania straconych obrotów — na wyższej rozdzielczości oraz z większą liczbą podkroków nadal służy jako podstawa większości solverów GPU dymu i ognia używanych w produkcji, ponad dwadzieścia lata po oryginalnym pracowniku Stam'a.

Często zadawane pytania

Dlaczego semi-Lagrangowska adwecja jest niezależnie od warunków stabilności?

Zawsze integruje równanie z przodu, które może wybuchnąć. Zamiast tego, cofa się wstecz przez pole prędkości i interpoluje wartości poprzedniej ramki na tym punkcie — a interpolacja tylko średniczy istniejące wartości, nigdy ich nie pogłębia, niezależnie od wielkości kroku czasowego.

Dlaczego symulowana dym jest mniej ostrejsza niż rzeczywisty dym?

Każde semi-Lagrangowskie krok ponownie próbuje pole z interpolacją dwuwymiarową, która łagodzi detale na małą ilość każdego ramek — efekt numeryczny nazywany sztucznej difuzji. Ograniczanie vortycji wraca niektóre z utraconych obrotów do tego, ale tylko częściowo kompensuje łagodzenie.

Co właściwie sprawia krok projektowy?

Niekompresybilność. Rozwiązuje on równanie Poissona dla pola skalarnego napięcia i odjemie jego gradient od pola prędkości, pozostawiając wynik z zerowym rozbieżnością — pasując do fizycznego faktu, że gaz lub płyn nie lokalnie kompresuje się ani nie rozszerza się pod normalnymi warunkami symulacji.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Smoke VFX — Stable Fluids i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Smoke VFX — Stable Fluids

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)