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ść.
źródło
Odpowiedzi:
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.
źródło
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
0
a1 - 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:groundDensity + waterDensity
, jak jej sąsiedziIdealny 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.
źródło