Fachbeitrag «3D-Liquid»

Liquidsimulation in der 3D-Animations-SW Maya mit Bitfröst

Flüssigkeiten am Computer berechnen

Maya bietet ab Version 2015 Flüssigkeitssimulationen mit Bifröst an.

Bifröst ist ein prozedureales Framework für Wassersimulationen und benutzt einen FLIP-Solver  (Fluid Implicit Particle) Solver. Man stösst eine Flüssigkeit aus einem Emitter aus und lässt eine Gravität auf sie einwirken. Man kann sie auch mit Kollisionsobjekten interagieren lassen, welche den Fluss dirigieren oder Spritzer erzeugen. Auch ist denkbar mittels Kräfteeinwirkung z.B. eine Fontänen zu erzeugen.

Eine Bifröst Simulation besteht aus drei Bistfröst-Objekten:

  • Bifrost Object: Enthält  einen «BifrostShape Node» welcher die von Bifröst generierten Daten repräsentiert. Das Objekt ist über die Bounding Box im Viewport selektierbar. Man kann das Aussehen im Viewport kontrollieren und dort direkt rendern. Ein Bewegen dieses Objekts  hat keinen Einfluss, weil alle Berechnungen im World Space durchgeführt werden.
  • BifrostLiquid Object: Enthält den «BifrostLiquidContainer Node». Dieser enthält die Global Controls der Simulation wie Voxel Resolution und Gravity Vector. Er ist im Viewport als kleines Icon sichtbar. Wie beim Bifrost Object hat ein Verschieben dieses Objekts keine Auswirkungen.
  • BifrostMesh Object: Repräsentiert das Polygon-Mesh zum rendern. Solange man diese Option im Bifrost-Objekt nicht aktiviert, gibt es kein Polygon-Meshobjekt. Einmal erzeugt kann es wie normale Polygonobjekte verschoben und bearbeitet werden.

Zusätzlich zu den Bifröst Objekten kann es verschiedene weitere Meshes geben, welche in die Simulation einbezogen werden können wie z.B. Emitters, Colliders usw.
Fügt man eine solche Mesh zur Simulation hinzu, wird eine Bifrost Section zur Shape-Node hinzugefügt, wo man die entsprechen Attribute ändern kann um Effekte zu kontrollieren.

Die zwei Cache-Typen:

  • Den temporären Scratch Cache für schnellen Playback und Scrubbing in einer tiefen Auflösung. (High Master Voxel Size).
    Der Scratch-Cache wird ad-hoc erzeugt und wird bei Änderungen oder Rückkehr zum Startframe neu berechnet. Die Simulation wird temporär gespeichert und so viel wie möglich werden Frames im Arbeitsspeicher gehalten. Beim Schliessen der Szene wird der temoräre Speicher gelöscht. Siehe auch «Preview a Bifröst Simulation».
  • Im User Cache speichert man die definitive hochaufgelöste Simulation. Die Daten werden vom Disk gelesen und müssen nicht jedesmal neu berechnet werden. (Low Master Voxel Size) Der Speicherort befindet sich im Projekt-Unterordner cache/bifrost. Siehe auch «Work with Bifröst user caches».

Bifröst Computation Server:

Obwohl die Bifröst Effekte direkt in Maya erstellt werden, wird die Simulation ausserhalb Maya auf einem Bifröst Computation Server berechnet. Maya ist damit von dieser Rechenbelastung befreit.

Der Workflow:

