Recherche de chemin efficace dans l'espace libre

12

J'ai un jeu situé dans l'espace, et j'aimerais émettre des ordres de mouvement, ce qui nécessite un cheminement. Maintenant, je crois comprendre que A * et autres s'appliquent principalement aux arbres, et non à l'espace vide qui n'a pas de nœuds d'orientation. J'ai quelques obstacles, qui sont actuellement exprimés en AABB fixes - c'est-à-dire qu'il n'y a pas d'obstacle "terrain" illimité. De plus, je m'attends à ce que la plupart des obstacles soient raisonnablement approximables sous forme de cubes ou de sphères.

J'ai donc pensé à appliquer un algorithme de recherche de chemin beaucoup plus simple, c'est-à-dire simplement lancer un rayon de la position actuelle à la position cible, puis je peux obtenir une liste des obstacles en utilisant le partitionnement spatial relativement rapidement. Je ne suis pas sûr de savoir comment déterminer la partie où l'unité commandée manoeuvre autour des obstacles.

Ce que j'ai pensé jusqu'à présent, c'est que j'utiliserai simplement des champs potentiels, c'est-à-dire que toutes les unités ressentiront une force de répulsion forte les unes des autres et une force modérée vers le point souhaité. Cela a également l'avantage que pour émettre des ordres de groupe, je peux simplement commander une force de niveau intermédiaire vers une autre entité. Mais cela n'atteindra évidemment pas la solution optimale.

Les champs potentiels atteindront-ils une approximation raisonnable compte tenu de mes paramètres, ou ai-je besoin d'une autre solution?

DeadMG
la source

Réponses:

7

Bien que les champs potentiels puissent fonctionner, j'imagine que vous aurez des problèmes avec les chemins sous-optimaux et les "minimums locaux" où vos unités seront piégées par les obstructions environnantes. A * convient aux environnements 3D en espace ouvert. Il s'agit simplement de générer un maillage de navigation adapté à vos besoins. Vous pouvez même utiliser des structures comme Octrees pour les nœuds de navigation. Plus la taille maximale de chaque octant est petite, plus le chemin est fluide. Consultez cet article des jeux Face à Face (maintenant disparu, lien de renvoi ajouté). A * combiné à l'optimisation des trajectoires (comme les raccourcis de ligne de visée) et aux comportements de direction et vous serez prêt à partir! Voir l'image ci-dessous comme exemple d'utilisation d'un octree pour les nœuds de chemin:

MichaelHouse
la source
Comment cela va-t-il évoluer sur des cartes plus grandes? Si j'avais une carte deux fois plus grande dans chaque dimension, j'aurais besoin de huit fois le nombre de nœuds, ce qui serait problématique.
DeadMG
Pas nécessairement. Vous pouvez conserver une taille de nœud importante jusqu'à ce que votre recherche s'en rapproche. Cela vous permet de garder les nœuds qui ne vous intéressent pas assez grands et peu nombreux.
MichaelHouse
Une belle propriété des mailles de navigation dans l'espace vide est l'égalité des coûts de voyage; vous pourrez peut-être utiliser A * JPS
Will
@ Will: J'ai fait un peu de recherche sur Google, mais je n'ai pas vraiment compris le seul algorithme de recherche de chemin qui a été proposé. Vous souhaitez publier une réponse à ce sujet?
DeadMG
@DeadMG, ceci est une explication définitive: harablog.wordpress.com/2011/09/07/jump-point-search <br/> Si vous pouvez implémenter A *, vous pouvez ensuite moderniser JPS assez simplement. Faites d'abord A * et ajoutez JPS comme optimisation.
Will