Comment calculer le cap vers un missile?

14

J'ai un missile qui est tiré d'un navire à un angle, le missile se tourne ensuite vers la cible dans un arc avec un rayon de virage donné. Comment déterminer le point sur l'arc lorsque je dois commencer à tourner pour que le missile se dirige directement vers la cible?

ÉDITER

Avant de lancer les missiles, je dois calculer et tracer les trajectoires de vol. Ainsi, dans l'exemple ci-joint, le lanceur a un cap de 90 degrés et les cibles sont derrière. Les deux missiles sont lancés à un cap relatif de -45 degrés ou + 45 degrés par rapport au cap du lanceur. Les missiles se tournent initialement vers la cible avec un rayon de virage connu. Je dois calculer le point auquel le virage amène le missile au cap auquel il se tournera pour attaquer directement la cible. Évidemment, si la cible est à 45 degrés ou près de celle-ci, il n'y a pas de virage initial, le missile va juste droit vers la cible.

Après le lancement du missile, la carte montrera également le suivi du missile sur cette ligne comme indication de sa trajectoire de vol.

Ce que je fais, c'est travailler sur un simulateur qui imite un logiciel opérationnel. Je dois donc tracer la trajectoire de vol calculée avant d'autoriser le lancement du missile.

Deux missiles visant deux cibles

Dans cet exemple, les cibles sont derrière le lanceur mais les trajectoires précalculées sont tracées.

Tony
la source
1
Le cap est-il précalculé ou change-t-il pendant la trajectoire? (comme un missile à tête chercheuse?)
Jonathan Connell
1
Ne serait-ce pas juste quand (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, où (x1, y1) est la position actuelle du missile et (x2, y2) est la cible?
The Communist Duck
Vous devriez peut-être faire le dessin de ce que vous voulez.
aaaaaaaaaaaa
3
S'agit-il d'un problème 2D ou 3D?
Steve H
Si vous cherchez quelque chose comme un missile à tête chercheuse, vous pouvez le faire sans utiliser de trigonométrie. Voir cette question
BlueRaja - Danny Pflughoeft

Réponses:

9

Mes calculs sont peut-être un peu faux, j'ai donc hésité sur la réponse.

Je suppose que vous voulez faire le scénario de ralliement continu - où le missile P1 se déplaçant à une vitesse V1 essaie constamment de se tourner vers le joueur P2; mais à un taux de rotation limité.

  1. Déterminez le vecteur entre le joueur et le missile.

    V2 = P2 - P1
  2. Transformez-les en vecteurs unitaires.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Déterminez l'angle entre les vecteurs.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Limitez la valeur de l'angle entre eux (rappelez-vous que vos fonctions trigonométriques fonctionnent probablement avec des radians, essayez donc 0,1 comme taux de rotation).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Créez le nouveau vecteur de mouvement.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

EDIT: Cela n'a pas de «point de départ» car il s'agit d'une mise en œuvre plus robuste (et plus facile) pour le scénario de référencement continu. Vous n'avez pas besoin de trouver un point de départ pour un cercle - limitez simplement la vitesse à laquelle le missile peut changer de direction et le reste se produit à cause du fantôme dans la machine.

Jonathan Dickinson
la source
1
Mmm ... si ma mémoire est bonne, je pense que vous devez faire un produit croisé pour obtenir la direction de l'angle. Si vous faites juste un produit scalaire, vous connaîtrez l'ampleur de l'angle mais pas la direction (comme les produits scalaires peuvent avoir V3 * V4 = V4 * V3, il semble qu'il n'y ait aucun moyen de noter la différence d'orientation). Donc, faites le produit scalaire, puis faites un produit croisé - en vérifiant le signe de la coordonnée Z - pour trouver l'orientation.
ChrisE
@ChrisE L'exemple est en 2D (en regardant 5.), donc l'orientation d'origine et la magnitude de l'angle devraient être suffisantes.
Keeblebrox
Le calcul de l'angle entre est correct, mais je ne sais pas quelle est votre intention déclarée à l'étape 5 OU ce qu'elle produit. Est-ce que l'étape 5 suppose d'ajouter l'angle a à la v3 parce que je ne comprends pas les mathématiques.
dlots
L'étape 5 de @dlots est censée ajouter le nouvel «angle de vitesse de rotation limitée» au vecteur de mouvement actuel - fondamentalement, il change la direction du missile.
Jonathan Dickinson
Que se passe-t-il SIGNà l'étape 4?
Daniel Kaplan
2

Je suppose que vous voulez changer la direction en changeant le cap de lancement en cap cible puis continuez tout droit vers la cible (un problème plus amusant devrait être de toucher la cible en tournant!).

