Das Problem mit Wasser
- In den meisten Spielen lässt sich das Gelände nicht verändern, und das ist vernünftig. Nicht jedes Spiel braucht das.
- In Spielen mit Wasser muss man überlegen, wie der Wasserfluss behandelt werden soll.
- Bestehende einfache Modelle sind nicht zufriedenstellend, und es braucht Forschung, um ein besseres Modell zu finden.
Voraussetzungen
- Die Simulation sollte auf einem Grid laufen, und idealerweise dasselbe Grid wie das Gelände verwenden.
- Die durchschnittliche Skalierung der Simulation sollte etwa 1 Meter betragen.
- Wasser kann als Höhenfeld über dem Gelände angenommen werden und fließt nicht vertikal.
- Wasser muss fließen können und darf nicht durch Simulationsfehler auf magische Weise verschwinden.
- Die Simulation sollte kontrollierbar stabil sein und schnell laufen.
Keine Lösungen
- Smoothed Particle Hydrodynamics liefert sehr beeindruckende Ergebnisse, löst aber ein anderes Problem.
- Jos Stams Stable Fluids behandelt das gesamte Flüssigkeitsvolumen und ist nicht schnell.
Flachwassergleichungen
- Die Flachwassergleichungen mitteln über die vertikale Richtung und lassen 2D-Gleichungen übrig.
- Der „flache“ Teil setzt voraus, dass die typische vertikale Größe der Wassersäule viel kleiner ist als die horizontale Ausdehnung.
Grid
- In der Fluiddynamik ist das Grid wichtig, und üblicherweise werden staggered grids verwendet.
- Staggered grids speichern Wasserhöhe/Dichte usw. in quadratischen Zellen, während Geschwindigkeiten an den Kanten zwischen den Zellen gespeichert werden.
Methode mit virtuellen Rohren
- Der Wasserfluss wird simuliert, indem angenommen wird, dass Wasserzellen durch virtuelle Rohre verbunden sind.
- Sie besteht aus drei Schritten: Beschleunigung des Flusses, Skalierung des Ausflusses und Aktualisierung der Wassersäule.
Beschleunigung des Flusses
- Der Fluss wird entsprechend dem Unterschied der Wasserhöhe zwischen benachbarten Wasserzellen beschleunigt.
- Reibung wird hinzugefügt, damit die Simulation gegen einen stabilen Zustand konvergiert.
Aktualisierung der Wassersäule
- Für jede Wasserzelle wird je nach benachbarten Flüssen Wasser hinzugefügt oder entfernt.
Skalierung des Ausflusses
- Ausströmende Flüsse werden angepasst, damit die Wassermenge in einer Zelle nicht negativ wird.
Geländehöhe
- Die Geländehöhe wird hinzugefügt, damit sich Wasser über das Gelände bewegt.
Randbedingungen
- Es muss berücksichtigt werden, was an den Grenzen der Simulation passiert.
- Durch das Setzen von Randflusswerten werden Bedingungen wie Wände, Zufluss oder Abfluss definiert.
Viskosität
- Viskosität wird hinzugefügt, damit sich dünne Wasserschichten schwerer bewegen.
Gesamter Simulationscode
- Der Simulationscode besteht aus vier
for-Schleifen über einige 2D-Arrays.
Nachteile des Modells
- Es gibt weder Trägheit noch Geschwindigkeitsdiffusion; wenn schnell fließendes Wasser in einen See eintritt, breitet es sich in alle Richtungen aus.
Bonus: hexagonale/trianguläre Grids
- Wasser kann mit einem triangulären Grid simuliert werden, das sich als Dual eines hexagonalen Grids auffassen lässt.
1 Kommentare
Hacker-News-Kommentare
Es wird das Problem in der Fluid-Simulation erwähnt, dass sich Wasser ansammelt und benachbarte Zellen beeinflusst. Das ist einer der Gründe, warum Parallelisierung in prozedural generierten Spielen schwierig ist.
Es wird erwähnt, dass bei der Entwicklung von Fluid-Simulationen ein großes Risiko besteht, Zeit damit zu verschwenden, sich schöne Ergebnisse anzusehen.
Es wird erwähnt, dass die Methode der Ressourcensammlung in Animal Crossing ohne Terrain-Manipulation effizient ist.
Das Spiel Timberborn wird empfohlen, wobei erwähnt wird, dass seine Physik ein wichtiger Bestandteil des Spiels ist.
Es wird die Erfahrung geteilt, den in 3D implementierten Algorithmus mit o3-mini-high ausprobiert zu haben.
Es wird eine pädagogische Hochwasser-Simulation vorgestellt, die mit WebGL Zellwerte auf Basis benachbarter Zellen berechnet.
Es wird vorgeschlagen, das Problem fehlender Trägheit und Geschwindigkeitsdiffusion in der Wasser-Simulation zu lösen.
Es wird die Neugier auf eine Erosionssimulation geteilt, die als persönliches Projekt begonnen wurde.
Es wird die Idee erwähnt, im Spiel Creeper World Wasser zu simulieren und anschließend Bomben abzuwerfen.