Im Viewport sollte als Renderer «Viewport 2.0» gewählt werden. Ausserdem muss in den Settings der Playbackspeed auf «Play every frame» gestellt sein.

  • Schritt 1: Die Szene muss richtig aufgesetzt werden, bevor der Simulationsprozess gestartet wird. Das heisst: Alle Objekte wie z.B. der Wasserausfluss sind mit Keyframes animiert worden. Auch der Masstab der Szene muss stimmen. Bifröst rechnet immer im Metermassstab! Z.B. ein Würfel mit 100 Units Höhe und Mayaeinstellung in Zentimeter wird Bifröst als 100 Meter hohes Objekt betrachten und die Simulation wird nicht wie gewünscht aussehen.
  • Schritt 2: Zuerst wird ein Emitter-Objekt kreiert, indem wir z.B. einen Polygonzylinder erstellen und ihn über einem Wasserauffangbecken (z.B. Polygonmodell eines Wasserglas etc.) so platzieren, dass er kein Objekt berührt. Mit selektiertem Emitter-Polygonobjekt wählen wir im Bifröstmenü «Create Liquid». Dabei werden alle benötigten Bifröst-Objekte erstellt wie «BifrostLiquid1», «Liquid1» und «BifrostLiquid1Mesh». Gleichzeitig hat die Shape-Node des Emitter-Polygonobjekts unter der Sektion Bifröst weitere Controls erhalten. Tatsächlich erhalten alle Objekte die als Emitter, Collider und Accelerator verwendet werden diese Bifröst-Sektion mit den zusätzlichen Controls.
    Es können übrigens mehrere Polygonmodelle als Emitter selektiert und somit in die Simulation einbezogen werden.
  • Schritt 3: Wenn wir im Outliner «Liquid1» selektieren und Playback drücken, sehen wir in der Timeline einen wachsenden gelben Balken, gefolgt von einem grünen, der anzeigt, wie weit die Simulation bereits fortgeschritten bzw. berechnet ist. Ausserdem sollte man nun auch die aus dem Emitterobjekt fallenden Wasserpartikel sehen. Allerdings durchdringen diese noch das Wassergefäss. Das ändern wir nun, indem wir das Wassergefäss in ein Kollisionsobjekt verwandeln. Dazu selektieren wir das «BifrostLiquid1-Objekt» und shift-selektieren anschliessend das Wassergefäss. Wir schliessen den Vorgang ab, indem wir im Bifröstmenü «Add Collider» wählen. Wenn wir den Playback wiederholen, wird das Wassergefäss die Wasserpartikel nun auffangen. Dieser Vorgang kann für das Hinzufügen von weitere Kollisionsobjekten wiederholt werden.
  • Schritt 4: Um die Simulation zu verfeinern, müssen wir die «Master Voxel Size» anpassen. Diesen Parameter findet man ganz oben im «BifrostLiquidContainer1» von  «BifrostLiquid1». Damit bestimmt man die Grösse der Voxels und zwar im Metermassstab! Liegen die Objekte einer Szene z.B. im Zentimeterbereich vor, setzen wir die Voxelgrösse auf 0.005. Das bedeutet, dass ein Voxel eine Grösse von 5 cm hat. Damit erhöht sich aber auch die Berechnungszeit der Simulation. Ebenfalls kann man die «Transport Time Scale» auf 0.75 reduzieren, um ein realistischeres Aussehen zu erhalten.
  • Schritt 5: Wenn die Simulation befriedigt, kann sie nun in einen Cache gespeichert werden «Bake out», um beim anschliessenden Rendern CPU-Ressourcen zu sparen. Dazu muss man mit selektiertem BiFrostLiquid1-Objekt im Bifröstmenu «Bifrost Compute And Cache Options» wählen, den Zielordner bestimmen und mit «Create» den Vorgang abschliessen. Danach wird im gewählten Ordner eine Filesequenz mit den Simulationsdaten erstellt. Nachdem der Cache erstellt wurde, soll in «Bifrost1» unter der «Caching Sektion» die Option «Enable Disk Cache» gewählt werden.
  • Schritt 6: Um der Simulation eine Mesh zuzuweisen, wähle man das «Bifrost1 Objekt» aus und aktiviere die  «Bifrost Meshing Option». Nun sollte man als Flüssigkeit eine Mesh sehen, die man in den Mesh-Settings noch anpassen kann. Danach muss das «BifrostLiquid1 Objekt» versteckt (hidden) werden. Die Mesh bleibt dabei sichtbar. Man sieht nun das «BifrostLiquid1Mesh Objekt» inkl. Texturmaterial. In «BifrostLiquidMaterial1 Tab» können die Materialeigenschaften angepasst werden. Wenn die Simulation langsam sein sollte, kann man versuchen, die «Foam Remap Controls» zu deaktivieren.

Hinweis zu «Bifröst-Emitter»:

