Rendre les rivières dans une grille

8

J'ai créé une carte de hauteur aléatoire et maintenant je veux créer des rivières. J'ai fait un algorithme basé sur un * pour faire couler les rivières des pics à la mer et maintenant je suis en quête d'un algorithme élégant pour les rendre.

C'est une carte quadrillée 2D. Les cellules que la rivière traverse ont une valeur entière simple avec cette forme: rivernumber && pointOrder. C'est-à-dire: 10, 11, 12, 13, 14, 15, 16 ... 1 + N pour le premier fleuve, 20,21,22,23 ... 2 + N pour le second, etc. Ceci est créé dans le cartographier le temps de génération de la grille et il n'est exécuté qu'une seule fois, lorsque le monde est généré.

Je voulais traiter chaque rivière comme un vecteur, mais il y a un problème, si la même rivière a des branches (parce que je mets du bruit pour générer des branches), je ne peux pas simplement connecter les points dans l'ordre.

La deuxième alternative est de générer un algorithme complexe où analyse chaque point, vérifie si le suivant n'est pas une branche, si c'est le cas, déclenche un autre algorithme qui prend soin de la branche puis retourne à la rivière principale, etc. Très complexe et inélégant.

Il y a peut-être une solution dans l'algorithme de génération du monde ou dans l'algorithme de rendu de la rivière qui est couramment utilisé dans ces cas et que je ne connais pas.

Des conseils? Merci!!

Gabriel A. Zorrilla
la source
Je suppose que vous pourriez utiliser certains algorithmes utilisés pour la génération de labyrinthes et simplement couper quelques egdes pour créer une carte du fleuve plus réaliste.
Ali1S232
1
J'ai le chemin de la rivière, mais je ne sais pas comment gérer les branches lors du rendu, les points de connexion.
Gabriel A. Zorrilla
Vous avez un point à la confluence (point de rencontre de deux rivières) qui est traité comme un type particulier de nœud?
The Communist Duck
1
J'ai vu une fois un article sur la création de rendus de routes sur un tilemap. Il a sélectionné les tuiles en fonction des tuiles voisines qui ont également une propriété de route. il a créé quelque chose autour de 16 tuiles différentes (y compris toutes les rotations). cette étape a été effectuée uniquement lors de la génération de la scène. Je ne sais pas si tu pourrais faire la même chose ou pas.
Ali1S232
4
Pouvez-vous nous donner une capture d'écran avec des croquis dessus pour mieux montrer ce que vous essayez de faire?
AttackingHobo

Réponses:

1

Ce tutoriel / blog de développement de jeu fournit une excellente méthode pour générer des rivières, et elles rendent très bien. Je ne sais pas si cela peut être appliqué efficacement dans votre situation, car vous avez adopté une approche différente (et avez une carte basée sur une grille) mais cela vaut la peine d'être examiné, c'est certain.

dlras2
la source
C'est vraiment sympathique.
Tim Holt
1
Plus de détails qui peuvent être utiles: les rivières de ce projet coulent des montagnes vers les océans. Le volume augmente à mesure qu'il descend, et les rivières qui se rejoignent ajoutent leurs volumes. La largeur de ligne sur la carte est le sqrt du volume. Chaque endroit dans la rivière pointe vers le bas; une fourche dans la rivière signifie que deux emplacements ou plus indiquent le même point de descente. Je pense que cela pourrait également être utilisé sur une grille.
amitp
0

Une chose que vous pouvez faire est que chaque nœud individuel se gère lui-même. Faites un passage dessus après la génération mais avant d'afficher et donnez à chaque carré de rivière une liste d'entrées (nombre inférieur, même fleuve) et de sorties (nombre supérieur, même fleuve).

À partir de ces données, vous devriez être en mesure de déterminer où se trouvent les entrées et les sorties (le stockage de l'emplacement relatif serait probablement utile) et vous pouvez à partir de là rendre la rivière de cette place en fonction des connexions. La façon la plus simple de faire une branche est de connecter les entrées / sorties au centre de la place.

La représentation graphique de ceci pourrait être prise de différentes manières, et vous n'avez pas donné suffisamment d'informations sur son utilisation pour que je puisse en recommander une directement; je mentionnerai donc plutôt une manière impliquant un système particulaire où chaque segment d'eau s'écoule dynamiquement "en descente".

Demandez au carré racine de commencer un certain nombre de "pièces d'eau" à chacune de ses entrées et faites-les décider au hasard parmi les sorties disponibles lors de la création. Quand il atteint la sortie, faites-en apparaître un à l'entrée de la tuile qu'il a touchée et remettez le morceau d'eau au début de sa case. Puisqu'il est déjà apparu dans le carré suivant (ne le faites qu'une fois par pièce dans un carré), et que vous connaissez déjà les paramètres et les calculs (ne pas re-randomiser), vous pouvez laisser cette pièce boucler dans son carré avec très peu calcul, et si vous le souhaitez, probablement en utilisant un shader.

Cela a l'avantage de laisser également vos rivières aller vers des rivières plus petites après les branches, et les deux rivières résultantes n'ont pas à être de la même taille. Il faudra un moment pour que la rivière se remplisse complètement de haut en bas, mais l'effet résultant devrait être plutôt agréable car vous pourriez vous retrouver avec quelque chose comme ça simplement en fonction des nœuds qui ont des rivières.

10--10--6--6--2--2
    |      |     
    4--4   4
       |   |
       4---6--6--6
       |  
       2

Il pourrait également, en fonction de la graine et du code, avoir un aspect différent à chaque exécution, même si l'emplacement du nœud était le même.

J'espère que cet exemple se situe quelque part dans le sens que vous recherchez.

Lunin
la source