Comprendre les comportements de pilotage suivi du leader

En plus de la capacité de suivre un chemin, un personnage (ou un groupe d'entre eux) doit également être capable de suivre un personnage spécifique (comme un chef d'équipe). Ceci peut être réalisé en utilisant le leader suivant comportement, que je vais expliquer dans ce tutoriel.

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.


introduction

Le comportement suivant du leader est une composition d'autres forces de direction, tous agencés pour faire en sorte qu'un groupe de personnages suive un caractère spécifique (le leader). Une approche naïve utiliserait la recherche ou la poursuite pour créer un modèle de suivi, mais le résultat n'est pas assez bon.

Dans le comportement de recherche, un personnage est poussé vers une cible, occupant éventuellement le même emplacement que cette cible. Le comportement de poursuite, en revanche, pousse un personnage vers un autre personnage, mais vise à l'attraper (sur la base de prédictions) au lieu de simplement le suivre..

Dans le comportement de leader suivant, l’objectif est de rester suffisamment proche du leader, mais légèrement derrière. Le personnage doit également se déplacer plus rapidement vers le leader lorsqu'il est éloigné, mais devrait ralentir lorsque la distance est petite. Tout cela peut être réalisé en combinant trois comportements de direction:

  • Arrivée: avancez vers le chef et ralentissez graduellement pour éventuellement arrêter le mouvement.
  • Esquive: si le personnage est dans le chemin du leader, il devrait s'éloigner rapidement.
  • Séparation: évitez l'entassement lorsque plusieurs personnages sont après le chef.

Les sections suivantes expliquent comment chacun de ces comportements est combiné pour créer le modèle suivant de chef.


Trouver le bon endroit à suivre

Un personnage doit essayer de rester légèrement derrière le leader pendant le processus suivant, comme une armée qui reste derrière son commandant. Le point à suivre (nommé derrière) peut être facilement calculé en fonction de la vitesse de la cible, car il représente également la direction du caractère. Vérifiez le pseudo-code:

tv = leader.velocity * -1; tv = normaliser (tv) * LEADER_BEHIND_DIST; derrière = leader.position + tv;

Si le vecteur vitesse est multiplié par -1, le résultat est le inverse du vecteur vitesse. Ce vecteur résultant (appelé la télé) peut ensuite être normalisé, mis à l'échelle en conséquence et ajouté à la position actuelle du personnage.

Voici une représentation visuelle du processus:

Opérations vectorielles impliquées dans la recherche du bon endroit à suivre.

Le meilleur LEADER_BEHIND_DIST plus la distance entre le leader et le point arrière est grande. Puisque les personnages suivront ce point, plus ils seront éloignés du leader, plus ils resteront éloignés du leader..


Suivre et arriver

La prochaine étape est de faire en sorte qu'un personnage suive celui du leader derrière point. Comme tous les autres comportements, le processus suivant sera guidé par une force, générée par le suivreLeader () méthode:

fonction privée followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); force var: Vector3D = nouveau Vector3D (); // Calcule le point de retard tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); derrière = leader.position.clone (). add (tv); // Crée une force pour arriver au point derrière force = force.add (arrive (en arrière)); force de retour; 

La méthode calcule la derrière point et crée une force pour arriver à ce point. le suivreLeader la force peut ensuite être ajoutée à la force de pilotage du personnage, comme tous les autres comportements:

direction = rien (); // le vecteur nul, signifiant "magnitude zéro force" Steering = Steering + followLeader (); direction = troncature (direction, force max.) direction = direction / vitesse de la masse = troncature (vitesse + direction, vitesse maximale) position = position + vitesse

Le résultat de cette implémentation est un groupe de personnages pouvant arriver chez le leader derrière point:

Les personnages suivent le leader. Déplacez le curseur de la souris pour guider le leader. Cliquez pour afficher les forces.

Éviter le surpeuplement

Lorsque les personnages sont très proches les uns des autres tout en suivant le leader, le résultat peut paraître non naturel. Étant donné que tous les personnages seront influencés par des forces similaires, ils ont tendance à se déplacer de la même manière, formant un "blob". Ce modèle peut être corrigé à l'aide de la séparation, l'une des règles qui guident le comportement de flocage.

La force de séparation empêche un groupe de personnages de s'entasser et reste donc à une certaine distance les uns des autres. La force de séparation peut être calculée comme suit:

séparation de fonctions privées (): Vector3D var force: Vector3D = new Vector3D (); var neighbourCount: int = 0; pour (var i: int = 0; i < Game.instance.boids.length; i++)  var b :Boid = Game.instance.boids[i]; if (b != this && distance(b, this) <= SEPARATION_RADIUS)  force.x += b.position.x - this.position.x; force.y += b.position.y - this.position.y; neighborCount++;   if (neighborCount != 0)  force.x /= neighborCount; force.y /= neighborCount; force.scaleBy( -1);  force.normalize(); force.scaleBy(MAX_SEPARATION); return force; 

La force de séparation peut ensuite être ajoutée à la suivreLeader force, le rendant capable de repousser les personnages les uns des autres en même temps qu'ils essayent d'arriver chez le leader:

fonction privée followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); force var: Vector3D = nouveau Vector3D (); // Calcule le point de retard tv.scaleBy (-1); tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); derrière = leader.position.clone (). add (tv); // Crée une force pour arriver au point derrière force = force.add (arrive (en arrière)); // Ajoute la force de séparation force = force.add (separation ()); force de retour; 

Le résultat est un modèle suivant beaucoup plus naturel:

Caractères suivant le leader utilisant la séparation. Déplacez le curseur de la souris pour guider le leader. Cliquez pour afficher les forces.

Rester à l'écart

Si le chef change soudainement la direction actuelle, il est possible que les personnages finissent par se mettre en travers du chemin du chef. Puisque les personnages suivent le leader, cela n'a aucun sens de leur permettre de rester devant le leader.

Si un personnage gêne le leader, il doit immédiatement s'éloigner pour dégager la route. Ceci peut être réalisé en utilisant le comportement d'évasion:

Esquiver la route du leader

Pour vérifier si un personnage est à la vue du leader, nous utilisons un concept similaire à celui utilisé pour détecter les obstacles dans le comportement d'évitement de collision: en fonction de la vitesse et de la direction actuelles du leader, nous projetons un point devant lui (appelé devant) si la distance entre le chef devant le point et le personnage est inférieur à 30, par exemple, alors le personnage est aux yeux du leader et doit bouger.

le devant le point est calculé exactement comme le derrière point, avec la différence que le vecteur vitesse n’est pas inversé:

tv = leader.velocity; tv = normaliser (tv) * LEADER_BEHIND_DIST; à venir = leader.position + tv;

le suivreLeader () Cette méthode doit être mise à jour pour vérifier si le personnage est visible du chef. Si cela se produit, la variable Obliger (représentant la force suivante) est ajouté par le retour de échapper (leader), qui renvoie une force pour échapper à l'emplacement du chef:

fonction privée followLeader (leader: Boid): Vector3D var tv: Vector3D = leader.velocity.clone (); force var: Vector3D = nouveau Vector3D (); // Calcule le point d'avance tv.normalize (); tv.scaleBy (LEADER_BEHIND_DIST); ahead = leader.position.clone (). add (tv); // Calcule le point de retard tv.scaleBy (-1); derrière = leader.position.clone (). add (tv); // Si le personnage est à la vue du chef, ajoutez une force // pour échapper immédiatement à la route. if (isOnLeaderSight (leader, à venir)) force = force.add (evade (leader));  // Crée une force pour arriver au point derrière force = force.add (arrive (derrière, 50)); // 50 est le rayon d'arrivée // Ajouter la force de séparation force = force.add (separation ()); force de retour;  fonction privée isOnLeaderSight (leader: Boid, leaderAhead: Vector3D): Boolean distance de retour (leaderAhead, this) <= LEADER_SIGHT_RADIUS || distance(leader.position, this) <= LEADER_SIGHT_RADIUS;  private function distance(a :Object, b :Object) :Number  return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); 

Tout personnage échappera immédiatement à sa position actuelle s'il est à la vue du leader:

Les personnages qui suivent le leader utilisent la séparation et évitent la vue de celui-ci. Déplacez le curseur de la souris pour guider le leader. Cliquez pour afficher les forces.
Pointe: le chef suivant la force est une combinaison de plusieurs forces. Lorsqu'un personnage est influencé par la force suivante, il est influencé en même temps par la force d'arrivée, de séparation et d'évitement..

Démo

Ci-dessous, une démo montrant le comportement suivant du chef. Le soldat bleu (le chef) arrivera au curseur de la souris, tandis que les soldats verts suivront le chef.

Lorsque le joueur clique n'importe où sur l'écran, tous les soldats font face au curseur de la souris et tirent. Les monstres arriveront à des endroits aléatoires, toutes les quelques secondes.

Déplacez le curseur de la souris pour guider le chef (les soldats suivront). Cliquez pour tirer sur les monstres.
  • Sprites: Top / Down Shoot 'Em Up Spritesheet par takomogames
  • Fond: feuille de tuile de haut en bas de race extraterrestre (esque) par SpicyPixel

Conclusion

Le comportement suivant le leader permet à un groupe de personnages de suivre une cible spécifique tout en restant légèrement derrière elle. Les personnages évitent également leur emplacement actuel s'ils finissent par gêner le leader..

Il est important de noter que le comportement suivant du dirigeant est un combinaison de plusieurs autres comportements, tels que arriver, échapper et se séparer. Cela démontre que des comportements simples peuvent être combinés pour créer des schémas de mouvement extrêmement complexes..

Merci d'avoir lu! J'espère que vous pourrez commencer à combiner les comportements expliqués précédemment pour créer votre propre comportement complexe!