Je dois supposer que vous pouvez tourner avec le même rayon de braquage dans toutes les directions (c'est une simplification difficile à voir dans les vrais missiles).

La solution la plus simple est d'utiliser la flexion à 90 ° : le missile file jusqu'à ce que sa trajectoire forme un angle droit avec la cible. si vous tournez exactement au point à 90 °, vous manquerez la cible exactement par le rayon de virage, car vous devez tenir compte du virage lui-même. La solution consiste à commencer à tourner exactement "rayon de virage" mètres (?) Avant d'atteindre le point à 90 °, puis à tourner en formant (essayez de deviner) un arc de 90 ° pour aller directement à votre cible.

Cette solution n'est pas toujours envisageable, par exemple lorsque vous n'avez pas la visibilité sur la trajectoire à 90 ° (bâtiments ou autres obstacles).

La bonne nouvelle est que la solution fonctionne pour tous les angles (pas seulement le mythique 90 °), l'astuce consiste à prendre en compte l'espace nécessaire pour tourner avant de commencer à tourner auparavant.

Combien avant? C'est pourquoi l'étoffe à 90 ° est la solution la plus simple ...

Disons que vous atteignez la visibilité ou le meilleur cap cible lorsque la trajectoire de tir forme un angle de θ °, alors vous devez anticiper le virage en:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... où sécante est l'inverse du cosinus. La preuve est banale et laissée au lecteur.

Sérieusement, la formule provient d'une construction géométrique simple.

Graphique du point tournant

La ligne noire est le chemin de tir, tandis que la fine ligne noire est le même chemin déplacé vers la cible en tournant les unités de rayon; de même pour les rouges qui sont le chemin cible.

Les segments verts ont une longueur de rayon_radiation, vous devriez donc voir que:

AB est la tangente de 90 ° - θ °

BC est la sécante.

Les deux lignes vertes qui proviennent du point tournant ont une longueur de turn_radius et sont perpendiculaires aux deux chemins; ce qui signifie que le rayon de braquage est correct et que l'arc est tangent aux deux trajectoires (comme il devrait l'être si vous effectuez un virage sous contraintes physiques).

Faites-moi savoir si vous voyez une erreur.

ÉDITER:

Le dessin que vous avez publié montre qu'il existe plusieurs choix de chemin, même avec un tireur et une cible fixes, comme vous pouvez le voir ici:

entrez la description de l'image ici

Une fois la cible choisie, vous pouvez appliquer ce que j'ai dit ci-dessus avec les bons angles.

FxIII
la source
Veuillez noter qu'il ne s'agit pas d'un système de mise à jour continue. Étant donné que le ralliement nécessite plus de CPU (beaucoup), cela devrait être considéré comme la bonne approche pour les cibles fixes ou si l'on veut mettre en œuvre un missile "semi-stupide" bien sûr. La trajectoire peut être simplement paramétrée sur t divisant le chemin en 3 sous-chemins et l'arc peut être approximé par une courbe de Bézier.
FxIII
1

J'implémenterais un "comportement de direction" pour le missile. Le missile a: une vitesse (un nombre), une position (un vecteur) et une rotation (actuelle). À chaque mise à jour de votre jeu / à chaque image, la rotation du missile est légèrement modifiée (vers la cible). Ensuite, le missile est déplacé vers l'avant en fonction de sa rotation et de sa vitesse actuelles.

Fonctionne pour 2D et 3D évidemment, car la seule différence est une dimension supplémentaire.

Une autre possibilité serait de calculer la trajectoire du missile avant de le forcer. Recherchez des courbes de Bézier ou des splines .

Riki
la source
Le problème avec l'utilisation d'une spline ici est que vous devrez constamment mettre à jour les points de contrôle si la cible se déplace. Un algorithme de pilotage simple ici peut être moins cher en termes de calcul.
ChrisE
En fait, j'essaie de précalculer le chemin vers la cible. Ce que je travaille est un simulateur pour certains équipements réels et j'essaie d'imiter le comportement de l'équipement réel.
Tony
0

J'ai l'impression que vous résolvez le mauvais problème ici. Un missile du monde réel ne va pas se soucier de savoir où se tourner, il va simplement tourner jusqu'à ce qu'il soit dirigé vers sa cible. Le seul calcul de destination impliqué est le moment de ramener les commandes au point mort car un missile du monde réel ne peut pas changer instantanément sa vitesse de rotation. Ce calcul ne prendra que la vitesse indiquée par le missile comme valeur d'entrée et je pense qu'il serait précalculé.

Loren Pechtel
la source
2
Un missile du monde réel, en particulier les dernières armes, ont des systèmes de guidage inertiels ou GPS ou les deux, donc ils sont programmés pour aller dans une zone de recherche et commencer à chercher une cible. Malheur à un ami proche. La programmation est censée vous permettre d'envoyer le missile sur un chemin qui évite les matchs amicaux et d'autres obstacles tels que les masses terrestres et les passants innocents.
Tony
0

Je pense que l'algorithme le plus simple ne ferait que suivre deux règles:

  1. Si la cible actuelle est plus proche du missile que le diamètre de braquage, continuez tout droit. Cela évite le missile en orbite autour de cibles proches au lieu de les atteindre.

  2. Sinon, tournez-vous vers la cible jusqu'à ce que vous la pointiez.

Pour calculer le point où le virage se termine en 2D:

  1. Au point où vous souhaitez commencer à tourner, le centre du cercle de braquage est situé dans une direction perpendiculaire au cap actuel à une distance de votre rayon de braquage. Notez qu'il y a deux de ces points - vous voulez probablement celui le plus proche de votre cible. Calculez cette position et appelez-la P.

  2. Vous pouvez maintenant construire un triangle rectangle avec l'angle droit à la tangente et deux points connus - P et votre destination. Cela vous permet de calculer la distance de la tangente à votre point cible avec Pythagore. Appelez ça D.

  3. Vous devez maintenant calculer l'intersection d'un cercle de rayon D à votre destination avec votre cercle tournant. Vous obtiendrez deux solutions qui sont les deux points tangents sur ce cercle où le missile cesserait de tourner (un pour chaque direction de déplacement autour du cercle). Choisissez le point qui se trouve devant le missile - c'est votre réponse.

Adam
la source