Anders als bei partikelbasierten Flüssigkeitssimulationen gibt es bei diesen Emittern keine Emissionsrate. Die Anzahl vom Emitter ausgestossenen Teilchen basieren auf der Geschwindigkeit eines Voxel-Feldes welches von verschiedenen Faktoren abhängt, wie Gravität, Druck, Temperatur, Beschleunigungskräfte und andere Flüssigkeiten.

Wie man die Auflösung und Genauigkeit einer Bifröst-Simulation beeinflusst:

  • «Master Voxel Size» des «BifrostLiquidContainer-Nodes»: Globale Anpasung der Auflösung und Genauigkeit in «World Space Units». Der geeignete Wert hängt damit vom Massstab der Szene ab. Kleinere Werte habe eine bessere Auflösung und Genauigkeit zur Folge, beanspruchen aber mehr Arbeitsspeicher und Prozessorleistung. Faustregel: Hohe Werte beim Bearbeiten der Szene und tiefe für das finale Rendering. Für eine akurate Berechnung sollte die «Master Voxel Size» kleiner sein, als das kleinste in der Fluidszene relevante Objekt. Will man eine Flüssigkeit durch ein 0.2 Unit Loch fliessen lassen, muss eine «Master Voxel Size» von 0.1 oder kleiner gewählt werden.
  • Voxelization: Jeder Emitter, Collider, und Accelerator hat dafür eine «Conversion Attribute» Sektion. Um gute Resultate zu erhalten, sollte bei Flächen und dünne Objekten «Mode» auf «Shell» und Thickness, bzw. «Falloff Bandwidth» bei Acceleratoren, auf 1.0 oder mehr gesetzt werden. Um Simulationsfehlern bei Löchern in Colliders entgegenzuwirken soll dieser Wert sogar noch mehr erhöht werden. Im Gegensatz dazu sollte bei massiven Gegenständen «Mode« auf «Solid» und «Thickness» oder «Falloff Bandwidth» auf 0.0 belasssen werden oder sogar negative Werte aufweisen.
  • Collision und Acceleration Voxel Scale: Das «Voxel Scale» Attribut in der «Collision» und «Acceleration» Sektion des BifrostLiquidContainers bietet zusätzlichen Einfluss auf die «Voxelization» der Colliders und Accelerators. Sie wirken dabei als Vervielfacher der «Master Voxel Size». Werte grösser 1 erzeugen gröbere Voxels und somit ungenauere Kollisionen, reduzieren dabei aber die Rechenlast. Werte zwischen 0.0 und 1.0 produzieren feinere Voxels. Dieses Attribut kann bei der Erzeugung von engen Durchgängen und Fontänen hilfreich sein, wenn man die globale Auslösung bzw. «Master Voxel Size» unter keinen Umständen anrühren möchte.
  • Transport Steps: Bei Volumenverlust, ungewolltem Partikelverhalten oder Leck in einem Kollisionsobjekt kann man versuchen, das «Transport Step» Attribut bei «Transport» des «BifrostLiquidContainers» zu ändern. Eine Erhöhung der «Transport Step Adaptivity» bewirkt eine höhere Auflösung der Partikelgeschwindigkeit und somit eine genauere Simulation, hat aber auch eine erhöhte Belastung des Rechners zur Folge. Für Probleme bei sehr schnellen Bewegungen wird ebenfalls eine Erhöhung des «Max Transport Steps» empfohlen.
  • Particle Distribution: Diese Werte im «BifrostLiquidContainer» beeinflussen die Anzahl Partikel pro Voxel auf der Oberfläche und innerhalb der Flüssigkeit, so wie auch die Tiefe derselben. Generell gilt: Mehr Partikel haben eine höhere Detailierung zur Folge und benötigen mehr Rechenleistung. Typischerweise werden an der Oberfläche mehr Partikel benötigt als darunter.
  • Time Steps: Bei Problemen wie Volumenverlust oder schnell bewegenden Kollisionsobjekten kann man mit den Umgebungsvariablen IFROST_GRAPH_STEP_ADAPTIVITY, BIFROST_GRAPH_STEP_MAX, and BIFROST_GRAPH_STEP_MIN «Time-Stepping» aktivieren. Siehe auch «Bifröst Environment Variables».