output2.mp4
beams.mp4
A projekt egy 2D folyadék-szimulációs alkalmazás, amely Jos Stam Real-Time Fluid Dynamics for Games c. papírján alapszik. A felhasználó képes módosítani a szimuláció fizikai paramétereit, interakcióba lépni a folyadékkal, valamint elmenteni és betölteni a konfigurációkat, illetve objektumokat.
Két ablak van:
Egy vertikáis swing panel, amelyen a beállítások vannak.
Egy OpenGL ablak, amelyen szimuláció vizualizálva van. Két vizualizációs beállítás van: sűrűség, és áramlássebesség. Ezen felül bekapcsolhatóak kis erővektorok négyzetrácsa, amely szemlélteti a folyadékra ható erők irányát.
A felhasználónak lehetősége van folyamokat csinálni az egér segítségével a vásznon. Az interakció a kurzor körül egy felhasználó által megadott sugárban elhelyezkedő cellákra vonatkozik.
Erő hozzáadása a bal oldal egérgomb lenyomásával és az egér húzásával elérhető. Az erő egybeesik a kurzor mozgásának irányával, nagysága pedig arányos annak sebességével.
Folyadék hozzáadása a mindeközbeni shift gomb lenyomásával lehetséges.
Folyadék elvonása a mindeközbeni ctrl gomb lenyomásával lehetséges.
Lehetőség van a felhasználó által módosítható paraméterek mentésére és betöltésére. Ezen felül léteznek felhasználó által nem módosítható paraméterek is, amelyek indításkor kerülnek beolvasásra - ez egy XML konfigurációs fájl, amelyet az első command line argument-nek lehet megadni.
Mentés
A felhasználó a File > Save config menüből kiválaszthat egy célfájlt. Egy konfigurációs fájl így néz ki:
<?xml version="1.0" encoding="UTF-8"?><SimParams>
<simulation>
<iterations>26</iterations>
<viscosity>0.0043</viscosity>
<diffusion>0.0256</diffusion>
<vorticity>24.8</vorticity>
<dissipation>0.9944</dissipation>
<interactionRadius>200.0</interactionRadius>
<velocityView>true</velocityView>
<showArrows>true</showArrows>
</simulation>
<grid>
<width>1500</width>
<height>1000</height>
</grid>
<arrow density="0.1" maxLength="5.0" headLength="2.0" headAngle="22.5" velocityScale="2.0" colorR="255" colorG="255" colorB="255" colorA="255"/>
<nozzles>
<nozzle side="LEFT" position="0.5" radius="20.0" length="100.0" directionDegrees="0.0" forceMagnitude="200000.0" density="250.0"/>
<nozzle side="RIGHT" position="0.5" radius="20.0" length="100.0" directionDegrees="-179.99999499104396" forceMagnitude="200000.0" density="250.0"/>
</nozzles>
</SimParams>A simulation tagek között elhelyezkedő elemek a felhasználó által frissíthető paraméterek, minden más nem.
Betöltés
A felhasználó egy menüből (pl. File > Load config...) kiválaszthat egy létező .xml konfigurációs fájlt.
Az alkalmazás beolvassa az XML-t, és frissíti a szimuláció paramétereit
iterations: float: diffegyenlet solver iterációinak száma (több = pontosabb eredmény, rosszabb teljesítmény)viscosity: float: folyadék belső ellenállásadiffusion: float: diffúziós paramétervorticity: float: turbulencia együtthatódissipation: float: milyen gyorsan tűnik el a sűrűséginteractionRadius: float: hány pixeles környezetben érintettek a cellák a kurzor körülvelocityView: bool: sebességvektorok nagyságának kijelzése (sűrűség helyett)showArrows: bool: erővektorok megjelenítése
grid:
width: int: ablak (és szimuláció) szélességeheight: int: ablak (és szimuláció) magassága
arrows:
density: float: a szélesség/magasság hányadrészén van nyílmaxLength: float: nyíl maximális hossza pixelekbenheadLength: float: nyíl fejének hosszaheadAngle: float: nyíl feje és teste között bezárt szögcolorR: int,colorG: int,colorB: int,colorA: int: nyilak RGBA színe
nozzles: befúvók listája
nozzle:
side: LEFT|RIGHT|TOP|BOTTOM: melyik falon helyezkedik elposition: float: a fal hanyadrészén van (pl. 0.5 -> fele)radius: float: interakció sugaralength: float: gyorsítás hosszadirectionDegrees: float: irány (fokokban)forceMagnitude: float: erő mértékedensity: float: kibocsátott sűrűség mértéke
A felhasználó be tud tölteni egy "falnak" szolgáló entitást az Objects > Load object... menüben. A formátum egy egyszerű PNG képfájl, amelynek méretei megegyeznek az ablak méreteivel, a fehér pixelek falnak számítanak, a feketék pedig nem.
A szimuláció a Navier–Stokes egyenleteket oldja meg.
Ahol:
-
$a$ az áramlás iránya és gyorsulása egy adott pontban -
$\nabla p$ a nyomás iránya és mennyiség mértékének változása (gradiens) -
$\rho$ a folyadék sűrűsége -
$F_\text{external}$ külső erők -
$v$ viszkozitás, folyadék belső ellenállása -
$u$ sebesség eltérése az átlagtól egy adott pontban (Laplacian)
Az algoritmus minden időlépésben a következő lépéseket hajtja végre:
-
Erők hozzáadása: külső erők (pl. felhasználói interakció) hozzáadása a sebességmezőhöz.
-
Advekció (advection): a folyadék "mozgatja saját magát". A rendszer kiszámítja, hogy a sebesség és a sűrűség hogyan szállítódik az áramlással.
-
Diffúzió (diffusion): a viszkozitás (sebességnél) vagy a diffúziós ráta (sűrűségnél) hatásának szimulálása. Ez a lépés "simítja" a mezőket, ahogy a folyadék belső súrlódása hat.
-
Nyomás korrekció (projection): a folyadék "összenyomhatatlanságának" biztosítása. Kiszámítja a nyomást, és korrigálja a sebességeket.
-
Vorticity confinement: a "swirl" effektus előállításáért felelős lépés.