Hydrologie procédurale: simulation dynamique des rivières et des lacs

Remarque: le code source complet du projet est publié sur Github [ ici ]. Le référentiel contient également des informations détaillées sur la façon de lire et d'utiliser le code.

Après avoir mis en œuvre la simulation de l'érosion hydraulique basée sur les particules, j'ai décidé qu'il serait possible d'étendre ce concept pour simuler d'autres aspects de l'hydrologie de surface.

J'ai recherché les méthodes existantes de génération procédurale de rivières et de lacs, mais les résultats trouvés ne me convenaient pas.

L'objectif principal de nombreuses méthodes est de créer des systèmes fluviaux (très beaux) en utilisant divers algorithmes (parfois basés sur une carte d'élévation précédemment créée ou un problème inverse), mais ils manquent d'une relation réaliste forte entre la topographie et l'hydrologie.

De plus, le traitement du modèle de l'eau sur le relief dans son ensemble est envisagé sur certaines ressources et une simulation de fluides très complexes est utilisée.

Dans cet article, je vais démontrer ma tentative de surmonter ces problèmes avec une technique qui étend la capacité de simuler l'érosion hydraulique à base de particules. J'expliquerai également comment, en général, je résous le problème de «l'eau sur le relief».

Dans ma méthode, je m'efforce à la fois de simplicité et de réalisme au prix d'une légère augmentation de la complexité du système d'érosion sous-jacent. Je recommande de lire mon précédent article sur ce système [ ici , traduction sur Habré], car le nouveau modèle est basé sur lui.


Ce système est capable de générer rapidement un terrain d'aspect très réaliste avec l'hydrologie. Cette vidéo a été rendue en temps réel. Le système est capable de générer un nombre infini de tels paysages.

Explication: je ne suis pas géologue, j'ai donc créé le système en fonction de mes connaissances.

Concept d'hydrologie


Je souhaite créer un système génératif capable de simuler de nombreux phénomènes géographiques, notamment:

  • Migration fluviale et fluviale
  • Cascades naturelles
  • Formation de Canyon
  • Gonflement du sol et de la plaine inondable

Par conséquent, les systèmes d'hydrologie et de topographie doivent être dynamiques et étroitement liés. Le système d'érosion hydraulique à base de particules a déjà les aspects de base nécessaires pour cela:

  • Le relief affecte le mouvement de l'eau
  • L'érosion et la sédimentation affectent le terrain

En fait, ce système simule l'érosion causée par la pluie, mais n'est pas en mesure de transmettre de nombreuses autres influences:

  • Dans un cours d' eau en mouvement , l' eau se comporte différemment.
  • Dans une piscine debout , l' eau se comporte différemment

Remarque: je mentionnerai souvent les flux et les pools . L'hypothèse est faite dans le modèle qu'il s'agit de phénomènes bidimensionnels à grande échelle. Ils réduisent considérablement la complexité du modèle.

La plupart des phénomènes géographiques ci-dessus peuvent être transmis à l'aide du modèle des écoulements et des bassins. Idéalement, ils devraient emprunter et améliorer le réalisme d'un système à base de particules.

Modèle hydrologique simplifié


Le stockage d'informations sur les flux et les pools dans une ou plusieurs structures de données (graphiques, objets, etc.) est trop compliqué et limite nos capacités.

Par conséquent, notre modèle hydrologique se compose de deux cartes: les cartes de débit et les cartes de bassin .

Remarque: n'oubliez pas qu'ils sont modélisés comme des systèmes 2D.

Cartes de flux et de piscine


La carte des flux décrit l'eau qui coule à la surface (ruisseaux et rivières). Il stocke la position moyenne des particules dans le temps sur la carte. Les anciennes informations sont lentement supprimées.

La carte du bassin décrit l'eau plate à la surface (flaques d'eau, étangs, lacs, océans). Il stocke la profondeur de l'eau dans la position correspondante de la carte.

