Wie kann ich mit Wasser gefüllte Bereiche definieren?

9

Ich möchte meine kleine Spiel-Engine mit einer gut aussehenden Wassersimulation erweitern. Um daran zu arbeiten, muss ich einen geeigneten Weg finden, um Wasser im Spiel darzustellen. Leider kenne ich nicht viele verschiedene Darstellungen, deshalb werde ich Sie fragen. Es gibt eine ähnliche Frage, die ich vor einiger Zeit gestellt habe. Aber da ich das Thema nicht klar formuliert hatte, ist die Antwort richtig, aber nicht das, wonach ich gesucht habe.

In einigen Spielen wird Wasser nur durch eine Höhenstufe definiert. Zum Beispiel ist alles unter der Höhe von Null unter Wasser. Ich habe diese Darstellung in (meist älteren) Spielen gesehen. Das Problem ist, dass ich Höhlen in der Außenwelt haben möchte, die nicht überflutet sind und unterschiedliche Wasserstände für jeden See und jedes Meer haben.

Eine andere, genauere Darstellung des Auftretens von Wasser sind Partikel. Jeder Wassertropfen wird als Punkt im Weltraum gespeichert. Um sie zu rendern, könnte ich Techniken wie Metabälle verwenden, damit sie ein einzelnes Netz bilden. Diese Darstellung wäre großartig für den Realismus, da ich die Dynamik zwischen ihnen leicht berechnen könnte. Leider konnte keine Maschine in Echtzeit einen Ozean von Metabällen berechnen.

Gibt es andere Möglichkeiten, Wasser in einem Motor darzustellen? Ich hätte gerne dynamische Seen, daher ist es keine Option, die Wasserfläche durch eine statische Geometrie zu definieren. Wenn der Spieler beispielsweise das Gelände ändert, um einen See zu verbreitern, sollte das Wasser diese Bucht füllen und der Gesamtwasserstand dieses Sees sollte leicht abnehmen.

Danijar
quelle
2
Wie ist Ihr Gelände im Motor organisiert? Es gibt verschiedene Techniken für Voxel vs. Heightmap vs. Polysoup (Mesh) Terrain.
Exilyth
Es wird als Netz angegeben und Wasser sollte dieses Geländennetz nicht anders handeln als andere statische Netze.
Danijar
1
handeln oder behandeln?
Tom 'Blue' Piddock
1
Es gibt einige sehr schöne Demos eines solchen Metaball-Ansatzes, aber ich sehe es nicht als brauchbar in einem echten Spiel an, das sich nicht ausschließlich auf die Tatsache konzentriert, dass die Wassersimulation bis zu einem gewissen Punkt physikalisch glaubwürdig ist. Ich sehe keinen Grund gegen nur ein Netz, es sollte auch kein Problem sein, es an die Umgebung anzupassen oder es sogar basierend auf einer physikalischen Simulation zu generieren. Aber das wollen Sie nur, wenn Sie es wirklich brauchen. Als Referenz für eine semi-realistische Wassersimulation möchten Sie möglicherweise "From Dust" aktivieren.
Slin
1
Die Lösung mit variabler Größe betraf das Problem "Ozean der Metabälle". Natürlich gibt es natürlich auch Grenzen für die Größenabweichung in Abhängigkeit vom Volumen, da dies ein Mittel zur Optimierung der Leistung ist, ohne das Wasservolumen zu verändern. Fügen Sie einfach eine besondere Überlegung hinzu, z. B. die Nähe zum Spieler und zur Oberfläche, für Bereiche, die Details benötigen, wie Wasserfälle, Nebenflüsse, Ufer oder Bäche.
Attackfarm

Antworten:

3

Ich kann nicht sagen, was üblicherweise verwendet wird, aber mein erster Gedanke wäre, ein Partikelsystem mit Partikeln unterschiedlicher Größe zu verwenden, die Wasser mit verschiedenen Volumina darstellen. Die Oberseite des Wassers würde kleinere Partikel verwenden, um die Wellen der Oberfläche und der Wellen zu bilden, das Wasser, das dem Spieler am nächsten liegt, würde die kleinsten Partikel verwenden, um Spritzer und kleine Wellen zu simulieren, während die Partikel umso größer sind, je weiter oder tiefer das Wasser ist . Dies würde eine dynamische Anzahl von Partikeln ermöglichen, die Wasser jeder Größe, die Dynamik des sich ändernden Wassers und ein angemessenes und kontrolliertes Leistungsniveau simulieren.

Ich kann Probleme mit dieser Implementierung sehen, aber es scheint sicherlich eine relativ einfache und "gut genug" Lösung zu sein, dass ein Betrachter / Spieler Zweifel daran hat, jemals Abweichungen in der Simulation zu bemerken.

Angriffsfarm
quelle
2

Wenn Sie ein voxelbasiertes Gelände verwenden, können Sie neben der Speicherung der Bodendichte pro Voxel auch einen Wasserwert speichern, der zwischen 0und eingeklemmt ist 1 - groundDensity. Das Wasser zu ziehen wäre so einfach wie ein Marschwürfel über die Wasserwerte laufen zu lassen. Das Wasser zu simulieren wäre etwas schwieriger, aber die Grundvoraussetzung ist, dass Sie das System so lösen möchten, dass:

  1. Unterirdisches Wasser sollte den Rest des Voxels füllen
  2. Wasser auf Oberflächenebene sollte die gleiche Gesamtdichte groundDensity + waterDensityhaben wie seine Nachbarn
  3. Wasser kann in jedes unmittelbar benachbarte und darunter liegende Voxel verdrängt werden, vorausgesetzt, die Gesamtdichte des Nachbarn ist geringer als seine Gesamtdichte

Der ideale Algorithmus würde in einem Compute-Shader ausgeführt, einem Ausführungspfad pro Voxel. Wenn Sie Lust haben, können Sie auch die Geschwindigkeit des Wassers in diesem Voxel speichern, um zusätzliche Simulationseffekte zu erzielen: Versuchen Sie beispielsweise, eine Wassermenge proportional zur Geschwindigkeit auf die Zellen zu verteilen, auf die der Geschwindigkeitsvektor "zeigt". Diese Geschwindigkeitsdaten könnten auch verwendet werden, um die Wellen zu bewegen, Stromschnellen zu zeichnen usw.

jmegaffin
quelle
Leider habe ich kein Voxel-Terrain, wie in den Kommentaren unter der Frage ausgeführt. Danke trotzdem.
Danijar