Jak mogę zdefiniować obszary wypełnione wodą?

9

Chciałbym ulepszyć mój silnik gry dzięki ładnie wyglądającej symulacji wody. Aby zacząć nad tym pracować, muszę znaleźć odpowiedni sposób na reprezentowanie wody w grze. Niestety nie znam zbyt wielu różnych reprezentacji, więc zapytam cię. Jest to podobne pytanie Pytałem jakiś czas temu. Ale ponieważ nie sformułowałem jasno problemu, odpowiedź jest prawidłowa, ale nie to, czego szukałem.

W niektórych grach woda jest zdefiniowana przez poziom wysokości. Na przykład wszystko poniżej wysokości zero znajduje się pod wodą. Widziałem tę reprezentację w (głównie starszych) grach. Problem polega na tym, że wolałbym jaskinie w świecie zewnętrznym, które nie są zalane, i różne poziomy wody dla każdego jeziora i morza.

Innym, bardziej precyzyjnym przedstawieniem występowania wody są cząstki. Każda kropla wody jest przechowywana jako punkt w przestrzeni świata. Aby je wyrenderować, mogłem użyć technik takich jak metaball, aby zbudować jedną siatkę. Ta reprezentacja byłaby świetna dla realizmu, ponieważ mogłem łatwo obliczyć dynamikę między nimi. Niestety żadna maszyna nie jest w stanie obliczyć oceanu metaball w czasie rzeczywistym.

Czy istnieją inne sposoby przedstawiania wody w silniku? Chciałbym mieć jeziora dynamiczne, więc nie ma możliwości zdefiniowania obszaru wodnego za pomocą geometrii statycznej. Na przykład, jeśli gracz zmodyfikuje teren, aby poszerzyć jezioro, woda powinna wypełnić tę zatokę, a ogólny poziom wody w tym jeziorze powinien nieznacznie spaść.

danijar
źródło
2
Jak Twój teren jest zorganizowany w silniku? Istnieją różne techniki dla woksela vs. mapy wysokości vs. terenu polisoup (siatki).
Exilyth
Podawany jest jako siatka, a woda nie powinna wymieniać tej siatki terenu inaczej niż inne siatki statyczne.
danijar
1
handlować czy smakować?
Tom „Blue” Piddock
1
Istnieje kilka bardzo fajnych wersji demonstracyjnych takiego metabalistycznego podejścia, ale nie widzę, aby można go było zastosować w żadnej prawdziwej grze, która nie do końca koncentruje się na tym, że symulacja wody jest do pewnego stopnia fizycznie wiarygodna. Nie widzę powodu, dla którego wystarczy siatka, nie powinno być problemu z dostosowaniem jej do otoczenia, a nawet wygenerowaniem jej na podstawie jakiejś fizycznej symulacji. Ale to jest coś, co chcesz zrobić tylko wtedy, gdy jest to naprawdę potrzebne. Jako odniesienie do pół realistycznej symulacji wody możesz chcieć sprawdzić „From Dust”.
Slin
1
Rozwiązaniem o zmiennej wielkości był problem „oceanu metalowych kulek”. Oczywiście, istnieją różnice w wielkości wariancji w zależności od objętości, ponieważ jest to sposób na optymalizację wydajności, a nie zmianę objętości wody. Po prostu dodaj szczególną uwagę, na przykład bliskość gracza i powierzchni, w obszarach wymagających szczegółów, takich jak wodospady, dopływy, brzegi lub strumienie.
Attackfarm

Odpowiedzi:

3

Nie mogę powiedzieć, co jest powszechnie stosowane, ale moją pierwszą myślą byłoby użycie układu cząstek z cząstkami o różnych rozmiarach reprezentujących wodę o różnych objętościach. Szczyt wody używałby mniejszych cząstek, aby utworzyć pofalowania powierzchni i fal, woda najbliższa gracza użyłaby najmniejszych cząstek do symulacji rozprysków i małych fal, podczas gdy im głębsza lub głębsza woda, tym większe są cząstki . Umożliwiłoby to dynamiczną liczbę cząstek symulujących wodę o dowolnym rozmiarze, dynamikę wody podczas jej zmiany oraz pewien rozsądny i kontrolowany poziom wydajności.

Widzę problemy z tą implementacją, ale z pewnością wydaje się to stosunkowo prostym i „wystarczająco dobrym” rozwiązaniem, aby widz / gracz wątpiłby w jakiekolwiek odchylenia w symulacji.

Attackfarm
źródło
2

Jeśli korzystasz z terenu opartego na wokselach, oprócz przechowywania gęstości gruntu na wokselach możesz także przechowywać wartość wody, która jest zaciśnięta między 0a 1 - groundDensity. Wyciąganie wody byłoby tak proste, jak bieganie maszerujących kostek przekraczających wartości wody. Symulacja wody byłaby nieco trudniejsza, ale podstawową zasadą jest to, że chcesz rozwiązać system w taki sposób, aby:

  1. Woda pod powierzchnią powinna wypełnić resztę woksela
  2. Woda na powierzchni powinna mieć taką samą całkowitą gęstość groundDensity + waterDensity, jak jej sąsiedzi
  3. Woda może być wypierana do dowolnego woksela bezpośrednio sąsiadującego i poniżej niej, pod warunkiem że całkowita gęstość sąsiada jest mniejsza niż całkowita gęstość

Idealny algorytm działałby w module obliczeniowym, po jednej ścieżce wykonania na woksel. Jeśli chcesz się zachwycić, możesz również zapisać prędkość wody w tym wokselu, aby uzyskać dodatkowe efekty symulacji: na przykład, próbując rozdzielić ilość wody proporcjonalną do prędkości do komórek „wskazanych” przez wektor prędkości. Te dane prędkości można również wykorzystać do poruszania falami, rysowania bystrzy itp.

jmegaffin
źródło
Niestety nie mam terenu wokselowego, jak wskazano w komentarzach pod pytaniem. W każdym razie dzięki.
danijar