Pomysły na symulację wody 2D

18

Szukam jakichkolwiek danych wejściowych na temat symulacji wody w 2D w stosunku do dość dużej (nazwij ją) tablicy zablokowanej / niezablokowanej (widzianej z boku). Wymyśliłem następujące pomysły:

Automaty komórkowe

Wykonaj masowo równoległą symulację procesora za pomocą automatów komórkowych . Z zasadami tak prostymi jak:

  • Jeśli komórka jest otwarta na dole, przejdź do niej.
  • Sprawdź lewą i prawą komórkę, wybierz losową z dwóch i przejdź do niej.

Plusy

  • Prosty do wdrożenia.
  • Znaczący / deterministyczny w systemie dla wielu graczy.

Cons

  • Prawdopodobnie bardzo powoli.
  • Nie przekonujący.

Płynna dynamika na GPU

Wykonaj przybliżone przybliżenie dynamiki płynów na GPU w oparciu o teksturę taką jak poniżej:

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

Plusy

  • Prawdopodobnie bardzo szybko.
  • To może być całkiem przekonujące.
  • Kolejny moduł cieniujący pikseli mógłby renderować go bezpośrednio.

Cons

  • Trudne do wdrożenia.
  • Trudne do ulepszenia.
  • Nie mogę przydzielić jednej tekstury wielkości mojego poziomu.
    • Mógłbym nakładać się na obszary siatki, ale spowodowałoby to dodatkową złożoność.

Cząsteczki

Użyj cząstek do symulacji wody. Podczas renderowania za pomocą mieszania dodatków, a następnie zastosuj funkcję mnożenia do kanału alfa, aby uzyskać ostre krawędzie wody.

Plusy

  • Prawdopodobnie będzie ładnie wyglądać.
  • Łatwy do wdrożenia.
  • Łatwy do renderowania.
  • Ma to sens w systemie dla wielu graczy, choć do transferu wymagałoby sporo pasma.

Cons

  • Efekty między cząsteczkami będą prawdopodobnie powolne (wyszukiwanie sąsiedztwa).
  • Może to prowadzić do „wycieku” wody przez stałe przestrzenie (ponieważ stałe przestrzenie są małe, np. 1px).
  • Może to prowadzić do dziwnych dziur w wodzie w zależności od wielkości cząstek.
  • Oba powyższe można złagodzić, umożliwiając dryfowanie cząstek bliżej siebie niż ich rzeczywisty rozmiar, jednak spowodowałoby to problemy z wydajnością między cząsteczkami i wydajnością cząstek / krajobrazu.

Jakieś dalsze pomysły?

Uwaga: jest to przybliżenie, nie szukam tutaj fizycznie poprawnej wody - po prostu coś, co „jest wystarczająco dobre” (punkty bonusowe za szybkie i brudne). Gra jest wieloosobowa, więc niestety cały poziom musi być ciągle symulowany.

Jonathan Dickinson
źródło

Odpowiedzi:

12

za każdym razem, gdy próbowałem symulować wodę, kończyłem się na zastosowaniu filtra dolnoprzepustowego na fakturze przedstawiającej poziom wody. Jest bardzo prosty do wdrożenia, ale zawodzi, gdy pojawią się ogromne zmiany poziomu wody, które mogą generować duże fale. W tej metodzie są miejsca, w których woda ma zawsze stały poziom, np. Końce rzek. w takich przypadkach wybierasz odpowiedni kolor dla tego konkretnego piksela.

Plusy:

  • łatwe do wdrożenia
  • realistyczne wyniki w przypadku spokojnych wód
  • szybkie obliczenia za pomocą GPU
  • łatwe do zdefiniowania statyczne poziomy wody lub źródła wody

Cons:

  • nie można symulować fal

dla falujących wód używam w pewnym stopniu podobnego do algorytmu Cell Automata, ale z niewielką zmianą, która pozwoli mi użyć shaderów do obliczenia następnego kroku od bieżącej sytuacji, oto kod sudo, znowu mam teksturę reprezentującą poziom wody w każdym kolor piksela:

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

algorytm ma wszystkie podobne do poprzedniego, ale działa lepiej na falach niż na spokojnych. to twój wybór w oparciu o morze, które symulujesz, użyć jednego z nich.

w końcu masz teksturę, która mówi ci poziom wody dla każdej pozycji, w następnym kroku musisz jakoś narysować wyniki, najłatwiej jest wygenerować siatkę na podstawie danych o poziomie wody.

Ali1S232
źródło
Dzięki, to świetna odpowiedź. Pozostawię pytanie otwarte dłużej; ale wygląda na to, że mam talent do zadawania jednej odpowiedzi tutaj :).
Jonathan Dickinson
możesz także mieszać te algorytmy, aby uzyskać lepsze wyniki.
Ali1S232,
Co powiesz na zrzut ekranu?
ashes999
@ ashes999 Nie mam zrzutu ekranu, ale tutaj zaimplementowano ten sam algorytm! youtube.com/watch?v=avJPrL9UJ28
Ali1S232