Remarque: les cartes de flux et de pool sont des tableaux de la même taille que la carte de hauteur.


Relief à impact hydrologique. La couche d'eau dans le rendu est tirée de cartes hydrologiques.


Cartes hydrologiques combinées. Le bleu clair est une carte du cours d'eau; le bleu foncé est une carte de la piscine.

Ces cartes sont générées et reliées par des particules déplaçant l'eau le long du terrain. L'ajout de ces cartes hydrologiques nous donne également des informations indépendantes du temps qui permettent l'interaction des particules avec leur simulation séparément. Les particules peuvent interagir grâce à l'utilisation de ces cartes pour obtenir des paramètres qui affectent leur mouvement.

Remarque: la carte du flux s'affiche après avoir traversé la fonction de facilité d'entrée et de sortie et est rendue sur le terrain en fonction de cela. Pour obtenir des débits plus fins / plus nets (ou pour ignorer des valeurs plus faibles sur de grandes surfaces planes), cet affichage peut être modifié ou définir des valeurs de seuil pour lui.

L'eau en tant que particule


L'eau se présente sous la forme d'une masse discrète («particules») ayant un volume et se déplaçant le long de la surface du relief. Il a plusieurs paramètres qui affectent son mouvement (frottement, vitesse d'évaporation, vitesse de dépôt, etc.).

Il s'agit de la structure de données de base utilisée pour simuler l'hydrologie. Les particules ne sont pas stockées , mais sont utilisées uniquement pour l'interaction entre les cartes des hauteurs, des flux et des piscines.

Note: le concept d'une particule est expliquée plus en détail dans un précédent post [ traduction sur Habré] (et un nombre infini d'autres ressources).

Cycle hydrologique et interaction cartographique


Les cartes interagissent les unes avec les autres à travers un cycle hydrologique. Le cycle hydrologique comprend les étapes suivantes:

  • Création d'une particule sur le terrain
  • (.. ).
  • , .
  • , .
  • , ( ) .
  • .

Dans tout le système, il n'y a que deux algorithmes: Descend (descente) et Flood (inondation) . Les particules descendantes changent la carte des écoulements et les particules inondantes changent la carte des bassins. Ces algorithmes sont décrits en détail ci-dessous.


Diagramme unidimensionnel du modèle hydrologique. Les particules sont créées sur le terrain et traitées cycliquement par deux algorithmes: Descend et Flood. Au cours du processus, les cartes des bassins et des flux changent, affectant à leur tour le mouvement des particules.

la mise en oeuvre


Ci-dessous, je vais expliquer la mise en œuvre complète du système utilisé pour générer les résultats et présenter des exemples de code.

Remarque: je n'afficherai que les éléments de code pertinents. Plus d'informations peuvent être trouvées dans le référentiel sur Github. Toutes les parties pertinentes du code se trouvent dans le fichier «water.h».

Classe de particules


La structure de la particule Drop est identique à la structure du système précédent. Descend et flood sont désormais membres de la structure car ils n'agissent que sur une seule particule à la fois.

struct Drop{
  
  //... constructors

  int index;                         //Flat Array Index
  glm::vec2 pos;                     //2D Position
  glm::vec2 speed = glm::vec2(0.0);
  double volume = 1.0;
  double sediment = 0.0;

  //... parameters
  const double volumeFactor = 100.0; //"Water Deposition Rate"

  //Hydrological Cycle Functions
  void descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale);
  void flood(double* h, double* pool, glm::ivec2 dim);
};

Un paramètre supplémentaire est le facteur de volume, qui détermine comment les inondations transfèrent le volume au niveau de l'eau.

Algorithme de descente


L'algorithme de descente est presque le même que l'algorithme d'érosion des particules simple. Il reçoit une «piste» d'entrée supplémentaire - un tableau dans lequel il écrit toutes les positions visitées par lui. Un tableau est nécessaire pour créer des cartes de flux plus tard.

