Génération de rivière ou de route procédurale pour un terrain infini


28

Je devrais dire des chemins, pas des routes car je pense plus à un style médiéval. Aussi, ne recherchant pas le réalisme. La réponse que je recherche sera de s'insérer dans le moule que je décris plutôt que dans le réalisme.

Je cherche une méthode pour générer des routes / rivières procédurales d'une manière sinueuse, mais je veux le faire pour un système de type de terrain infini. Tout comme la façon dont le bruit perlin génère des blobs, je souhaite générer des segments de ligne de longueur aléatoire (éventuellement une longueur infinie).

Je connais des stratégies comme la réponse suggérée trouvée ici , mais elle repose sur un point de départ et de fin spécifié pour fonctionner, je n'ai pas de point de départ et de fin spécifié. J'aimerais pouvoir simplement appeler une fonction en utilisant des coordonnées arbitraires et la faire revenir si les coordonnées spécifiques font partie de la rivière / route.

Je ne veux pas exiger que le terrain soit généré à l'avance. Cela inclut une carte de hauteur (comme celle utilisée pour les simulations de précipitations ou similaire). Je ne voudrais pas non plus exiger un point de début / fin.

Existe-t-il un tel algorithme ou une modification d'un algorithme de bruit que quelqu'un pourrait connaître pour accomplir ce que j'essaie d'expliquer?

Le plus proche que je suis venu jusqu'à présent est les fractales à plusieurs arêtes, si j'utilise correctement le nom. Je prends juste la valeur absolue du bruit de valeur (en supposant qu'il soit mis à l'échelle de -1 à +1) et en définissant un seuil. Mon principal problème est que les lignes se chevauchent trop souvent, sont principalement circulaires, convergent parfois pour former de grands lacs qui sont propres mais indésirables, et souvent l'épaisseur des lignes varie trop.

Voici une image de ce que j'ai jusqu'à présent en 2D, mais à une fréquence très élevée pour montrer plus de détails:

entrez la description de l'image ici


comme les rivières «coulent», il pourrait être facile de déterminer les rivières en utilisant simplement le bruit pour déterminer le point d'origine, après cela, utilisez simplement vos données brutes de la carte de la hauteur pour déterminer le chemin.
Guerre du

les routes pourraient être un peu plus difficiles, j'ai envisagé de construire des routes en fonction de l'utilisation, si un joueur / tous les joueurs marchaient régulièrement sur un terrain, cela deviendrait un chemin.
Guerre du

1
@ user19142 OK, pas un doublon alors. Vous pouvez également trouver une certaine utilité à partir de cette question / réponse: gamedev.stackexchange.com/questions/53400/… Et je vais à nouveau inclure les liens précédents en tant que "liés" gamedev.stackexchange.com/questions/45403/… gamedev. stackexchange.com/questions/29044/… gamedev.stackexchange.com/questions/31263/…
MichaelHouse

4
Je pense que les routes ne seront pas très crédibles si elles sont générées avec du bruit. Les routes sont créées par l'intelligence plutôt que par la physique et le temps. Bien qu'ils puissent parfois se ressembler, ils sont suffisamment différents pour que vous ne puissiez probablement pas utiliser le même algorithme pour les deux.
MichaelHouse

1
Les routes de ce projet étaient des courbes de niveau qui suivaient des hauteurs spécifiques, vous pouvez donc éventuellement les générer localement. Cela a fonctionné là-bas, mais les cartes de hauteur n'ont pas été générées avec du bruit Perlin.
amitp

Réponses:


11

Juste mon idée d'archiver ce que vous voulez sans (beaucoup) de pré-calcul et la possibilité d'un monde infini.

Le premier élément de l'algorithme est l'utilisation de Voronoi-Diagramms . Vous divisez votre monde en grilles, chaque grille a une adresse sous la forme (xgrid, ygrid). Pour chaque cellule dans laquelle vous devez créer des routes, vous mettez les variables xgrid et ygrid dans une fonction de hachage qui renvoie un nombre CellSeed . Vous utilisez CellSeed comme graine pour un générateur de nombres aléatoires qui génère les coordonnées des points pour le diagramme de Voronoi.

Vous devez maintenant rechercher les bords du diagramme et les nœuds où plusieurs bords entrent en collision. Vous pouvez également stocker les informations dans un graphique pour un accès plus facile.

Après cette étape, vous pouvez rechercher sur le réseau des chemins valides.

Pour des chemins valides, vous pouvez maintenant créer les routes (elles ont des bords tranchants).

Remarque : Vous devez également générer les coordonnées du diagramme de Voronio pour toutes les cellules neightbor afin de ne pas avoir de bordures sur les bords de la cellule.

Si vous ne voulez pas d'arêtes vives, vous pouvez calculer le point médian de chaque connexion et utiliser la direction comme tangente pour une interpolation de Bézier entre deux arêtes du graphique.

À propos de l'utilisation de Voronoi-Diagramms

Pour archiver une ville comme des structures routières, les points de la fonction pseudo aléatoire peuvent être alignés sur une grille, de sorte que les chemins sont en forme de rectangle.

