Comprendre les comportements de pilotage poursuite et évasion

Jusqu'ici, nous avons examiné les comportements de recherche, de fuite, d'arrivée et de dérapage. Dans ce tutoriel, je vais couvrir la poursuite et le éluder comportements qui font que vos personnages suivent ou évitent la cible.

RemarqueRemarque: bien que ce tutoriel ait été écrit avec AS3 et Flash, vous devriez pouvoir utiliser les mêmes techniques et concepts dans presque tous les environnements de développement de jeux. Vous devez avoir une compréhension de base des vecteurs mathématiques.


Qu'est-ce qu'une poursuite??

Une poursuite est le processus de suivi d'un objectif visant à attrape ça. Il est important de noter que le mot "capture" fait toute la différence ici. Si quelque chose ne fait que suivre une cible, il suffit de répéter les mouvements de la cible et, par conséquent, elle sera sur la bonne voie..

Lorsqu'il poursuit quelque chose, le poursuivant doit suivre la cible, mais il doit également anticiper la cible dans un proche avenir. Si vous pouvez prédire (ou estimer) où sera la cible dans les prochaines secondes, il est possible d'ajuster la trajectoire actuelle pour éviter les itinéraires inutiles:


Prédire le futur

Comme décrit dans les premiers tutoriels, le mouvement est calculé à l'aide de l'intégration d'Euler:

position = position + vitesse

En conséquence directe, si la position et la vitesse du personnage actuel sont connues, il est possible de prédire où il se situera dans la prochaine. T mises à jour du jeu. En supposant que le personnage se déplace en ligne droite et que la position que nous voulons prédire a trois mises à jour à venir (T = 3), la position future du personnage sera:

position = position + vitesse * T

La clé d’une bonne prédiction est la bonne valeur pour T. Si la valeur est trop élevée, cela signifie que le poursuivant finira par chasser un fantôme. Si T est trop proche de zéro, cela signifie que le poursuivant ne poursuit pas l'objectif, mais le suit (aucune prédiction).

Si la prévision est calculée pour chaque cadre de jeu, cela fonctionne même si la cible change constamment de direction. Chaque mise à jour, une nouvelle "position future" est générée en fonction du vecteur de vitesse actuel du personnage (qui guide également la direction du mouvement).


Poursuivre

Le comportement de poursuite fonctionne à peu près de la même manière que la recherche. La seule différence est que le poursuivant ne cherchera pas la cible elle-même, mais sa position dans un avenir proche..

En supposant que chaque personnage du jeu soit représenté par une classe nommée Boid, Le pseudo-code suivant implémente l'idée de base du comportement de poursuite:

 fonction publique poursuite (t: Boid): Vector3D T: int = 3; futurePosition: Vector3D = t.position + t.velocity * T; retourne chercher (futurePosition); 

Après le calcul de la force de poursuite, il doit être ajouté au vecteur de vitesse, comme toutes les forces de direction précédentes:

 public function update (): void pilotage = poursuite (cible) pilotage = tronqué (pilotage, max_force) pilotage = pilotage / vitesse masse = tronqué (vitesse + pilotage, vitesse maximale) position = position + vitesse

La figure ci-dessous illustre le processus:

Le poursuivant (le personnage du bas) cherchera la position future de la cible, en suivant une trajectoire décrite par la courbe orange. Le résultat final sera:


Le comportement de poursuite en utilisant T = 30. Cliquez sur la démo pour afficher les vecteurs de force. La cible cherche la souris.


Améliorer la précision de la poursuite

Il y a un problème lorsque la valeur de T est constante: la précision de la poursuite a tendance à être mauvaise lorsque la cible est proche. En effet, lorsque la cible est proche, le poursuivant continuera à rechercher la prédiction de la position de la cible, ce qui est T cadres "loin".

Ce comportement ne se produirait jamais dans une vraie poursuite car le poursuivant saurait qu'il est suffisamment proche de la cible et devrait arrêter de prédire sa position..

Il existe un truc simple qui peut être mis en œuvre pour éviter cela et améliorer considérablement la précision de la poursuite. L'idée est très simple. au lieu d'une valeur constante pour T, un dynamique est utilisé:

 T = distanceBetweenTargetAndPursuer / MAX_VELOCITY

Le nouveau T est calculé en fonction de la distance entre les deux personnages et de la vitesse maximale que peut atteindre la cible. En termes simples, le nouveau T veux dire "combien de mises à jour la cible doit-elle passer de sa position actuelle à la position de poursuivant".

Plus la distance est longue, plus haut T sera donc le poursuivant cherchera un point loin de la cible. Plus la distance est courte, plus bas T sera, ce qui signifie qu'il cherchera un point très proche de la cible. Le nouveau code pour cette implémentation est:

 fonction publique poursuite (t: Boid): Vector3D var distance: Vector3D = t.position - position; var T: int = distance.longueur / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * T; retourne chercher (futurePosition); 

Le résultat final est:


Le comportement de poursuite en utilisant une dynamique T. Cliquez sur la démo pour afficher les vecteurs de force. La cible cherche la souris.


Évitant

Le comportement d'évitement est le contraire du comportement de poursuite. Au lieu de rechercher la position future de la cible, dans le comportement d'évitement, le personnage fuira cette position:

Le code pour éviter est presque identique, seule la dernière ligne est modifiée:

 fonction publique éludée (t: Boid): Vector3D var distance: Vector3D = t.position - position; var updatesAhead: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * updatesAhead; retourne en fuite (futurePosition); 

Le résultat final est le suivant:


Le comportement d'évasion. Cliquez sur la démo pour afficher les vecteurs de force. La cible cherche la souris.

Conclusion

Ce tutoriel décrit la poursuite et les comportements d'évitement, qui sont parfaits pour simuler une variété de modèles, tels qu'un groupe d'animaux essayant de s'échapper d'un chasseur..

J'espère que vous avez apprécié ces conseils jusqu'à présent et que vous pouvez commencer à utiliser tous ces comportements, en les combinant pour créer des modèles encore meilleurs! Tenez-vous au courant en nous suivant sur Twitter, Facebook ou Google+.