J'ai un missile qui poursuit un comportement pour suivre (et essayer d'impact) sa cible (stationnaire).
Cela fonctionne très bien tant que vous ne mitraillez pas lorsque vous lancez le missile. Si vous mitraillez, le missile a tendance à orbiter autour de sa cible.
Je fixe ce par l' accélération tangentielle par rapport à la cible première , tuant la composante tangentielle de la vitesse d' abord, puis beelining pour la cible.
J'accélère donc en -vT jusqu'à ce que vT soit proche de 0. Accélère ensuite en direction de vN.
Pendant que cela fonctionne, je cherche une solution plus élégante où le missile est capable d'impact sur la cible sans tuer explicitement le composant tangentiel en premier.
steering-behaviors
orbit
bobobobo
la source
la source
Réponses:
Il semble que le problème est que le missile se pointe simplement sur la cible sans tenir compte de sa vitesse actuelle. Attribuez à votre missile un angle maximum par lequel la poussée peut s'écarter de la ligne de mouvement.
À chaque itération de guidage, vous calculez sa vitesse perpendiculaire à la cible. Calculez combien il doit faire basculer son moteur afin de mettre à zéro cette composante de sa vitesse, puis coupez-la au maximum pour faire basculer son moteur.
Au cours de la première partie de son vol, il se déplacera quelque peu à droite de la ligne droite de la figure n ° 2, mais à mesure qu'il vole, le moteur mettra à zéro cette composante et finira par se diriger directement vers la cible.
Notez que dans ce scénario, il n'y aura qu'une seule trame dans laquelle le moteur aura une déviation de tout autre que zéro ou max. Si vous suiviez une cible en mouvement, vous pourriez obtenir des déviations moindres à chaque cycle lorsque la cible se déplaçait.
la source
Ce n'est peut-être pas la solution élégante que vous recherchez, mais j'ai constaté que si je ralentis le missile, s'il va manquer, à mesure qu'il approche de la cible, il suit et tourne efficacement plus rapidement et peut toucher la cible. Vous pourriez augmenter la vitesse de rotation du missile à mesure qu'il se rapproche, plutôt que de réduire la vitesse, mais cela pourrait donner aux joueurs une "mauvaise surprise, je suis sûr que ça allait manquer".
Cela n'a peut-être pas l'air si beau, mais cela empêche certainement les missiles d'orbite et de l'ennemi mitraillant le missile jusqu'à épuisement du carburant.
Voici une démo que j'ai mise en place de mon implémentation (le troisième ou quatrième missile le démontre, et à nouveau à 1h05): http://www.youtube.com/watch?v=9uiGMC_nH2w
Vous pouvez également augmenter la précision du missile à l'approche de la cible (car il a une signature plus proche pour se verrouiller). Cela est également montré dans la vidéo environ une minute plus tard. Le cercle rouge montre la cible réelle du missile. Cela lui donne une trajectoire de vol chaotique à longue distance, puis se redresse plus il se rapproche.
Comme je l'ai dit, ce n'est peut-être pas la réponse que vous cherchez, mais j'espère que cela vous aidera un peu.
la source
Intuition
Voici une façon: tournons votre diagramme.
Maintenant, la fusée est un boulet de canon !
La physique
Il a une accélération fixe "vers le bas" c'est-à-dire perpendiculaire au vecteur de son emplacement de tir à sa cible. Je l'ai dessiné ci-dessus comme une ligne verte en pointillés. Appelons cela l' horizon de référence . (Notez que cet horizon de référence est constant! La fusée a été tirée à partir d'une position fixe avec une position fixe comme cible.)
Nous savons (de wikipedia ) pour un boulet de canon sans résistance à l'air, que
d = v^2 * sin(2 * theta) / g
, oùd
est la distance horizontale parcourue (distance entre le lieu de tir et la cible)v
est la vitesse à laquelle le projectile a été tirétheta
est l'angle par rapport à l'horizon sur lequel le projectile a été tiré ( angle de vecteur de direction de tir par rapport à l' horizon de référence )Réorganiser l'équation pour
g
donneg = v^2 * sin(2 * theta) / d
.La constante de l'équation du boulet de canon,,
g
est l' accélération due à la gravité . On peut considérer qu'il s'agit d'une accélération due à la propulsion d'une fusée . C'est bien aussi - c'est toujours une accélération constante dans une direction constante .Maintenant quoi?
Exécutez cette équation pour
g
quand vous tirez la fusée. Il vous dira combien d'accélérer la fusée perpendiculairement vers l'horizon de référence, afin de toucher la cible. Puisque la direction de cette accélération est constante, une orbite ne se formera pas.Boom.
la source