Tworzenie deszczu 2D (i dynamika płynów)

11

W mojej grze eksperymentuję z warunkami pogodowymi i byłem pod wrażeniem sposobu, w jaki Starbound radził sobie z deszczem. Zasadniczo, gdy deszcz uderza w ziemię, jest albo rozpraszany poziomo (i pochłaniany przez ziemię), albo tworzy stosy wody (gdy krople deszczu lądują w otworze w ziemi).

Ten film wyraźnie to pokazuje: http://imgur.com/gallery/CKCGKbG

Wiem, jak sprawić, by deszcz padał i sprawdził, gdzie uderza w ziemię, ale tam utknąłem. Moje pytanie brzmi: jak można to stworzyć? I jak można modelować przepływ wody tak idealnie, bez niszczenia wydajności?

Z góry dziękuję!

Pandaqi
źródło
1
Kluczem jest system dynamiki płynów. Podejrzewam, że gdy kropla deszczu uderza o ziemię, wytwarza w tej pozycji niewielką ilość wody, która jest następnie przetwarzana przez układ dynamiki płynów jak zwykle. Na płaskich powierzchniach przeciwdziała to parowaniu, ale gdy zbocza powodują koncentrację wody w danym obszarze, napływ jest silniejszy niż parowanie i zaczynają tworzyć się kałuże.
Philipp

Odpowiedzi:

9

System wodny Starbound jest w rzeczywistości automatami komórkowymi opartymi na kafelkach 2D. Każda płytka na ekranie, która nie zawiera przedniej warstwy płytki, może pomieścić wodę. Ilość wody jest obliczana za pomocą automatów komórkowych.

Więcej informacji na temat tej techniki tutaj:

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/

Jeśli chodzi o krople deszczu, są to cząstki. Służą głównie do udawania, że ​​woda spada z nieba. Woda gromadzi się tylko dlatego, że gra wie, że obecnie pada deszcz. Poszczególne krople nie mają nic wspólnego z faktycznym tworzeniem się basenów wodnych.

Sposób, w jaki gromadzą się, polega na określeniu, gdzie są dziury w górnej warstwie ziemi. Jeśli istnieje obszar, w którym może gromadzić się woda, komórki w tym obszarze odpowiednio zwiększają poziom wody.

Starbound zajmuje się również ciśnieniem wody, a ich technika renderowania jest niesamowita. Mają najlepszą implementację 2D fizyki symulacji wody za pomocą automatów komórkowych, jakie kiedykolwiek widziałem.

Oto prymitywny widok silnika fizyki płynnej, wykorzystujący wyżej wspomnianą technikę automatów komórkowych. Część renderowania staje się nieco bardziej złożona, ponieważ twoja woda jest reprezentowana przez wartość liczbową.

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

W tym przykładzie bardzo prostym ulepszeniem byłoby ukrycie komórek wodnych, które mają mniej niż 1 pełną jednostkę wody w swoim kafelku, jeśli pod nim nie ma litej płytki. Ale ukrywasz przepływ wody. Zamiast go ukrywać, musisz określić, jak płynie woda, a następnie narysować odpowiedniego duszka na jego miejsce.

jgallant
źródło
2
Aby dodać do tego, że cząsteczki kropli deszczu udają efekt opadania wody: małe kropelki rozpryskujące się na powierzchni również nie są powiązane z faktycznymi cząsteczkami deszczu, ale osobnym efektem. Kombinacja sprawia, że wyglądają jakby kropelki dokonać plamy.
Felsir
Wow, właśnie tego szukałem. Pomyślałem, że będę musiał uciekać się do jakiegoś nadmiernie złożonego układu płynów opartego na cząsteczkach, ale układy siatki wydają się równie dobrze działać. Chociaż, aby dodać ciśnienie wody, myślę, że potrzebujesz drugiej tablicy, która przechowuje wartości ciśnienia i przepływa z miejsc wysokiego ciśnienia do miejsc niskiego ciśnienia? Jeśli tak, to nie powinno być zbyt trudne dla komputera.
Pandaqi,
Nie, wszystko co musisz zrobić z naciskiem, to dodać regułę, na przykład, że płytka może zawierać więcej niż 1 pełną jednostkę płynu. Jeśli ten kafelek zawiera więcej niż 1 pełną jednostkę cieczy i nie jest w stanie przepływać zgodnie z normalnym zestawem zasad - spraw, aby płynął w górę. Wyreguluj, aby umożliwić przepływ większej ilości wody w zależności od wartości ciśnienia tego kafelka.
jgallant,
3

Jest na to wiele sposobów. Jak zawsze „to zależy”

I tak myślę, że jeden sposób byłby w ten sposób ... Biorąc pod uwagę arbitralne „zanurzenie w ziemi”, nałóż „ogranicznik wody”, który go ogranicza. Grunt i pojemnik na wodę są rysowane warstwami, aby ziemia była pokazana jako pierwsza, a pojemnik na wodę po.

za każdym razem, gdy kropla wody uderza w ziemię, dodaj ją do pojemnika na wodę. Kiedy pojemnik na wodę osiągnie magiczną liczbę, dodaj linię wody. Powiedzmy, że 10 kropli ląduje w zanurzeniu, co dodaje jedną linię do pojemnika na wodę.

Powiedzmy, że waterbox ma 32 x 32 piksele. Dodaj jedną linię koloru wody od 0,31 do 31,31. Kolejne 10 kropli, narysuj linię od 0,30 do 31,30. Gdy gromadzą się krople, budujesz pojemnik na wodę od dna, aż będzie pełny.

Mam nadzieję, że to ma sens.

RobM
źródło