Prédire la position de l'ennemi afin qu'un objet mène sa cible

13

Dans mon jeu 2D, j'ai des tourelles IA qui devraient aider le joueur en tirant automatiquement vers les ennemis. Je voudrais leur faire tirer intelligemment et diriger leur cible au lieu de viser simplement la position actuelle d'un ennemi. Donc, étant donné la vitesse (toujours constante) et le vecteur de position de l'ennemi et du projectile de la tourelle, comment puis-je trouver un vecteur qui représente la position réelle que la tourelle doit cibler pour que le projectile intersecte (et frappe) l'ennemi?

Tout lien vers des articles décrivant les mathématiques, les algorithmes, etc. serait apprécié!

Kryptic
la source
Merci pour les liens! Cependant, je pense que les solutions sont un peu difficiles à lire, je peux peut-être trouver une réponse visuelle claire à cette question en utilisant les liens que vous avez fournis, pour aider les autres qui sont aux prises avec le même problème.
Larolaro
@Larolaro J'ai ajouté une démonstration graphique à ma réponse pour que vous puissiez mieux la comprendre.
jmacedo
Je décris l'approche que j'adopte
jhocking

Réponses:

3

Je ne vais pas vous donner de réponse, je suis sûr que c'est utile ou même correct, mais voici:
Après avoir joué avec mathématique un peu plus (vérifiez la fin de la réponse pour les cahiers / cahiers publiés), cette solution semble être correcte, même si elle n'est peut-être pas la meilleure en termes d'efficacité.

J'ai écrit ceci en mathématique qui correspond à votre problème. Fondamentalement, il résout les équations / inégalités afin de la variable OA qui est ce que nous devons découvrir. La sortie va nous donner les solutions possibles que OA peut avoir et les conditions à vérifier pour que chaque solution soit valide:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} est la position actuelle du bleu

  • {BVx, BVy} est le vecteur de vitesse du bleu

  • {OPx, OPy} est la position de la puce orange

  • L'OV est la norme du vecteur de vitesse de la balle orange (vitesse totale)

  • OA est l'angle de balle d'orange (angle du vecteur vitesse)

  • t est le temps nécessaire pour que la balle frappe le bleu

J'ai essayé de mettre t> 0 && OV> 0 dans les conditions mais mathématique prendrait une éternité donc j'ai juste utilisé t! = 0 && OV! = 0. Donc les solutions que je vais donner ici fonctionnent juste quand le bleu n'est pas exactement même position que l'orange et quand la balle de l'orange bouge vraiment (au lieu de rester immobile)

La sortie est gigantesque: http://freetexthost.com/xzhhpr5e2w

Cependant, si nous extrayons les parties OA == _, nous obtenons ceci:

http://freetexthost.com/iyrhqoymfo

Ce sont les valeurs que OA peut avoir (chacune nécessitant des conditions différentes pour être valide).

Après avoir analysé plus en détail les solutions qui nécessitent que OV soit négatif, ce que nous ne voulons pas, j'ai obtenu ceci:

http://freetexthost.com/iy4wxepeb6

Ce sont donc les solutions possibles au problème, chacune nécessitant des conditions différentes pour être valide. Pour qu'un certain angle OA soit une solution valable, les conditions suivantes doivent être remplies:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Production:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Considérez donc uniquement les solutions où cela vérifie (vous n'avez pas besoin de vérifier les t == _ pièces. Ce sont elles qui vous donnent le temps nécessaire pour que la balle frappe le véhicule si les autres conditions sont valides. Notez que si t donne une valeur négative, vous ne pouvez pas considérer un OA donné comme une solution valide, même s'il vérifie les autres conditions (c'est parce que nous avons utilisé t! = 0 au lieu de t> 0 dans réduire)).

Ce pourrait également être une bonne idée de demander à /math// à ce sujet.

Éditer

J'ai développé un certain intérêt pour cette question, j'ai donc créé un cahier commenté avec une démonstration graphique de tout ce que j'ai expliqué. Télécharger les ici:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Ou ici: http://www.2shared.com/file/W01g4sST/towerBullets.html

(ceci est la version publiée, et vous n'avez besoin que du lecteur mathématique - qui est gratuit - pour le voir. Si vous n'avez pas mathématique c'est la voie à suivre)

Capture d'écran:

jmacedo
la source
Je peux fournir les conditions et les solutions avec le signe de multiplication (*) afin qu'il soit plus facile pour vous de les porter sur votre langage de programmation (Il vous suffirait alors de remplacer ArcTan [...], Sin [...], Cos [...], Sqrt [...] et finalement le signe de puissance (^).
jmacedo
Hah, oubliez cette solution. Maintenant que cette question a été fusionnée, les liens de la première réponse semblent contenir de meilleures réponses.
jmacedo