Comprendre les comportements de pilotage fuite et arrivée

Les comportements de pilotage visent à aider les personnages autonomes à se déplacer de manière réaliste, en utilisant des forces simples qui se combinent pour produire une navigation improvisée et réaliste. Dans ce tutoriel, je vais couvrir la fuir comportement, qui éloigne le personnage du poursuivant, et le arrivée comportement qui ralentit et arrête le personnage à l'approche d'une cible.

Remarque: 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.


S'enfuir

Le comportement de recherche décrit précédemment repose sur deux forces qui poussent le personnage vers la cible: la vitesse souhaitée et la direction..

désiré_vitesse = normaliser (cible - position) * max_velocity pilotage = désir_vitesse - vélocité

le Vitesse désirée, dans ce cas, est le chemin le plus court entre le personnage et la cible. Il est calculé en soustrayant la position de la cible à celle du personnage. Le résultat est un vecteur de force qui va de la personnage vers la cible.


Rechercher un comportement

Le comportement de fuite utilise ces deux mêmes forces, mais elles sont ajustées pour rendre le personnage actif. une façon de la cible:


Comportement de fuite

Ce nouveau Vitesse désirée le vecteur est calculé en soustrayant le personnages position de la de la cible position, qui produit un vecteur qui va de la cible vers la personnage

Les forces résultantes sont calculées presque de la même manière que dans le comportement de recherche:

désiré_vitesse = normaliser (position - cible) * max_velocity pilotage = désiré_vitesse - vélocité

le Vitesse désirée dans ce cas, il s'agit de l'itinéraire d'échappement le plus simple que le personnage puisse utiliser pour fuir la cible. La force de direction force le personnage à abandonner son itinéraire actuel, le poussant dans la direction du vecteur vitesse souhaité.

En comparant le vecteur vitesse souhaité du comportement de fuite avec le vecteur vitesse souhaité du comportement de recherche, la relation suivante peut être établie:

flee_desired_velocity = -seek_desired_velocity

En d'autres termes, un vecteur est le négatif de l'autre.


Ajout de forces d'évacuation

Une fois que la force de direction est calculée, elle doit être ajoutée au vecteur vitesse du personnage. Puisque cette force éloigne le personnage de la cible, chaque image du personnage cessera de se déplacer vers la cible et commencera à s’éloigner de celle-ci, produisant une chemin de fuite (la courbe orange dans la figure ci-dessous):

L'ajout de ces forces et le calcul final de la vitesse / position sont traités de la même manière qu'auparavant. Ci-dessous, une démo montrant plusieurs personnages effectuant le comportement de fuite:


Déplacez la souris pour déplacer la cible.

Chaque caractère est placé au centre de la zone en mouvement avec une vitesse aléatoire. Ils vont essayer de fuir la cible (le curseur de la souris). L’ajout de toutes les forces oblige chaque personnage à quitter en douceur son itinéraire actuel et à fuir la cible..

Actuellement, la cible affecte tous les personnages, ignorant leur distance. il aurait pu être limité à une "zone d'effet", où le personnage ne s'enfuirait que s'il était suffisamment proche de la cible.


Arrivée

Comme nous l'avons vu, le comportement de recherche force un personnage à se rapprocher d'une cible. Quand il atteint la destination, la force de direction continue d’agir conformément aux mêmes règles, ce qui permet au personnage de "rebondir" en avant et en arrière autour de la cible..


Le comportement de recherche. Déplacez la souris pour déplacer la cible.

le arrivée comportement empêche le personnage de se déplacer à travers la cible. Cela ralentit le personnage à l'approche de la destination, s'arrêtant éventuellement à la cible.

Le comportement est composé de deux phases. La première phase est celle où le personnage est éloigné de la cible et fonctionne exactement de la même manière que le comportement de recherche (se déplacer à toute vitesse vers la cible).

La deuxième phase est celle où le personnage est proche de la cible, dans la "zone de ralentissement" (un cercle centré sur la position de la cible):

Lorsque le personnage entre dans le cercle, il ralentit jusqu'à s'arrêter à la cible.


Ralentir

Lorsque le personnage entre dans la zone de ralentissement, sa vitesse diminue de manière linéaire jusqu'à zéro. Ceci est réalisé en ajoutant une nouvelle force de direction (le force d'arrivée) au vecteur vitesse du personnage. Le résultat de cet ajout finira par devenir zéro, ce qui signifie que rien ne sera ajouté à la position du personnage à chaque image (il n'y aura donc aucun mouvement):

// Si (vitesse + direction) est égal à zéro, alors il n'y a pas de mouvement vitesse = troncature (vitesse + direction, vitesse maximale) position = position + fonction de vitesse tronquée (vecteur: Vector3D, max: Number): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i); 

Pour que le personnage ralentisse progressivement avant de s’arrêter, la vélocité ne doit pas devenir nulle immédiatement. Le processus de ralentissement progressif est calculé en fonction du rayon de la zone de ralentissement et de la distance entre le personnage et la cible:

// Calcule la vitesse désirée désiré_vitesse = cible - position distance = longueur (désirée_vitesse) // Vérifie la distance pour détecter si le caractère // se trouve dans la zone de ralentissement si (distance < slowingRadius)  // Inside the slowing area desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius)  else  // Outside the slowing area. desired_velocity = normalize(desired_velocity) * max_velocity  // Set the steering based on this steering = desired_velocity - velocity

Si la distance est supérieure à slowingRadius, cela signifie que le personnage est loin de la cible et que sa vitesse doit rester max_velocity.

Si la distance est inférieure à slowingRadius, cela signifie que le personnage est entré dans la zone de ralentissement et que sa vitesse doit être réduite.

Le terme distance / ralentissementRadius variera de 1 (quand distance équivaut à slowingRadius) à 0 (quand distance est presque nul). Cette variation linéaire ralentira la vitesse en douceur:

Comme décrit précédemment, le mouvement du personnage est exécuté comme suit:

direction = vitesse souhaitée - vitesse vitesse = tronquée (vitesse + direction, vitesse maximale) position = position + vitesse

Si la vitesse désirée est réduite à zéro, alors la force de direction devient -rapidité. En conséquence, lorsque cette force de direction est ajoutée à la vitesse, le résultat est zéro, ce qui empêche le personnage de bouger..

Ci-dessous une démo montrant le comportement à l’arrivée:


Déplacez la souris pour déplacer la cible.

En réalité, le comportement à l’arrivée consiste à calculer une force égale à -rapidité, empêchant le personnage de se déplacer aussi longtemps que cette force est en place. Le vecteur de vitesse d'origine du personnage ne change pas et continue de fonctionner, mais il est annulé par l'ajout de la direction..

Si la force de direction à l’arrivée est levée, le personnage recommencera à bouger, en utilisant son vecteur de vitesse original..


Conclusion

Le comportement de fuite oblige le personnage à s'éloigner de la cible souhaitée, tandis que le comportement à l'arrivée le ralentit et s'arrête à la position de la cible. Les deux peuvent être utilisés pour créer une sortie en douceur ou suivre des modèles de mouvement, par exemple. Ils peuvent également être combinés pour créer des mouvements encore plus complexes.

Ce tutoriel a décrit plus en détail les comportements de direction, expliquant les comportements de fuite et d'arrivée. Au cours des prochains articles, nous en apprendrons davantage sur les comportements. Tenez-vous au courant en nous suivant sur Twitter, Facebook ou Google+.