Comment suivez-vous le cheminement de l'IA dans un moteur physique 2D comme farseer / box2d?

12

Je suis en train de déplacer un jeu 2D vers le haut sur lequel j'ai travaillé dans un moteur de physique du corps rigide approprié comme Farseer. Jusqu'à présent, je venais de pirater mon propre code de physique là où c'était nécessaire.

J'essaie d'apprendre la bonne façon de faire les choses ici.

Quelle est la bonne façon de faire suivre à votre IA une trajectoire définie une fois que vous les avez transformés en corps rigides à l'intérieur du moteur physique?

Si j'ai un chemin de nœuds de navigation sur ma carte que j'ai besoin de l'IA pour suivre, auparavant, je les déplacerais simplement le long du chemin manuellement en calculant la position suivante où ils devraient être pour le prochain pas de temps et en les réglant manuellement à cette position .

Mais maintenant, ce sont des corps rigides et sujets aux collisions et à toutes les forces qui pourraient les frapper et les faire tomber.

Donc, pour faire bouger l'IA, je pense que je devrais maintenant leur appliquer des impulsions / forces? Je ne devrais plus définir manuellement leur position à chaque image.

Je pense donc que je dois passer d'un monde déterministe où je force l'IA à suivre strictement un chemin vers un monde non déterministe où ils pourraient se faire renverser dans n'importe quelle direction s'ils sont touchés et je les pousse simplement vers le prochain nœud du chemin pour les faire bouger.

Est-ce correct? Est-ce ainsi que les autres le font?

Cela soulève des questions sur la façon d'éviter que votre IA ne reste coincée dans des coins de paysage maintenant qu'ils ne suivent pas un chemin précis, comment gérez-vous ce genre de chose?

Ou est-il préférable de mélanger d'une manière ou d'une autre les deux et de laisser votre IA suivre un chemin fixe en définissant leur position manuellement, et ne réagir à d'autres forces que dans certaines circonstances que vous pouvez facilement contrôler?

Merci pour tout conseil les gars.

TerryB
la source
1
+1 Je suis également très intéressé à en savoir plus à ce sujet.
David Gouveia

Réponses:

7

Les comportements de direction fonctionnent très bien en combinaison avec un moteur physique, car ils sont généralement mis en œuvre de manière à renvoyer une "force de direction" qui peut ensuite être appliquée à votre corps physique.

Pour obliger une unité à suivre un chemin, vous pouvez utiliser Seek pour passer d'un nœud de chemin à un nœud de chemin (assurez-vous d'éviter le dépassement), puis utiliser Arrivée au dernier nœud de votre chemin.

Quant à vos préoccupations concernant le blocage: la modélisation du suivi de chemin à l'aide de forces devrait en fait être assez précise. Vous avez raison de penser qu'un objet peut être projeté hors du chemin s'il entre en collision avec un autre objet, mais puisque vous calculerez une force de direction dans chaque mise à jour, l'objet devrait être à nouveau sur la bonne voie en un rien de temps. Si l'écart par rapport à la trajectoire après une collision peut potentiellement être énorme, je vous suggère de vous souvenir de votre dernière position chaque fois qu'une collision se produit, puis de ramener l'objet vers cette dernière position avant de poursuivre l'itinéraire normal.

bummzack
la source
Article incroyable, merci pour le partage. J'ai sauvé ma journée.
Ricardo Sanchez-Saez
0

Je dirais que vous êtes sur la bonne voie, vous voudrez peut-être consulter cet article:

http://www.policyalmanac.org/games/aStarTutorial.htm

Il explique certains évitement de collision de base et la recherche de chemin à l'aide de l'algorithme A *.

Éditer:

Si vous n'avez vraiment besoin que de la meilleure façon de propulser vos objets dans la bonne direction, alors vous devez utiliser une force (disons MovementForce ou autre) pointant dans la direction du meilleur chemin que vous avez trouvé en utilisant l'algorithme de recherche de chemin de votre choix

