Comment définir des zones remplies d'eau?

9

Je voudrais améliorer mon petit moteur de jeu avec une belle simulation de l'eau. Pour commencer à travailler là-dessus, je dois trouver un moyen approprié de représenter l'eau dans le jeu. Malheureusement, je ne connais pas beaucoup de représentations différentes, alors je vais vous demander. Il y a une question similaire que j'ai posée il y a quelque temps. Mais comme je n'avais pas formulé le problème clairement, la réponse est correcte mais pas ce que je cherchais.

Dans certains jeux, l'eau est simplement définie par un niveau de hauteur. Par exemple, tout sous la hauteur de zéro est sous l'eau. J'ai vu cette représentation dans des jeux (pour la plupart plus anciens). Le problème est que j'aimerais des grottes dans le monde extérieur qui ne sont pas inondées et des niveaux d'eau différents pour chaque lac et mer.

Les particules sont une autre représentation plus précise de la présence d'eau. Chaque goutte d'eau est stockée comme un point dans l'espace mondial. Pour les rendre, je pourrais utiliser des techniques comme les métaballes pour qu'elles construisent un seul maillage. Cette représentation serait idéale pour le réalisme car je pourrais facilement calculer la dynamique entre eux. Malheureusement, aucune machine n'a pu calculer un océan de métaboules en temps réel.

Y a-t-il d'autres façons de représenter l'eau dans un moteur? J'aimerais avoir des lacs dynamiques, donc définir la zone d'eau par une géométrie statique n'est pas une option. Par exemple, si le joueur modifie le terrain pour élargir un lac, l'eau devrait remplir cette baie et le niveau d'eau global de ce lac devrait légèrement diminuer.

danijar
la source
2
Comment votre terrain est-il organisé dans le moteur? Il existe différentes techniques pour le voxel, le heightmap et le polysoup (mesh).
Exilyth
Il est donné comme un maillage et l'eau ne doit pas échanger ce maillage de terrain différemment des autres maillages statiques.
danijar
1
échanger ou traiter?
Tom 'Blue' Piddock
1
Il existe de très belles démos d'une telle approche métaballique, mais je ne la vois pas utilisable dans un jeu réel qui ne soit pas entièrement axé sur le fait que la simulation de l'eau est à un certain point physiquement crédible. Je ne vois pas de raison contre un simple maillage, cela ne devrait pas non plus être un problème de l’ajuster aux alentours ou même de le générer sur la base d’une simulation physique. Mais c'est quelque chose que vous ne voulez faire que si vous en avez vraiment besoin. Comme référence pour la simulation semi-réaliste de l'eau, vous voudrez peut-être cocher "From Dust".
Slin
1
La solution de taille variable était au problème de "l'océan des métabilles". En outre, il y aurait bien sûr des limites à l'écart de taille en fonction du volume, car c'est un moyen d'optimiser les performances, pas de modifier le volume d'eau. Ajoutez simplement une considération particulière, comme la proximité du joueur et de la surface, pour les zones nécessitant des détails tels que les cascades, les affluents, les rives ou les ruisseaux.
Attackfarm

Réponses:

3

Je ne peux pas dire ce qui est couramment utilisé, mais ma première pensée serait d'utiliser un système de particules avec des particules de tailles variables représentant de l'eau de différents volumes. Le sommet de l'eau utiliserait des particules plus petites pour former les ondulations de la surface et des vagues, l'eau la plus proche du joueur utiliserait les plus petites particules pour simuler les éclaboussures et les petites ondulations, tandis que plus l'eau serait éloignée ou profonde, plus les particules seraient grandes . Cela permettrait un nombre dynamique de particules simulant l'eau de toute taille, la dynamique de l'eau au fur et à mesure qu'elle change et un niveau de performance raisonnable et contrôlé.

Je peux voir des problèmes avec cette implémentation, mais cela semble certainement être une solution relativement simple et "assez bonne" qu'un téléspectateur / joueur serait douteux de remarquer des écarts dans la simulation.

Attackfarm
la source
2

Si vous utilisiez un terrain à base de voxels, vous pourriez, en plus de stocker la densité du sol par voxels, vous pourriez également stocker une valeur d'eau qui est fixée entre 0et 1 - groundDensity. Dessiner l'eau serait aussi simple que de faire passer un cube de marche sur les valeurs de l'eau. Simuler l'eau serait un peu plus difficile, mais le principe de base est que vous voulez résoudre le système de telle sorte que:

  1. L'eau souterraine devrait remplir le reste du voxel
  2. L'eau au niveau de la surface devrait avoir la même densité totale groundDensity + waterDensityque ses voisins
  3. L'eau peut être déplacée vers n'importe quel voxel immédiatement adjacent et en dessous, à condition que la densité totale du voisin soit inférieure à sa densité totale

L'algorithme idéal s'exécuterait dans un shader de calcul, un chemin d'exécution par voxel. Si vous voulez devenir chic, vous pouvez également stocker la vitesse de l'eau dans ce voxel pour des effets de simulation supplémentaires: par exemple, en tentant de distribuer une quantité d'eau proportionnelle à la vitesse aux cellules "pointées" par le vecteur vitesse. Ces données de vitesse pourraient également être utilisées pour déplacer les vagues, dessiner des rapides, etc.

jmegaffin
la source
Malheureusement, je n'ai pas de terrain voxel, comme indiqué dans les commentaires sous la question. Merci quand même.
danijar