2 points par GN⁺ 2025-02-08 | 1 commentaires | Partager sur WhatsApp

Le problème de l’eau

  • La plupart des jeux ne permettent pas de modifier le terrain, ce qui est raisonnable. Tous les jeux n’en ont pas besoin.
  • Dans les jeux avec de l’eau, il faut réfléchir à la manière de gérer son écoulement.
  • Les modèles simples existants ne sont pas satisfaisants, et il faut faire des recherches pour trouver un meilleur modèle.

Configuration

  • La simulation doit fonctionner sur une grille, et il est préférable d’utiliser la même grille que pour le terrain.
  • L’échelle moyenne de la simulation doit être d’environ 1 mètre.
  • On peut considérer l’eau comme un champ de hauteur au-dessus du terrain, et elle ne s’écoule pas verticalement.
  • L’eau doit pouvoir s’écouler et ne pas disparaître comme par magie à cause d’erreurs de simulation.
  • La simulation doit avoir une stabilité contrôlable et fonctionner rapidement.

Non-solutions

  • Smoothed Particle Hydrodynamics fournit des résultats très impressionnants, mais résout un autre problème.
  • Stable Fluids de Jos Stam traite l’ensemble du volume du fluide et n’est pas rapide.

Équations des eaux peu profondes

  • Les équations des eaux peu profondes moyennent la direction verticale pour ne laisser que des équations 2D.
  • La partie « peu profondes » suppose que la taille verticale typique de la colonne d’eau est bien plus petite que son échelle horizontale.

Grille

  • En mécanique des fluides, la grille est importante, et on utilise généralement des staggered grids.
  • Les staggered grids stockent la hauteur/densité de l’eau, etc., dans des cellules carrées, et la vitesse sur les arêtes entre les cellules.

Méthode des tuyaux virtuels

  • On simule l’écoulement de l’eau en supposant que les cellules d’eau sont reliées par des tuyaux virtuels.
  • Elle se compose de trois étapes : accélération du flux, mise à l’échelle du débit sortant, et mise à jour de la colonne d’eau.

Accélération du flux

  • On accélère le flux en fonction de la différence de hauteur d’eau entre cellules d’eau voisines.
  • On ajoute du frottement pour que la simulation converge vers un état stable.

Mise à jour de la colonne d’eau

  • Pour chaque cellule d’eau, on ajoute ou on retire de l’eau en fonction des flux voisins.

Mise à l’échelle du débit sortant

  • On ajuste le flux sortant pour que la quantité d’eau dans une cellule ne devienne pas négative.

Altitude du terrain

  • On ajoute l’altitude du terrain pour que l’eau se déplace au-dessus du relief.

Conditions aux limites

  • Il faut prendre en compte ce qui se passe aux bords de la simulation.
  • On définit les conditions comme les murs, les entrées et les sorties en fixant les valeurs de flux sur les bords.

Viscosité

  • On ajoute de la viscosité pour qu’une fine couche d’eau ait plus de mal à se déplacer.

Code complet de simulation

  • Le code de simulation se compose de 4 boucles for sur quelques tableaux 2D.

Limites du modèle

  • Il n’y a ni inertie ni diffusion de vitesse, et lorsqu’un écoulement rapide se jette dans un lac, il se propage dans toutes les directions.

Bonus : grilles hexagonales/triangulaires

  • On peut simuler l’eau avec une grille triangulaire, qui peut être vue comme le dual d’une grille hexagonale.

1 commentaires

 
GN⁺ 2025-02-08
Commentaires sur Hacker News
  • Mentionne le problème, dans la simulation de fluides, de l’eau qui s’accumule et affecte les cellules adjacentes. C’est l’une des raisons pour lesquelles la parallélisation est difficile dans les jeux générés procéduralement

    • La génération procédurale se prête bien à la parallélisation, mais elle devient difficile dans un domaine infini
    • Souligne que ce sujet n’a pas été beaucoup exploré
    • Fait l’éloge du travail de Nick McD, tout en notant que son travail comporte aussi des contraintes de domaine en raison de la conception de la simulation
    • Propose de générer procéduralement les limites des bassins versants afin de permettre la parallélisation et de simuler l’ensemble d’un bassin d’un seul coup
  • Mentionne le risque de perdre du temps à simplement admirer de beaux résultats lors du développement d’une simulation de fluides

    • Partage son expérience d’une implémentation de mécanique des fluides sur GPU en 2011
    • Explique que le fluide (du sang) était simulé en 2D sur une surface (un tissu), puis projeté sur un maillage en tenant compte de la gravité et de l’inclinaison de la surface
  • Mentionne que la méthode de collecte de ressources d’Animal Crossing est efficace sans manipulation du terrain

    • On coupe des arbres pour obtenir des bûches, mais après une certaine quantité, un temps de recharge est nécessaire
    • Suggère que cette approche peut être préférable dans les jeux qui n’exigent pas de modification du terrain
  • Recommande le jeu Timberborn en soulignant que la physique de l’eau en est un élément important

    • Trouver comment bloquer l’eau pour l’utiliser avec les moteurs et les champs fait partie intégrante du gameplay
  • Partage une expérience d’expérimentation en 3D avec un algorithme implémenté à l’aide de o3-mini-high

    • Mentionne avoir implémenté Perlin noise from scratch pour l’utiliser dans la génération de terrain
  • Présente une simulation éducative d’inondation qui utilise WebGL pour calculer les valeurs des cellules à partir des cellules adjacentes

    • Explique qu’en modifiant les valeurs du modèle, on peut obtenir de grands effets
  • Propose une méthode pour résoudre le manque d’inertie et de diffusion de la vitesse dans une simulation de l’eau

    • Explique qu’on peut y remédier en moyennant les valeurs des flèches de flux avec celles des flèches voisines
  • Partage sa curiosité pour une simulation d’érosion commencée comme projet personnel

    • Mentionne que le projet a été abandonné faute de comprendre l’érosion
  • Évoque l’idée de simuler l’eau dans le jeu Creeper World puis d’y larguer des bombes