void Drop::descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale){

  glm::ivec2 ipos; 

  while(volume > minVol){

    ipos = pos; //Initial Position
    int ind = ipos.x*dim.y+ipos.y; //Flat Array Index

    //Register Position
    track[ind] = true;

    //...
  }
};

L'ensemble des paramètres est modifié par les cartes de flux et de pool:

//...
  //Effective Parameter Set
  double effD = depositionRate;
  double effF = friction*(1.0-0.5*stream[ind]);
  double effR = evapRate*(1.0-0.2*stream[ind]);
//...

Remarque: j'ai découvert qu'un tel changement de paramètre fonctionne bien.

Dans le système précédent, les particules pouvaient sortir de ce cycle et être détruites uniquement avec une évaporation complète ou dépassant les limites du relief. Maintenant, deux conditions de sortie supplémentaires ont été ajoutées ici:

//... nind is the next position after moving the particle
  
  //Out-Of-Bounds
  if(!glm::all(glm::greaterThanEqual(pos, glm::vec2(0))) ||
     !glm::all(glm::lessThan((glm::ivec2)pos, dim))){
       volume = 0.0;
       break;
  }

  //Slow-Down
  if(stream[nind] > 0.5 && length(acc) < 0.01)
    break;

  //Enter Pool
  if(pool[nind] > 0.0)
    break;

//...

Si la particule n'a pas une accélération suffisante et est entourée par d'autres particules, ou pénètre directement dans la piscine, alors elle termine prématurément la descente avec tout son volume restant et procède à l'algorithme d'inondation.

Remarque: la condition de débordement réinitialise également le volume afin que les particules ne passent pas à l'algorithme d'inondation.

Algorithme d'inondation


Une particule avec le volume restant peut déborder de sa position actuelle. Cela se produit s'il cesse de descendre (il n'y a pas d'accélération) ou entre dans un pool existant.

L'algorithme d'inondation transfère le volume de la particule à l'augmentation du niveau de l'eau, changeant la carte du bassin. La technique consiste à augmenter progressivement le niveau d'eau d'une fraction du volume des particules en utilisant le «plan d'essai». À mesure que le niveau de l'eau augmente, le volume des particules diminue.


Animation d'algorithme d'inondation. Le plan d'essai et le niveau d'eau augmentent progressivement, réduisant le volume des particules. Si une fuite est détectée, le volume restant se déplace vers le point de fuite pour effectuer la descente.

