Bonjour, j'aimerai créer un algorithme permettant de calculer avec exactitude où la tourelle doit tirer pour toucher un ennemi en mouvement. J'ai un peu chercher sur le web, mais je n'ai rien trouver a part des études de mouvements d'astre.
Tout d'abord, j'utilise UE4 en blueprint. Le jeu a une vue du dessus, l'axe Z est donc ignoré. La tourelle est immobile, l'ennemi a un mouvement rectiligne est constant.
Voici les variables connues :
Float Vb (vitesse de la balle)
Vector Pe (position de l'ennemi)
Vector Ve (vecteur vélocité de l'ennemi)
Float d (distance horizontale tourelle-ennemi)
Vector Pt (position de la tourelle)
Float Angle (Angle Cos-1[Vecteur(PePt).Vecteur(PeVe)]; On obtient un angle de 0 à 180°; donc 0° correspond à l'ennemi qui va directement sur la tourelle et 180° correspond à l'ennemi qui s'éloigne de la tourelle.)
Voici un schéma de la tourelle et de l'ennemi qui prend seulement en compte Vb et Ve (ne prend pas en compte l'angle): j'en ai déduit P = Pe + Ve* (d/Vb)
On peut voir sur ce schéma que si l'angle = 90°, alors cette formule marche mais si l'angle est != à 90°, on doit ajuster la distance.
J'ai donc trouvé la formule suivante pour déterminer où la tourelle doit tirer pour toucher l'ennemi, quelque soit la vitesse de la balle et de l'ennemi et quelque soit l'angle :
P = Pe + Ve*(d/Vb)*MAPRANGE(Value:Angle; InRangeA:0; InRangeB:180; OutRangeA:0; OutRangeB:2)
Cependant, quand j'effectue mes tests en jeu, cela fonctionne mais ne semble pas exact (la balle ne part pas pile au centre de l'ennemi). Peu etre qu'il faudrait utiliser autre chose qu'une MAPRANGE pour déterminer où la tourelle doit tirer en fonction de l'angle?
Excusez moi par avance si la syntaxe utilisée pour faire ce post n'est pas bonne, mais n'ayant que très peu touché au C++, je ne connais pas les formulations pour exprimé une MapRange ou encore l'angle, si vous pouvez m'aiguiller je pourrais modifier le post pour qu'il soit plus lisible. Cependant toute aide reste grandement apprécié
Cordialement, Julien.
Partager