de manière annonciatrice
la source
Je ne pense pas que cet article soit pertinent pour cette question. L'OP ne demande pas comment trouver le chemin optimal entre deux lieux, mais plutôt comment faire suivre à un acteur un chemin qu'il a déjà calculé, dans le cadre d'une simulation physique.
David Gouveia
bien quand je l' ai lu à nouveau je vois votre point, Ill modifier ma réponse
annonymously
:) J'ai aussi changé le titre pour clarifier les choses. Certainement intéressé par le suivi de chemin plutôt que de trouver le chemin.
TerryB
0

À en juger par ce que @davidluzgouveia a commenté sur le post de manière anonyme, je présenterai mon projet. Le suivi de chemin et la recherche de chemin sont cependant très différents. La recherche de chemin est plus de ce que publiait publiquement, et pour la recherche de chemin, j'examinerais l'algorithme de Dijkstra. Pour suivre le chemin, j'utilise entièrement mon moteur physique de choix. La façon dont je l'ai configuré est que chaque emplacement vers lequel une classe d'unité marche, est configuré dans sa sous-classe de cheminement via des décalages 2D, oui, ils sont 2D et non 3D, c'est à cause de la façon dont ma physique est configurée dans mon jeu .

Explication 3D: Chaque unité n'a qu'un seul collisionneur principal qui est exclusivement configuré pour une collision avec le terrain et les objets du monde. C'est une forme de capsule et a un rayon et une hauteur par programme. Il est construit au centre du modèle et devrait s'étendre juste après l'avant et le haut du modèle. Mais j'ai également un décalage de surface pour savoir à quelle distance il est au-dessus du sol à tout moment, et un flotteur de combien il est autorisé à glisser vers le bas avant de rebondir légèrement, à la fois. Cela semble que j'applique une sorte de correctif vissé pour un problème de collision avec le terrain, mais j'ai mes raisons.

Quoi qu'il en soit, vous devez appliquer une force à cet objet capsule, et il doit rester en permanence au-dessus du sol. Cela ne veut pas dire que ça ne peut pas aller plus haut, juste que ça ne peut pas aller plus bas. La raison pour laquelle il doit planer (dans mon cas) est parce que dans un moteur physique de corps rigide et de ragdoll, les jambes de mes unités sont animées de manière procédurale. Ainsi, en appliquant une force simple à la capsule, les jambes de mon entité se repositionneront d'elles-mêmes. Ils auront également leurs applications de gravité séparées! Ce que cela permet, c'est que si mon personnage est incliné, un pied peut être à une altitude inférieure à l'autre.

C'est exactement ainsi que vous devez procéder. À en juger par ce que vous demandez, c'est. Si vous voulez laisser de côté certaines fonctionnalités, c'est bien sûr, surtout si c'est un RTS ou un FPS et que personne ne verra jamais les pieds ou ne s'en souciera de toute façon. Mais en général, l'unité devrait avoir un objet de collision PRINCIPAL qui fonctionne avec le mouvement du personnage presque exclusivement.

Spécifiquement 2D: Vous devez toujours avoir un point principal, ou juste une sorte de référence, pour que le moteur se déplace, c'est pour le mouvement d'une unité. Vous pouvez donner à chaque unité une sous-classe de chemin qui a quelques emplacements dont elle a besoin, vous pouvez la spécifier dans le code de niveau, (par exemple emplacement1 (x, y) emplacement2 (x, y) etc.) la meilleure façon (je ne Je ne sais pas sur quel type de jeu vous travaillez) serait probablement de spécifier des emplacements dans le niveau et de faire en sorte que chaque unité les traite dans l'ordre spécifié par le niveau et après avoir atteint chaque emplacement, faites-le remplacer l'emplacement souhaité par le prochain, il doit arriver.

Il y a des tonnes de façons de modifier cela, comme avoir une liste d'emplacements en premier lieu pour chaque unité, car cela signifierait que toutes les unités ne doivent pas aller aux mêmes emplacements. Cependant, de la même manière, vous pouvez également le faire dans le code de niveau (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) peu importe)

Juste quelques idées! Je vous suggère de lire la version 3D même si elle est beaucoup moins pertinente.

EDIT: J'ai décidé de fournir les deux pour tous ceux qui pourraient lire ceci (oui c'est vrai) .... (Au départ, j'ai seulement survolé votre question et je n'ai pas réalisé qu'elle était assez spécifique à la 2D jusqu'à ce que je la relise>.>)

Joshua Hedges
la source