À chaque étape, nous effectuons un remplissage à partir de la position de la particule (c'est-à-dire, vérifions récursivement les positions des voisins), en ajoutant toutes les positions situées au-dessus du plan d'origine (niveau actuel de l'eau) et en dessous du plan de test au "set d'inondation". C'est la zone de relief qui fait partie de la piscine.

Pendant le remplissage, nous vérifions les fuites. Ce sont des points de l'ensemble des inondations qui sont en dessous du plan de test ET du plan d'origine. Si nous trouvons plusieurs points de fuite, nous sélectionnons le plus bas.

void Drop::flood(double* height, double* pool, glm::ivec2 dim){

  index = (int)pos.x*dim.y + (int)pos.y;
  double plane = height[index] + pool[index];  //Testing Plane
  double initialplane = plane;                 //Water Level

  //Flood Set
  std::vector<int> set;
  int fail = 10; //Just in case...

  //Iterate while particle still has volume
  while(volume > minVol && fail){

    set.clear();
    bool tried[dim.x*dim.y] = {false};

    //Lowest Drain
    int drain;
    bool drainfound = false;

    //Recursive Flood-Fill Function
    std::function<void(int)> fill = [&](int i){

      //Out of Bounds
      if(i/dim.y >= dim.x || i/dim.y < 0) return;
      if(i%dim.y >= dim.y || i%dim.y < 0) return;

      //Position has been tried
      if(tried[i]) return;
      tried[i] = true;

      //Wall / Boundary of the Pool
      if(plane < height[i] + pool[i]) return;

      //Drainage Point
      if(initialplane > height[i] + pool[i]){

        //No Drain yet
        if(!drainfound)
          drain = i;

        //Lower Drain
        else if( pool[drain] + height[drain] < pool[i] + height[i] )
          drain = i;

        drainfound = true;
        return; //No need to flood from here
      }

      //Part of the Pool
      set.push_back(i);
      fill(i+dim.y);    //Fill Neighbors
      fill(i-dim.y);
      fill(i+1);
      fill(i-1);
      fill(i+dim.y+1);  //Diagonals (Improves Drainage)
      fill(i-dim.y-1);
      fill(i+dim.y-1);
      fill(i-dim.y+1);
    };

    //Perform Flood
    fill(index);

    //...

Remarque: pour plus de simplicité, un algorithme de remplissage à huit voies est utilisé ici . À l'avenir, il sera possible de le mettre en œuvre plus efficacement.

Après avoir identifié les nombreux points d'inondation et de fuite, nous modifions le niveau d'eau et la carte de la piscine.

Si un point de fuite est trouvé, nous déplaçons la particule (et son volume de «débordement») au point de fuite afin qu'elle puisse recommencer à descendre. Ensuite, le niveau d'eau descend jusqu'à la hauteur du point de fuite.

    //...

    //Drainage Point
    if(drainfound){

      //Set the Particle Position
      pos = glm::vec2(drain/dim.y, drain%dim.y);

      //Set the New Waterlevel (Slowly)
      double drainage = 0.001;
      plane = (1.0-drainage)*initialplane + drainage*(height[drain] + pool[drain]);

      //Compute the New Height
      for(auto& s: set) //Iterate over Set
        pool[s] = (plane > height[s])?(plane-height[s]):0.0;

      //Remove some sediment
      sediment *= 0.1;
      break;
    }

    //...

Remarque: lorsque le niveau d'eau diminue en raison d'une fuite, j'ai découvert que cela fonctionne mieux avec un faible taux de fuite. De plus, l'élimination d'une partie des roches sédimentaires facilite la mise en œuvre.

Pour cette raison, les nouvelles particules entrant dans la piscine remplie déplacent instantanément leur volume vers le point de fuite, car l'ajout de volume à la piscine en déplace le même volume.

Si le point de fuite n'est pas trouvé, nous calculons le volume sous le plan de test et le comparons avec le volume de la particule. Si elle est inférieure, nous retirons le volume de la particule et ajustons le niveau d'eau. Puis l'avion d'essai monte. S'il est plus grand, le plan de test est abaissé. Le processus est répété jusqu'à ce que la particule manque d'espace ou qu'un point de fuite soit trouvé.

    //...

    //Get Volume under Plane
    double tVol = 0.0;
    for(auto& s: set)
      tVol += volumeFactor*(plane - (height[s]+pool[s]));

    //We can partially fill this volume
    if(tVol <= volume && initialplane < plane){

      //Raise water level to plane height
      for(auto& s: set)
        pool[s] = plane - height[s];

      //Adjust Drop Volume
      volume -= tVol;
      tVol = 0.0;
    }

    //Plane was too high and we couldn't fill it
    else fail--;

    //Adjust Planes
    float approach = 0.5;
    initialplane = (plane > initialplane)?plane:initialplane;
    plane += approach*(volume-tVol)/(double)set.size()/volumeFactor;
  }

  //Couldn't place the volume (for some reason)- so ignore this drop.
  if(fail == 0)
    volume = 0.0;

} //End of Flood Algorithm

La hauteur de l'avion est ajustée proportionnellement à la différence de volumes mise à l'échelle par la surface de la piscine (c'est-à-dire par la taille de l'ensemble). En utilisant le coefficient de proximité, vous pouvez augmenter la stabilité de la façon dont l'avion atteint le niveau d'eau correct.

Enveloppe d'érosion


La classe mondiale contient les trois cartes sous la forme de tableaux ordinaires:

class World {

public:
  void generate();            //Initialize
  void erode(int cycles);     //Erode with N Particles

  //...

  double heightmap[256*256] = {0.0};
  double waterstream[256*256] = {0.0};
  double waterpool[256*256] = {0.0};

};

Remarque: la carte de hauteur est initialisée à l'aide du bruit Perlin.

Chaque étape hydrologique pour une particule individuelle comprend les éléments suivants:

//...

//Spawn Particle
glm::vec2 newpos = glm::vec2(rand()%(int)dim.x, rand()%(int)dim.y);
Drop drop(newpos);

int spill = 5;
while(drop.volume > drop.minVol && spill != 0){

  drop.descend(heightmap, waterstream, waterpool, track, dim, scale);

  if(drop.volume > drop.minVol)
    drop.flood(heightmap, waterpool, dim);

  spill--;
}

//...

Le paramètre de déversement détermine combien de fois une particule peut entrer dans la piscine et la quitter à nouveau avant d'être simplement détruite. Sinon, les particules meurent lorsque leur volume est épuisé.

Remarque: les particules pénètrent rarement dans les piscines et les quittent plus d'une ou deux fois avant de s'évaporer complètement pendant les étapes de descente, mais j'ai ajouté cela juste au cas où.

La fonction d'érosion enveloppe ce code et effectue des étapes hydrologiques pour les particules de N, changeant directement la carte d'écoulement:

void World::erode(int N){

  //Track the Movement of all Particles
  bool track[dim.x*dim.y] = {false};

  //Simulate N Particles
  for(int i = 0; i < N; i++){
   
    //... simulate individual particle

  }

  //Update Path
  double lrate = 0.01;  //Adaptation Rate
  for(int i = 0; i < dim.x*dim.y; i++)
    waterstream[i] = (1.0-lrate)*waterstream[i] + lrate*((track[i])?1.0:0.0);

}

Ici, le réseau de pistes est transmis à la fonction de descente. J'ai trouvé que le suivi simultané du mouvement de plusieurs particules et des changements correspondants fournit de meilleurs résultats pour la carte de flux. Le taux d'adaptation détermine la rapidité avec laquelle les anciennes informations sont supprimées.

Des arbres


Juste pour le plaisir, j'ai ajouté des arbres pour voir si la simulation d'érosion pourrait être encore améliorée. Ils sont stockés dans la classe mondiale comme vecteur.

Les arbres sont créés au hasard sur la carte dans des endroits où il n'y a pas de mares et de forts courants, et le terrain n'est pas très raide. Ils ont également la possibilité de créer des arbres supplémentaires autour d'eux.

En train de créer des arbres, ils écrivent sur la carte de densité de la végétation dans un certain rayon autour d'eux. Une densité de végétation élevée réduit le transfert de masse entre les particules descendantes et la topographie. Il s'agit de simuler la façon dont les racines maintiennent le sol en place.

//... descend function
double effD = depositionRate*max(0.0, 1.0-treedensity[ind]);
//...

Les arbres meurent s'ils sont dans la piscine ou si le ruisseau en dessous est trop puissant. De plus, ils ont une probabilité de décès aléatoire.


Grâce à l'ombrage et aux cartes normales, même des sprites d'arbres très simples rendent le relief plus beau.

Remarque: le modèle d'arbre se trouve dans le fichier "végétation.h" et dans la fonction "World :: grow ()".

Autres détails


Les résultats sont visualisés à l'aide d'un wrapper OpenGL fait maison, qui est présenté [ ici ].

résultats


Les particules peuvent être créées sur la carte en fonction de la distribution dont vous avez besoin. Dans mes démos, je les ai créées avec une distribution uniforme sur 256 × 256 cartes.

Comme on peut le voir ci-dessous, la simulation résultante dépend fortement du choix du relief d'origine. Le système est capable de simuler un grand nombre de phénomènes naturels. Je ne pouvais pas obtenir correctement que des canyons. Ils peuvent avoir besoin d'une simulation très longue et lente.

D'autres phénomènes peuvent être observés dans le système, tels que les cascades, la tortuosité et les deltas des rivières, les lacs, le gonflement des sols, etc.

Le système est également très bon pour distribuer les débits et les piscines dans les endroits où beaucoup de pluie s'accumule, et non dans des endroits aléatoires. Par conséquent, l'hydrologie générée est étroitement liée au terrain.


Simulation hydrologique en temps réel sur une grille 256 × 256. Le relief d'origine est relativement lisse, ce qui permet aux flux d'apparaître rapidement. Au tout début, on peut observer la création la plus simple de piscines et de fuites, après quoi des flux importants apparaissent et subsistent.

Comparaison des effets de rétrécissement


Pour comparer la différence créée en reliant une carte à un système d'érosion, vous pouvez simuler l'hydrologie sur la même carte, en incluant et en désactivant différents effets.

J'ai simulé le même terrain trois fois:

  • Érosion à base de particules (érosion de base) qui reçoit des cartes de débit et de pool. Les pools affectent toujours la génération
  • L'érosion de base avec des paramètres modifiés par des cartes hydrologiques (en combinaison avec l'érosion)
  • Érosion combinée avec des paramètres modifiés par les cartes hydrologiques et affectant l'érosion par les arbres

Remarque: il s'agit d'un système plutôt chaotique, et le type d'hydrologie qui apparaît dépend fortement du terrain. Il est difficile de trouver un exemple de relief "très révélateur".


Rendu en relief du système de base


Rendu d'élévation du système combiné


Rendu de la topographie d'un système arboré

Une observation intéressante: la combinaison de cartes hydrologiques avec des paramètres de particules rétrécit en fait les lits des rivières. En particulier dans les régions planes, les particules sont moins distribuées et fusionnent en une petite quantité de flux plus forts.

Une friction et une évaporation réduites résistent avec succès au fait que les particules commencent à préférer les canaux déjà existants.

D'autres effets sont plus visibles avec l'observation directe du relief.


Carte hydrologique du système de base


Carte hydrologique du système combiné


Carte hydrologique du système avec des arbres

Remarque: ces résultats ont été générés en exactement 60 secondes du temps de simulation.

Les arbres affectent également le rétrécissement. Ils améliorent le processus de découpe de chemins dégagés dans les zones escarpées. Ils forcent les ruisseaux à rester dans les canaux déjà posés, et réduisent donc la tortuosité. Ainsi, l'emplacement des arbres affecte le mouvement de l'eau.


Un exemple d'enregistrement de la façon dont l'emplacement des arbres peut aider à maintenir l'emplacement des cours d'eau. C'est le même soulagement qu'auparavant, avec tous les effets activés.

Impact de la piscine


Le système de création de piscines fonctionne bien et permet à plusieurs plans d'eau de hauteurs différentes d'exister sur le même relief. Ils peuvent également se renverser et se vider.


Un exemple d'une vidéo de la formation de piscines sur un relief de base plus rugueux avec une grande différence d'altitude. Le lac supérieur est physiquement situé au-dessus du lac inférieur et rejette l'eau résultante directement dans le lac inférieur.

Remarque: j'ai obtenu plusieurs graines, dans lesquelles trois lacs se sont coulés les uns dans les autres de manière séquentielle, mais je n'ai pas voulu passer beaucoup de temps à trouver la bonne pour cet article. J'ai déjà généré trop de photos et de vidéos.

De temps en temps, le niveau de la piscine saute. Je pense que cela se produit lorsque le niveau d'eau est proche du niveau de fuite et que beaucoup d'eau est ajoutée. Cet effet peut être réduit en réduisant le taux de fuite dans la fonction d'inondation.


Après une autre minute de génération, plusieurs nouveaux pools sont apparus d'eux-mêmes.


À un angle plus prononcé, la différence de hauteur de bassin est plus visible.


La carte hydrologique montre clairement que le bassin central se confond avec le bassin inférieur.

L'exécution de l'algorithme d'inondation conduit au fait que les piscines voient un "mur" à la frontière de la carte. Cela est visible dans les images ci-dessus.

Une autre amélioration possible pourrait être l'ajout du niveau de la mer au monde afin que les piscines observent les fuites aux bords de la carte au niveau de la mer, sinon elles débordent simplement.

Vitesse de simulation


Le temps de chaque étape de descente et d'inondation varie d'une particule à l'autre, mais il reste environ un ordre de grandeur (environ 1 microseconde). Avec des flux stables, les particules se déplacent plus rapidement sur la carte.

Le temps d'inondation varie proportionnellement à la taille de la piscine, car l'opération de coulée est l'étape la plus coûteuse. Plus les piscines sont grandes, plus la zone pour laquelle vous devez augmenter le niveau de l'eau est grande. Les grandes piscines sont définitivement le goulot d'étranglement du système. Si vous avez des idées pour augmenter la vitesse, faites-le moi savoir.

Le temps de descente varie proportionnellement à la taille de la carte et à de nombreux autres paramètres, dont le frottement et le taux d'évaporation.

Toutes les vidéos de cet article sont enregistrées en temps réel, c'est-à-dire qu'en général la simulation est rapide.

Remarque: peu de temps après la publication de cet article, j'ai fait un petit changement dans la méthode de calcul des normales de surface, ce qui a augmenté la vitesse de simulation. L'effet de ceci est très perceptible pendant la simulation, mais il est difficile de le comparer en raison de grandes variations dans le temps de lancement et d'inondation. Selon mes estimations, la vitesse de simulation a doublé.

Plus de belles vidéos



Simulation d'hydrologie sur terrain vertical irrégulier.


Un petit soulagement plus doux. Certains lacs se révèlent un peu fluctuants.

Simulation d'hydrologie sur un terrain plat et lisse.

Les vidéos suivantes ont été enregistrées après l'amélioration de la vitesse.


Terrain encore plus plat et plus lisse.


Vidéo avec une rivière formée de plusieurs ruisseaux connectés. Le fleuve principal a deux points auxquels il incorpore des débits plus petits, et nous voyons comment il grandit.


Un relief plus inégal avec la formation de rivières.

Je peux continuer indéfiniment.

Conclusion et travaux pour l'avenir


Cette technique simple est toujours basée sur des particules, mais elle réussit à transmettre de nombreux effets supplémentaires. Il fournit un moyen facile de simuler le mouvement de l'eau à grande échelle sans simuler complètement la dynamique des fluides. De plus, elle travaille avec un modèle d'eau intuitif.

Dans les simulations, nous pouvons observer l'émergence de rivières sinueuses, de cascades, de lacs et de transfusions de lacs, de rivières qui se divisent en zones plates en deltas, etc.

Il serait intéressant d'ajouter différents types de sols sous la forme d'une carte des sols à partir de laquelle les paramètres d'érosion pourraient être tirés.

Vous pouvez également facilement changer le système d'arbres pour créer différents types d'arbres qui maintiennent le sol en place.

Il est difficile de transmettre la variété des résultats générés dans plusieurs photos et vidéos, vous devriez donc essayer de le faire vous-même, cela s'avère très intéressant. Je recommande d'expérimenter avec les paramètres de la carte d'origine, y compris le bruit d'octave et l'échelle de la carte.

Si vous avez des questions ou des commentaires, vous pouvez me contacter. J'ai travaillé assez dur sur ce projet, donc mon cerveau frittait et je suis sûr que j'ai raté certains aspects intéressants.

All Articles