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:
la source
Réponses:
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.
À 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.
la source
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.
la source
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.
la source
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.
la source