Pathfinding dynamique en temps réel?

19

Je fais actuellement des recherches d'orientation et ma simulation est la suivante: j'ai une scène 3D avec un point de départ et d'arrivée représenté, je suis capable de créer des maillages de navigation, des waypoints et des polygones pour aider à la recherche d'itinéraires.

J'ai essayé un algorithme A * et certaines de ses variantes et ils fonctionnent parfaitement. Cependant, maintenant je suis plus intéressé par la recherche de chemin «dynamique». Par exemple, tout en trouvant un chemin du point A au point B, si un nouvel obstacle apparaît soudainement, je veux que mon algorithme puisse immédiatement replanifier un chemin et ne pas recommencer la recherche à partir de zéro.

J'ai fait quelques lectures sur l'algorithme D * et je me demande si cela serait approprié pour ce dont j'ai besoin ou si cela semble être une surpuissance.

Donc, mes questions sont essentiellement les suivantes: quel algorithme serait le mieux pour la recherche dynamique de chemin en temps réel? OU quelle combinaison de techniques pourrais-je utiliser à la place?

Andrei
la source
Je ne sais pas quel algorithme ils utilisent, donc ce n'est pas une réponse, mais j'imagine que c'est ce que vous essayez d'émuler: vidéo youtube
MichaelHouse
Et l'extension A *? Étendre ce qui est stocké dans les nœuds de ses ensembles ouverts / fermés par ce que vous voulez et étendre A * pour le considérer.
user712092
Je cherchais la réponse comme vous et j'ai trouvé un article sur HPA * et il est lié au jeu vidéo. Je cherche toujours un article et je vais probablement le mettre en œuvre. Jusqu'à présent, il est logique pour moi d'améliorer les performances et il peut être utilisé à la fois dans un environnement statique et dynamique. Voici l' article
NelsonPunch

Réponses:

19

D * est très impliqué - je ne recommande pas d'essayer de le mettre en œuvre. Même lorsque des projets qui sont bien financés et développés par des gens intelligents / expérimentés, D * lite est utilisé, car D * est une telle difficulté à bien faire les choses.

Vous pouvez être intéressé par cette présentation, qui comprend une discussion sur l'orientation de Left 4 Dead:

http://www.valvesoftware.com/publications/2009/ai_systems_of_l4d_mike_booth.pdf

Une approche consiste à utiliser une recherche A * de niveau grossier pour obtenir un chemin général pour un agent, puis à effectuer une recherche détaillée de niveau A * pour l'environnement local d'un agent. De cette façon, vous pouvez recalculer rapidement la recherche détaillée A * du parcours si le terrain change, puis recalculer rapidement la recherche détaillée A * pour un petit segment de l'environnement. Ce n'est pas parfait. Cela fonctionne tant que vos obstacles ne peuvent pas bloquer plusieurs nœuds de graphique de détail de parcours, ce qui est bien pour la plupart des jeux. C'est la méthode que je recommande si vous avez moins de 100 agents.

Si vous souhaitez prendre en charge des centaines ou des milliers d'agents, vous pouvez implémenter quelque chose comme des foules de continuum. Voir cette recherche: http://grail.cs.washington.edu/projects/crowd-flows/ qui traite d'une méthode purement basée sur le CPU qui peut prendre en charge des milliers d'acteurs dans un environnement dynamique.

Si vous souhaitez prendre en charge des dizaines de milliers ou des centaines de milliers d'agents, vous pouvez implémenter quelque chose comme des foules de continuum, avec l'aide du GPU. Voir ici pour la recherche pertinente: https://a248.e.akamai.net/f/674/9206/0/www2.ati.com/misc/siggraph_asia_08/GPUCrowdSimulation_SLIDES.pdf

Voici une vidéo montrant les foules du continuum en action: http://www.youtube.com/watch?v=lGOvYyJ6r1c (passez à 4:10 pour voir de grands obstacles dynamiques comme des voitures et des feux de signalisation affectant des centaines de personnes se promener dans une ville.)

Olhovsky
la source
Merci pour les liens. D * Lite semble juste d'après ce que j'ai lu
Andrei
9

Avez-vous étudié des comportements de pilotage simples?

http://www.red3d.com/cwr/steer/

Vous pouvez les utiliser pour dévier de votre chemin A * afin d'éviter les obstacles locaux, puis revenir sur votre chemin une fois que vous avez terminé.

Il est également assez facile de combiner plusieurs comportements.

