2D-Regenerzeugung (und Fluiddynamik)

11

Ich experimentiere mit den Wetterbedingungen in einem meiner Spiele und war beeindruckt von der Art und Weise, wie Starbound mit dem Regen umging. Wenn Regen auf den Boden trifft, verteilt er sich entweder horizontal (und wird vom Boden absorbiert) oder es entstehen Wasserhaufen (wenn Regentropfen in einem Loch im Boden landen).

Dieses Video zeigt dies deutlich: http://imgur.com/gallery/CKCGKbG

Ich weiß, wie man Regen fallen lässt und prüft, wo er auf den Boden trifft, aber dort stecke ich fest. Meine Frage ist: Wie konnte das geschaffen werden? Und wie könnte man den Wasserfluss so perfekt modellieren, ohne die Leistung zu beeinträchtigen?

Danke im Voraus!

Pandaqi
quelle
1
Der Schlüssel ist das fluiddynamische System. Ich vermute, dass ein Regentropfen, wenn er auf den Boden trifft, an dieser Stelle eine kleine Menge Wasser erzeugt, das dann wie gewohnt vom fluiddynamischen System verarbeitet wird. Auf ebenen Flächen wird der Verdunstung entgegengewirkt. Wenn sich jedoch an Hängen Wasser in einem Bereich konzentriert, ist der Zustrom stärker als die Verdunstung und es bilden sich Pfützen.
Philipp

Antworten:

9

Das Wassersystem von Starbound besteht eigentlich aus 2D-Kachel-basierten Zellularautomaten. Jede Kachel auf dem Bildschirm, die keine vordere Kachelschicht enthält, kann Wasser aufnehmen. Die Wassermenge wird über zelluläre Automaten berechnet.

Weitere Informationen zu dieser Technik finden Sie hier:

http://www.gamasutra.com/view/feature/134736/an_intro_to_cellular_automation.php

http://www.jgallant.com/2d-liquid-simulator-with-cellular-automaton-in-unity/

Die Regentropfen sind Partikel. Sie dienen hauptsächlich dazu, vorzutäuschen, dass tatsächlich Wasser vom Himmel fällt. Das Wasser sammelt sich nur an, weil das Spiel weiß, dass es gerade regnet. Die einzelnen Tropfen haben nichts mit der tatsächlichen Bildung der Wasserbecken zu tun.

Die Art und Weise, wie sie es ansammeln, besteht darin, zu bestimmen, wo sich Löcher in der obersten Schicht des Bodens befinden. Wenn es einen Bereich gibt, in dem sich Wasser ansammeln kann, erhöhen die Zellen in diesem Bereich ihren Wasserstand entsprechend.

Starbound befasst sich auch mit dem Wasserdruck und ihre Rendering-Technik ist ziemlich erstaunlich. Sie haben die beste 2D-Implementierung der Wassersimulationsphysik unter Verwendung von Zellularautomaten, die ich je gesehen habe.

Hier ist eine primitive Ansicht einer Flüssigphysik-Engine unter Verwendung der oben erwähnten zellularen Automatentechnik. Der Rendering-Teil wird etwas komplexer, da Ihr Wasser durch einen numerischen Wert dargestellt wird.

http://www.jgallant.com/images/pressuretest.gif

In diesem Beispiel besteht eine sehr einfache Verbesserung darin, Wasserzellen mit weniger als 1 vollen Wassereinheit in der Kachel auszublenden, wenn sich keine feste Kachel darunter befindet. Aber dann versteckst du den Wasserfluss. Anstatt es zu verstecken, müssten Sie bestimmen, wie das Wasser fließt, und dann das entsprechende Wassersprite an seine Stelle ziehen.

jgallant
quelle
2
Um die Tatsache zu ergänzen, dass die Regentropfenpartikel den Wasserabfalleffekt vortäuschen: Die kleinen Tropfenspritzer auf der Oberfläche hängen auch nicht mit den tatsächlichen Regenpartikeln zusammen, sondern mit einem separaten Effekt. Die Kombination lässt es so aussehen, als ob die Tröpfchen die Spritzer machen.
Felsir
Wow, genau das habe ich gesucht. Ich dachte, ich müsste auf ein übermäßig komplexes Fluidsystem zurückgreifen, das auf Partikeln basiert, aber Gittersysteme scheinen genauso gut zu funktionieren. Um den Wasserdruck zu erhöhen, benötigen Sie vermutlich nur ein zweites Array, das Druckwerte speichert und von Hochdruck- zu Niederdruckstellen fließt. Wenn ja, sollte das für den Computer immer noch nicht zu schwer sein.
Pandaqi
Nein, alles, was Sie mit Druck tun müssen, ist eine Regel hinzuzufügen, z. B. dass eine Fliese mehr als eine volle Flüssigkeitseinheit enthalten darf. Wenn diese Fliese mehr als 1 volle Flüssigkeitseinheit enthält und nicht gemäß den normalen Regeln fließen kann, lassen Sie sie nach oben fließen. Stellen Sie dies so ein, dass mehr Wasser fließen kann, basierend auf dem Druckwert dieser Fliese.
Jgallant
3

Es gibt eine Reihe von Möglichkeiten, dies zu erreichen. Wie immer kommt es darauf an

Und so denke ich, wäre ein Weg dieser Weg. Bei einem willkürlichen "Eintauchen in den Boden" Überlagern Sie eine "Wasserkiste", die ihn begrenzt. Der Boden und der Wasserkasten werden in Schichten gezeichnet, so dass der Boden zuerst und der Wasserkasten danach angezeigt wird.

Jedes Mal, wenn ein Wassertropfen auf den Boden fällt, geben Sie einen in den Wasserkasten. Wenn die Wasserkiste eine magische Zahl erreicht, fügen Sie eine Linie Wasser hinzu. Nehmen wir also an, 10 Tropfen landen im Bad, dies fügt dem Wasserkasten eine Linie hinzu.

Angenommen, die Waterbox hat 32 x 32 Pixel. Fügen Sie eine Linie Aquarell von 0,31 bis 31,31 hinzu. Weitere 10 Tropfen, ziehen Sie eine Linie von 0,30 - 31,30. Wenn sich Tropfen ansammeln, bauen Sie den Wasserkasten von unten auf, bis er voll ist.

Hoffe das macht Sinn.

RobM
quelle