Ma question est quelle serait la meilleure approche pour trouver un chemin sur une surface planétaire inégale?
Informations d'arrière-plan
J'ai créé une planète à partir d'un déplacement cartographiant 6 plans projetés de sphère. Les plans ont initialement formé un cube avant d'être projetés en forme de sphère.
Je me demande s'il est possible d'utiliser chaque "face de cube de sphère projetée" comme grilles et d'utiliser un simple algorithme A * pour trouver le meilleur itinéraire possible, j'aimerais aussi que la hauteur de déplacement soit prise en compte pour que le chemin évite de grimper montagnes, etc. (je suppose que ce ne serait qu'une heuristique dans l'algorithme A *) Une autre considération est que j'ai réalisé un mouvement planétaire en tirant parti du moteur physique d'Unity3d, en appliquant la gravité vers le centre de la planète. Ma solution proposée exigerait-elle que le mouvement des agents soit contrôlé indépendamment de la physique gravitationnelle.
Pour aider à mieux articuler ma question, voici mon corps planétaire actuel:
Réponses:
Il semble que vous ayez déjà répondu à votre propre question. Un * est probablement la meilleure approche. Oui, bien sûr, il peut être utilisé de la manière que vous décrivez, y compris en utilisant les informations de hauteur pour éviter les montagnes. Tant que vous êtes en mesure d'accéder à des informations sur n'importe quelle grille à la surface de votre monde, il n'y a aucune raison que vous ne puissiez pas l'utiliser dans l'heuristique A *.
Enfin, vous confondez la recherche de chemin avec le suivi de chemin à la fin de votre question. La recherche de chemin ne se soucie pas de la gravité, sauf si vous l'ajoutez comme heuristique et puisque vous êtes à la surface d'une planète, la gravité sera essentiellement la même sur toute la surface. De nombreux jeux ont de la gravité et du mouvement, je ne vois aucune raison pour laquelle vous ne pouvez pas.
Fondamentalement, nous voulons cartographier le passage du rouge au bleu, pour être le même sur une sphère que sur un cube.
Comme A * obtient fréquemment des voisins sur son nœud actuel, vous pouvez facilement créer un ensemble de fonctions pour obtenir des nœuds adjacents. Par exemple,
getXPlus()
,getXMinus()
,getZPlus()
et ainsi de suite. Ces fonctions prendront le nœud actuel et retourneront le nœud dans la direction spécifiée par le nom de la fonction.La plupart du temps, ces fonctions peuvent simplement incrémenter une valeur et être effectuées, cependant, sur les bords, cela changera.
Vous souhaiterez mapper la surface de votre cube sur un système de coordonnées 2D. Quoi que vous fassiez, cela ne dépend que de vous, ils n'ont pas à s'aligner, il suffit de donner à chaque espace de la grille une coordonnée X, Y unique.
Maintenant, sur une arête, et en obtenant l'espace de grille adjacent, cela n'augmentera pas nécessairement les coordonnées. Nous devons trouver la face vers laquelle nous allons et passer aux coordonnées de cette face.
Par exemple, obtenir les coordonnées XPlus ici changera les coordonnées X et Y parce que nous nous déplaçons vers un nouvel espace de grille sur une nouvelle face. La ligne verte représente un bord entre deux faces.
Maintenant, ce ne sont que des coordonnées globales, il peut être plus facile d'utiliser un système de coordonnées local interne, avec une 3ème dimension qui représente la face du cube sur laquelle vous vous trouvez actuellement.
Dans les deux cas, vous devez avoir une coordonnée unique pour chaque espace de grille sur la face du cube. Le déplacement entre eux dépendra de la façon dont vous implémentez le système de coordonnées. Vous devez également savoir où ces coordonnées correspondent à la surface de la sphère.
Tout cela devrait finalement être résumé afin que vous ne le sachiez même pas.
la source