2 Punkte von GN⁺ 2025-02-08 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2025-02-08
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.

    • Prozedurale Generierung eignet sich für Parallelisierung, aber in unendlichen Domänen ist sie schwierig.
    • Es wird darauf hingewiesen, dass dieses Thema bisher nicht viel untersucht wurde.
    • Nick McDs Arbeit wird gelobt, wobei erwähnt wird, dass auch seine Arbeit aufgrund des Simulationsdesigns Einschränkungen bei der Domäne hat.
    • Es wird vorgeschlagen, die Grenzen von Wassereinzugsgebieten prozedural zu erzeugen, um Parallelisierung zu ermöglichen und das gesamte Wassereinzugsgebiet auf einmal zu simulieren.
  • 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 die eigene Erfahrung mit einer GPU-basierten Fluiddynamik-Implementierung aus dem Jahr 2011 geteilt.
    • Es wird erklärt, dass das Fluid (Blut) in 2D auf einer Oberfläche (Gewebe) simuliert und unter Berücksichtigung von Schwerkraft und Oberflächenneigung auf ein Mesh projiziert wurde.
  • Es wird erwähnt, dass die Methode der Ressourcensammlung in Animal Crossing ohne Terrain-Manipulation effizient ist.

    • Man fällt Bäume, um Holzstämme zu erhalten, aber nach einer bestimmten Menge ist eine Abklingzeit nötig.
    • Es wird vorgeschlagen, dass diese Methode für Spiele ohne Terrain-Manipulation besser sein könnte.
  • Das Spiel Timberborn wird empfohlen, wobei erwähnt wird, dass seine Physik ein wichtiger Bestandteil des Spiels ist.

    • Herauszufinden, wie man Wasser aufstaut und für Maschinen und Felder nutzt, ist ein wesentlicher Teil des Gameplays.
  • Es wird die Erfahrung geteilt, den in 3D implementierten Algorithmus mit o3-mini-high ausprobiert zu haben.

    • Es wird erwähnt, dass Perlin noise von Grund auf implementiert und zur Geländegenerierung verwendet wurde.
  • Es wird eine pädagogische Hochwasser-Simulation vorgestellt, die mit WebGL Zellwerte auf Basis benachbarter Zellen berechnet.

    • Es wird erklärt, dass man durch Änderungen der Modellwerte große Effekte sehen kann.
  • Es wird vorgeschlagen, das Problem fehlender Trägheit und Geschwindigkeitsdiffusion in der Wasser-Simulation zu lösen.

    • Es wird erklärt, dass sich dies beheben lässt, indem die Werte der Flusspfeile mit den benachbarten Pfeilen gemittelt werden.
  • Es wird die Neugier auf eine Erosionssimulation geteilt, die als persönliches Projekt begonnen wurde.

    • Es wird erwähnt, dass das Projekt gestoppt wurde, weil Erosion nicht verstanden wurde.
  • Es wird die Idee erwähnt, im Spiel Creeper World Wasser zu simulieren und anschließend Bomben abzuwerfen.