Pour plus de comté comme les routes, les points doivent être plus désordonnés.

diagramme de wikipedia

À propos de la fonction pseudo aléatoire pour générer les positions des points pour les diagrammes de Voronoï

Il peut s'agir d'une fonction aléatoire normale ou d'un ensemble Hammersley pour une distribution non uniforme plus agglutinée des points.


Avez-vous des exemples de fonction de hachage? J'ai le même objectif (monde infini qui utilise le voronoi pour les routes) mais je n'arrive pas à comprendre comment cela devrait être fait. Chaque lib voronoi que je peux trouver attend les coordonnées d'une boîte englobante qui va immédiatement à l'encontre du but.
BotskoNet

Non, la fonction de hachage sert uniquement à affecter une graine de départ à la cellule. Peut être quelque chose d'aussi trivial que x * prime1 + y * prime2 + z * prime3. Lorsque les nombres premiers sont inégaux les uns aux autres et idéalement grands, vous devez calculer ici avec des entiers 64 bits / non signés. Ce n'est pas un problème si la bibliothèque utilise un cadre de délimitation, car pour chaque cellule, il vous suffit de conserver tous les points de la cellule plus tous les points des cellules de voisinage (qui sont 8 cellules de voisinage).
Quonux

Vous rencontrerez probablement des problèmes de précision avec une seule précision si la bibliothèque utilise une seule précision ou si vous utilisez une seule précision. Pour contourner le problème si la bibliothèque utilise uniquement la précision simple et que vous ne procédez pas comme suit: Avant de convertir les positions en précision simple, soustrayez-leur la position globale de la cellule centrale, puis mettez-la sous forme de flottants dans la bibliothèque, puis transformez la résultats en arrière.
Quonux

En fait, je n'ai jamais implémenté cet algorithme, mais la fonction de hachage peut en effet être triviale.
Quonux

8

Pour la création de routes (et de villes), le meilleur papier que j'ai trouvé est celui-ci:

Modélisation procédurale des villes par Y Parish et P Müller

Celui-ci utilise le système L et peut générer des schémas routiers américains et européens. Si vous ne souhaitez pas générer de routes pour une ville entière, vous pouvez simplement générer les routes principales. Il peut prendre en entrée une carte des hauteurs, une carte des eaux et une carte de densité de population.


+1 juste parce que j'ai aimé le papier. Vraiment ne cadrait pas avec la façon dont je voulais tenter de générer les routes / chemins / rivières TOUT EN générant dynamiquement le terrain.
Mythics

6

http://vterrain.org/Culture/Roads/ La section "Génération de routes 3D" contient des informations sur la génération de routes .

Le problème avec les routes est qu'elles relient des points de repère (bien qu'elles suivent souvent le terrain au lieu d'aller directement de A à B).

Personnellement, je générerais le terrain, puis placerais des rivières (peut-être en utilisant l'érosion, voir http://vterrain.org/Water/ section "hydrogéologie"), puis placerais les villes dans des endroits où cela aurait du sens (par exemple près d'une rivière ou autre source d'eau, ou dans un endroit où l'eau pourrait être transportée vers des aqueducs ou des châteaux d'eau et des canalisations) et enfin générer des routes entre les villes.

Pour rendre cela plus facile à utiliser dans un monde procédural, vous pouvez créer des points intermédiaires sur le terrain où les routes seraient le plus susceptibles d'aller lorsqu'elles sont générées à cet endroit, puis connecter les points intermédiaires si une route est réellement créée à cet endroit.


4

Premièrement, les rivières et les routes sont très différentes. Les routes ont tendance à suivre des isolignes (élévation identique / similaire) - la raison étant qu'il est beaucoup plus facile de se déplacer sur des routes qui ne montent ou ne tombent pas beaucoup. Les rivières, par contre, se déplacent perpendiculairement aux isolignes / isoclines (en descente). Les rivières se forment dans des bassins (collections de montagnes qui coulent toutes vers le bas dans une vallée donnée) et tendent à former des structures arborescentes. De plus, les routes se déplacent souvent perpendiculairement aux rivières, afin de former des ponts logiques. La meilleure idée est de générer d'abord des rivières, puis de créer des routes logiques (c'est-à-dire des routes entre les villes). Je n'ai malheureusement pas le temps d'entrer dans les détails, mais j'espère que cela vous mettra sur la bonne voie.

Cela peut sembler évident, mais regardez Google Maps sur différents types de terrain et de routes; vous aurez une meilleure idée de leur apparence.


1
J'ai à nouveau modifié la question pour mieux faire comprendre que le réalisme ne m'intéresse pas autant que moi dans la façon dont l'algorithme devrait fonctionner. J'apprécie néanmoins la réponse, mais surtout pour certains des termes utilisés. Essayez de penser à mon désir plus comme des gribouillis de longueur aléatoire infinie pouvant être générés avec un minimum de données nécessaires (comme la carte de la hauteur).
Mythics
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.