Skip to content

danipatko/fluidsim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

45 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fluidsim

output2.mp4
beams.mp4

Leírás

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.

Használat & kezelés

Két ablak van:

Sidebar

Egy vertikáis swing panel, amelyen a beállítások vannak.

Vizualizáció:

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.

Interakció

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.

Mentés és betöltés

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


Szimuláció paraméterei

  • 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ása
  • diffusion: float: diffúziós paraméter
  • vorticity: float: turbulencia együttható
  • dissipation: float: milyen gyorsan tűnik el a sűrűség
  • interactionRadius: float: hány pixeles környezetben érintettek a cellák a kurzor körül
  • velocityView: 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ége
  • height: int: ablak (és szimuláció) magassága

arrows:

  • density: float: a szélesség/magasság hányadrészén van nyíl
  • maxLength: float: nyíl maximális hossza pixelekben
  • headLength: float: nyíl fejének hossza
  • headAngle: float: nyíl feje és teste között bezárt szög
  • colorR: 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 el
  • position: float: a fal hanyadrészén van (pl. 0.5 -> fele)
  • radius: float: interakció sugara
  • length: float: gyorsítás hossza
  • directionDegrees: float: irány (fokokban)
  • forceMagnitude: float: erő mértéke
  • density: float: kibocsátott sűrűség mértéke

Objektumok betöltése

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.

Algoritmus Leírása (Navier-Stokes)

A szimuláció a Navier–Stokes egyenleteket oldja meg.

$$ a = \dfrac{-\nabla p}{\rho} + \dfrac{F_\text{external}}{\rho} + v \cdot \nabla^2 u $$

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:

  1. Erők hozzáadása: külső erők (pl. felhasználói interakció) hozzáadása a sebességmezőhöz.

  2. 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.

  3. 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.

  4. 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.

  5. Vorticity confinement: a "swirl" effektus előállításáért felelős lépés.

About

third semester project

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors