Trouver la bonne vitesse pour que l'IA se tourne pour atteindre l'objectif

10

J'ai un navire qui se déplace à vitesse maximale maxSpeedet peut tourner à des rotationSpeeddegrés par seconde. Le navire se déplace toujours dans la direction à laquelle il fait face, ce qui signifie que plus le navire se déplace rapidement, plus son rayon de braquage est grand.

Je connais ma position, ma rotation et la position de la cible.

Ce que je voudrais savoir, c'est si une cible se trouve à l'intérieur de mon rayon de braquage à cette vitesse, ou mieux, quelle est la vitesse maximale à laquelle je peux voyager pour effectuer le virage vers la cible sans tourner continuellement autour d'elle.

Existe-t-il un moyen (ish) efficace de le faire?

Voici ce que je pense jusqu'à présent: parce que je sais jusqu'où je vais par pas et combien je tourne par pas, je peux savoir où je serai dans les deux prochaines images. Ma position actuelle est p1, ma position suivante est p2 puis p3. Je peux prendre les bissectrices perpendiculaires de (p1, p2) et (p2, p3). Leur point d'intersection me donnera le centre d'un cercle. Je peux ensuite tester si la cible se trouve dans ce cercle.

Je ne sais pas si cela fonctionnera en 3D (je ne sais pas comment calculer une sphère avec mes entrées). Cette solution n'aide pas non plus trop à trouver la bonne vitesse à laquelle voyager, je devrais essayer plusieurs fois avec des vitesses différentes pour en trouver une raisonnable.

Quelqu'un peut-il nous éclairer sur une meilleure solution?

weichsem
la source

Réponses:

17

Il existe deux façons pour une unité contrôlée par l'IA avec une vitesse de rotation limitée et une vitesse de mouvement réglable d'atteindre un objectif.

Tout d'abord, examinons le défi qui nous est présenté afin de mieux le comprendre:

entrez la description de l'image ici

Si le joueur se déplace et tourne à des vitesses constantes tout en essayant d'atteindre un objectif sur son côté droit ou gauche, il se déplacera en cercles pour toujours, sans jamais faire face à son objectif. Les deux zones que le joueur encerclera sont marquées en rouge ci-dessus.

La zone circulaire marquée en rouge peut être calculée comme suit:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Il en résulte la position et le rayon des cercles rouges. Nous pouvons l'utiliser pour déterminer si un certain objectif est hors de portée de l'unité contrôlée par l'IA si elle continue de se tourner vers la direction du but.

Pour savoir si un certain élément se trouve dans l'un des cercles, nous calculons simplement la distance par rapport au centre des cercles:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Il existe deux solutions possibles pour cela:

1.

Construisez une certaine distance jusqu'à ce que l'objectif soit en dehors de la zone circulaire rouge, puis faites demi-tour comme un demi-tour. C'est simple, laissez l'unité continuer à bouger jusqu'à ce que le contrôle retourne que le but n'est pas dans ce cercle. Ensuite, vous pouvez vous retourner.

entrez la description de l'image ici

L'autre option nécessite un peu plus de travail pour calculer:

Nous dessinons une ligne imaginaire entre l'unité AI et le but. En utilisant l'angle entre eux:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Vous devez maintenant effectuer les opérations suivantes afin de calculer la vitesse correcte:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

entrez la description de l'image ici

Pour le faire fonctionner dans le cas 3D:

Trouvez l'avion sur lequel résident les trois points suivants:

  1. Le but.
  2. La position de l'unité AI dans l'image précédente.
  3. La position actuelle de l'unité AI.

Vous pouvez utiliser cet avion pour calculer la vitesse de la manière 2D. Il vous suffit de convertir les points de leurs valeurs 3D en valeurs 2D intégrées sur leur plan commun.

Vous voudrez peut-être utiliser ceci:

Comment convertir un point 3D sur un plan en coordonnées UV?

AturSams
la source
Parfait! Exactement la réponse que j'espérais! Merci pour vos explications détaillées, je pense que je suis capable d'extrapoler à ce sujet et de l'utiliser en 3D.
weichsem
@weichsem J'ai mis à jour la réponse. L'idée que j'ai suggérée est de trouver une plaine 2D commune qu'ils partagent et de l'utiliser pour calculer la bonne vitesse.
AturSams