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.
quelle
Antworten:
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.
quelle
Wenn Sie ein voxelbasiertes Gelände verwenden, können Sie neben der Speicherung der Bodendichte pro Voxel auch einen Wasserwert speichern, der zwischen
0
und eingeklemmt ist1 - 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:groundDensity + waterDensity
haben wie seine NachbarnDer 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.
quelle