Idées pour la simulation d'eau 2D

18

Je recherche n'importe quelle entrée sur la simulation de l'eau en 2D, par rapport à un réseau plutôt grand (appelez-le) bloqué / non bloqué (vu de côté). J'ai trouvé les idées suivantes:

Automates cellulaires

Faites une simulation massivement parallèle sur le CPU, en utilisant des automates cellulaires . Avec des règles aussi simples que:

  • S'il y a une cellule ouverte vers le bas, allez-y.
  • Vérifiez les cellules gauche et droite, choisissez-en une au hasard et déplacez-vous vers elle.

Avantages

  • Simple à mettre en œuvre.
  • Significative / déterministe dans un système multijoueur.

Les inconvénients

  • Probablement très lent.
  • Pas convaincant.

Dynamique des fluides sur le GPU

Effectuez une approximation approximative de la dynamique des fluides sur le GPU par rapport à une texture comme la suivante:

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

Avantages

  • Probablement très rapide.
  • Pourrait être assez convaincant.
  • Un autre pixel shader pourrait le rendre directement.

Les inconvénients

  • Difficile à mettre en œuvre.
  • Difficile à modifier.
  • Je ne peux pas allouer une seule texture de la taille de mon niveau.
    • Je pourrais chevaucher les zones de la grille, mais cela ajouterait encore plus de complexité.

Particules

Utilisez des particules pour simuler l'eau. Pendant le rendu, utilisez le mélange additif, puis appliquez une fonction de multiplication au canal alpha pour donner des bords nets à l'eau.

Avantages

  • Sera probablement joli.
  • Facile à mettre en œuvre.
  • Facile à rendre.
  • Significatif dans un système multijoueur, mais nécessiterait un peu de bande passante pour être transféré.

Les inconvénients

  • Les effets inter-particules seront probablement lents (recherche de voisinage).
  • Peut entraîner une «fuite» d'eau à travers les espaces solides (car l'espace solide est petit, par exemple 1px).
  • Pourrait conduire à des trous étranges dans l'eau en fonction de la taille des particules.
  • Les deux éléments ci-dessus pourraient être atténués en permettant aux particules de dériver plus près les unes des autres que leur taille réelle, mais causeraient des problèmes avec les performances inter-particules et particules / paysage.

D'autres idées?

Remarque: Ceci est une approximation, je ne cherche pas ici de l'eau physiquement correcte - juste quelque chose qui «est assez bon» (points bonus pour rapide et sale). Le jeu est multijoueur, donc malheureusement tout le niveau doit être simulé en continu.

Jonathan Dickinson
la source

Réponses:

12

chaque fois que j'essayais de simuler de l'eau, je finissais par appliquer un filtre passe-bas sur une texture représentant le niveau de l'eau. C'est très simple à mettre en œuvre, mais il échoue chaque fois que vous obtenez des changements massifs du niveau de l'eau qui peuvent générer de grosses vagues. Dans cette méthode, il y a des endroits où l'eau a toujours un niveau constant, comme les extrémités des rivières. dans ces cas, vous avez juste la bonne couleur pour ce pixel spécifique.

Avantages:

  • facile à mettre en œuvre
  • des résultats réalistes en cas d'eaux calmes
  • calcul rapide avec GPU
  • niveaux d'eau ou sources d'eau statiques faciles à définir

Les inconvénients:

  • incapable de simuler les vagues

pour les eaux ondulées, j'utilise une méthode similaire à votre algorithme Cell Automata mais avec un petit changement qui me permettra d'utiliser des shaders pour calculer la prochaine étape à partir de la situation actuelle, voici un code sudo, encore une fois j'ai une texture représentant le niveau d'eau dans chaque couleur des pixels:

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;
}

cet algorithme a des caractéristiques toutes similaires au précédent mais il fonctionne mieux dans les eaux ondulées plutôt que dans les eaux calmes. C'est votre choix en fonction de la mer que vous simulez pour utiliser l'un ou l'autre.

à la fin, vous avez une texture qui vous indique le niveau d'eau pour chaque position, à l'étape suivante, vous devez tirer des résultats d'une manière ou d'une autre, la façon la plus simple est de générer un maillage basé sur les données du niveau d'eau.

Ali1S232
la source
Merci, c'est une réponse brillante. Je vais laisser la question ouverte encore un peu; mais il semble que j'ai le don de poser des questions à réponse unique ici :).
Jonathan Dickinson
vous pouvez également mélanger ces algorithmes pour obtenir de meilleurs résultats.
Ali1S232
Que diriez-vous d'une capture d'écran?
ashes999
@ ashes999 Je n'ai pas de capture d'écran, mais voici le même algorithme implémenté! youtube.com/watch?v=avJPrL9UJ28
Ali1S232