Création de pluie 2D (et dynamique des fluides)

11

J'expérimente les conditions météorologiques dans un de mes matchs et j'ai été impressionné par la façon dont Starbound a géré la pluie. Fondamentalement, lorsque la pluie frappe le sol, elle est soit dispersée horizontalement (et absorbée par le sol), soit elle crée des tas d'eau (lorsque les gouttes de pluie tombent à l'intérieur d'un trou dans le sol).

Cette vidéo le montre clairement: http://imgur.com/gallery/CKCGKbG

Je sais comment faire tomber la pluie et vérifier où elle touche le sol, mais c'est là que je suis coincé. Ma question est: comment cela a-t-il pu être créé? Et comment pourrait-on modéliser le débit d'eau si parfaitement, sans nuire aux performances?

Merci d'avance!

Pandaqi
la source
1
La clé est le système de dynamique des fluides. Je soupçonne que lorsqu'une goutte de pluie touche le sol, elle génère une petite quantité d'eau à cette position qui est ensuite traitée par le système de dynamique des fluides comme d'habitude. Sur les surfaces planes, il est contré par l'évaporation, mais lorsque les pentes provoquent la concentration de l'eau dans une zone, l'afflux est plus fort que l'évaporation et des flaques d'eau commencent à se former.
Philipp

Réponses:

9

Le système d'eau de Starbound est en fait des automates cellulaires à base de carreaux 2D. Chaque tuile sur l'écran qui ne contient pas de couche de tuile avant, est capable de retenir l'eau. La quantité d'eau est calculée via des automates cellulaires.

Plus d'informations sur cette technique ici:

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/

Quant aux gouttes de pluie, ce sont des particules. Ils servent principalement à simuler qu'il y a effectivement de l'eau qui tombe du ciel. L'eau s'accumule uniquement parce que le jeu sait qu'il pleut actuellement. Les gouttes individuelles n'ont rien à voir avec la formation réelle des piscines d'eau.

La façon dont ils l'accumulent consiste à déterminer où se trouvent les trous dans la couche supérieure du sol. S'il y a une zone qui peut accumuler de l'eau, les cellules de cette zone augmentent leur niveau d'eau en conséquence.

Starbound traite également de la pression de l'eau, et leur technique de rendu est assez étonnante. Ils ont la meilleure implémentation 2D de physique des simulations d'eau utilisant des automates cellulaires que j'ai jamais vue.

Voici une vue primitive d'un moteur de physique des liquides, utilisant la technique des automates cellulaires mentionnée ci-dessus. La partie de rendu devient un peu plus complexe, car votre eau est représentée par une valeur numérique.

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

Dans cet exemple, une amélioration très simple consisterait à masquer les cellules d'eau qui contiennent moins d'une unité complète d'eau dans sa tuile s'il n'y a pas de tuile solide en dessous. Mais alors, vous cachez le débit d'eau. Au lieu de le cacher, vous devrez déterminer comment l'eau coule, puis dessiner le sprite d'eau approprié à sa place.

jgallant
la source
2
Pour ajouter au fait que les particules de gouttes de pluie simulent l'effet de chute d'eau: les petites éclaboussures de gouttelettes sur la surface ne sont pas non plus liées aux particules de pluie réelles mais à un effet distinct. La combinaison donne l' impression que les gouttelettes font des éclaboussures.
Felsir
Wow, c'est exactement ce que je cherchais. Je pensais que je devrais recourir à un système fluide trop complexe basé sur des particules, mais les systèmes de grille semblent fonctionner tout aussi bien. Cependant, pour ajouter de la pression d'eau, je suppose que vous avez juste besoin d'un deuxième tableau qui stocke les valeurs de pression et s'écoule des endroits à haute pression vers les endroits à basse pression? Si c'est le cas, cela ne devrait toujours pas être trop difficile pour l'ordinateur.
Pandaqi
Non, tout ce que vous devez faire avec la pression, c'est d'ajouter une règle telle qu'une tuile est autorisée à contenir plus d'une unité complète de liquide. Si cette tuile contient plus d'une unité complète de liquide et ne peut pas s'écouler conformément à l'ensemble des règles normales, faites-la couler vers le haut. Ajustez de manière à permettre à plus d'eau de s'écouler en fonction de la valeur sous pression de cette tuile.
jgallant
3

Il y a un tas de façons d'aborder cela. Comme toujours, ça dépend

Et donc je suppose qu'une façon serait la suivante. Étant donné un «plongeon dans le sol» arbitraire Superposez une «boîte à eau» qui la délimite. Le sol et la boîte à eau sont dessinés en couches afin que le sol soit affiché en premier, la boîte à eau ensuite.

chaque fois qu'une goutte d'eau tombe dans le sol, ajoutez-en une à la boîte à eau. Lorsque la boîte à eau atteint un nombre magique, ajoutez une ligne d'eau. Disons que 10 gouttes atterrissent dans le creux, cela ajoute une ligne à la boîte à eau.

Alors disons que la boîte à eau fait 32X32 pixels. Ajoutez une ligne de couleur de l'eau de 0,31 à 31,31. Encore 10 gouttes, tracez une ligne de 0,30 à 31,30. Ainsi, à mesure que les gouttes s'accumulent, vous construisez la boîte à eau du bas jusqu'à ce qu'elle soit pleine.

J'espère que cela a du sens.

RobM
la source