BigSandwich
la source
+1. Je ne sais pas pourquoi cela a été rejeté. Bien que ce soit simple, et peut-être pas la réponse que le demandeur cherchait, je pense que c'est sur le sujet et je l'ai trouvé utile :)
Olhovsky
1
J'ai lu et mis en œuvre ce comportement de pilotage dans notre dernier jeu. Maintenant, nous allons le remplacer à nouveau par d'autres méthodes. Je pense que cela ne fonctionne pas bien avec des chemins optimaux pré-calculés. La «combinaison» de plusieurs comportements donne généralement de mauvais résultats. Si vous prévoyez toujours de l'utiliser, n'essayez pas de diriger et de suivre votre chemin en même temps. Au lieu de cela, passez à 100% de direction et revenez à 100% une fois que vous avez passé l'obstacle.
Imi
4

Étant donné que votre message se trouve dans la partie "Développement de jeu" de l'échange de pile, voici ce que la plupart des programmeurs de jeux vous répondraient: il ne s'agit pas de Pathfinding dynamique en temps réel, il s'agit de Dynamic Path en temps réel * suivant *!

Dans certains cas de bord où un bord de votre graphique de navigation est totalement obstrué, le pathfinder doit recalculer un autre chemin, mais la plupart du temps, vous pouvez simplement diriger vos entités autour des obstacles, faire une prédiction de position et éviter dans la bonne direction. Pour la plupart des jeux, il serait trop lourd de devoir prédire au fil du temps la position des agents dynamiques, d'autant plus que vous ne pouvez pas prédire avec précision les actions des joueurs ou les décisions des agents.

Donc, mon conseil serait de commencer par implémenter des comportements de pilotage (http://red3d.com/cwr/steer/), gérer les cas où le chemin devient impossible, puis ajouter une couche au-dessus pour gérer les cas de bord qui ne sont pas '' t géré par les deux solutions précédentes.

J'espère que cela t'aides

emartel
la source
Euh non. "Suivi de chemin" est identique à la recherche de chemin. Il existe de nombreuses approches qui permettent de suivre en temps réel des milliers d'agents lorsque les obstacles changent, sur un ordinateur de bureau. Certes, il n'est pas trop cher de trouver un chemin pour un seul agent, lorsque les obstacles se déplacent. Voici une telle approche, parmi tant d'autres: grail.cs.washington.edu/projects/crowd-flows Il existe des versions accélérées GPU des foules de continuum.
Olhovsky
Je devrais être en désaccord sur celui-ci. Tout moteur traitera la recherche de chemin et le suivi de chemin comme deux problèmes distincts, le premier étant une recherche graphique de la zone navigable et l'autre ayant l'intention de rechercher le vecteur de mouvement optimal dans l'espace local. J'ai travaillé sur une telle simulation de foule produisant un middleware utilisé par les jeux AAA sans avoir besoin de s'appuyer sur le GPU. La plupart des implémentations utilisent un champ d'écoulement (le pathfinder) et une direction pour suivre le flux et éviter d'autres agents (le pathfollower). Comme ma réponse l'a indiqué, il s'agit d'une réponse de "programmeur de jeux", pas d'une réponse académique.
emartel
Je sais que vous n'avez pas besoin du GPU pour les foules contiuum, c'est pourquoi j'ai lié une version basée sur CPU. Votre description du suivi de chemin est toujours une recherche de chemin, c'est juste une recherche de chemin à un niveau de détail différent, sur un ensemble de données différent. Donc, ce que vous avez vraiment, c'est une passe de recherche de détails de cours et une passe de recherche de détails fins. En fin de compte, vous essayez de trouver le chemin qu'un acteur doit suivre. Inventer de nouveaux termes pour cela confond simplement les choses.
Olhovsky
1
Je suis désolé mais "suivre le chemin" n'est pas un terme inventé. Lisez les documents produits par l'industrie et vous les verrez utilisés à maintes reprises: lien ou lien juste pour en relier quelques-uns. Malheureusement, je ne peux pas vous lier aux documentations protégées par NDA des moteurs / middlewares largement utilisés dans l'industrie.
emartel
1
Votre premier lien est le lien que j'ai donné dans ma réponse btw. Très bien, il pourrait être juste de décrire ce type de recherche de chemin comme un suivi de chemin. En fin de compte, ils essaient tous les deux de trouver le chemin à suivre, mais je pense que dans ce cas, je me trompe, et nous devrions appeler ce que nous voyons dans votre deuxième lien comme chemin suivant. Par exemple, l'acte de relier des points de chemin grossiers avec des splies cubiques / des courbes de Biezer / insérer votre méthode ici. Cela dit, je suis toujours fortement en désaccord sur le fait qu'il n'est pas possible de mettre en œuvre la recherche de chemin autour des obstacles dynamiques, comme votre réponse semble le suggérer.
Olhovsky