IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Calcul d'un point de tir idéal d'une tourelle en 2D


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Calcul d'un point de tir idéal d'une tourelle en 2D
    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)

    Nom : SchemaProjectiles.png
Affichages : 659
Taille : 30,6 Ko

    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.
    Images attachées Images attachées  

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 95
    Points : 212
    Points
    212
    Par défaut
    Bonjour,

    J'avoue ne pas avoir compris l'utilisation de MapRange à la fin.

    Voici mon raisonnement:
    Posons E la position initiale de l’ennemi et T la position de la tourelle.
    Posons t l'instant où l'impact à lieu à partir du tir, et P le point d'impact. On veut calculer P, donc t
    On a P = E + t*Ve
    De plus, t = ||PT|| / Vb par le parcours de la balle.
    Or par trigonométrie dans un triangle quelconque: ||PT|| = sqrt(||t*Ve||² + ||ET||² - 2*t*||Ve||*||ET||*cos(alpha) = t * Vb avec alpha l'angle entre le vecteur Ve et le vecteur ET.
    On met au carré: (||Ve||²-Vb²) * t² - (2*||Ve||*||ET||*cos(alpha)) * t + ||ET||² = 0
    On a un polynome du 2nd degré. On prend la solution t positive (l'autre solution négative correspond au cas où l'ennemi partait à l'opposé).
    On calcule P = Pe + t*Ve. On a le point vers lequel on doit tirer.

    J'espère que je n'ai pas fait d'erreur. Je n'ai rien testé...

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    quelque soit la vitesse de la balle et de l'ennemi et quelque soit l'angle :
    Ça m'étonnerait...

    pour déterminer où la tourelle doit tirer en fonction de l'angle?
    A partir du moment où la position de l'ennemi est connu à tout instant (mouvement rectiligne uniforme), tu choisis le moment de l'impact et l'angle de tir.
    Dans l'absolu, il y a une infinité de solutions.

    mais n'ayant que très peu touché au C++
    Ce n'est pas une question de C++ mais de trigonométrie.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci pour ces réponses, j'avoue que j'ai un peu négligé la prise en compte de l'angle en utilisant une MapRange
    AbsoluteLogic, le raisonnement semble exact, cependant quand je teste cet algorithme sur UE4, P ne se déplace pas en meme temps que l'ennemi mais reste fixe sur l'écran (meme si Vb augmente, P ne se déplace pas).
    En réalité, au plus l'ennemi se rapproche de P, au plus t diminue, et ainsi P reste toujours a la meme position.
    Or P est actualisé chaque tick par la fonction suivante :
    P = Pe + t*Ve
    Avec t=t1, provenant du polynome du second degré proposé (t1=t2 lors du test, ils sont affiché en haut à gauche dans la vidéo ci dessous)

    Nom : EventGraphSetTargetTourelle.PNG
Affichages : 554
Taille : 256,8 Ko

    (PS: Ne faites pas attention aux assets, c'est en cours de développement )

    Pourquoi est ce que la sphère ne se déplace pas dans la direction de l'ennemi? J'avoue être un peu perdu.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 95
    Points : 212
    Points
    212
    Par défaut
    J'ai oublié de mettre Vb au carré. J'ai corrigé la formule dans mon message précédent. Ça devrait tout changer.

    Mais c'est normal que P reste fixe pendant le déplacement de l'ennemi. Le point d'impact sera toujours le même. Par contre ça m'étonne justement que ce soit le cas avec l'erreur qu'il y avait... Par contre évidemment P doit changer si Vb change.

    Et je ne comprends pas pourquoi t1 = t2. Ça voudrait dire que -b/2a est nul, donc que b est toujours nul, donc que alpha est égal à + ou - 90° puisque ET et Ve sont non nuls.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    pourquoi faire simple quand on peut faire compliquer
    ton problème se résume a trouver l'intersection de deux droite
    vu que le projectile et l’ennemie ont tout deux un sens et une direction rectiligne et uniforme

    il te faut donc déterminer tes deux droite ensuite le point d'intersection et ensuite à partir du départ de ton ennemie tu pourras déterminé à quel moment tu aurais due lancer ton projectile
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    C'est le discriminant que tu appelles Delta ?
    Non parce qu'aux lycéens, on leur parle de b2-4ac
    Tu confonds avec l'abscisse du sommet de la parabole. N'est-ce pas ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2018
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2018
    Messages : 95
    Points : 212
    Points
    212
    Par défaut
    Citation Envoyé par anapurna Voir le message
    ton problème se résume a trouver l'intersection de deux droite
    vu que le projectile et l’ennemie ont tout deux un sens et une direction rectiligne et uniforme

    il te faut donc déterminer tes deux droite ensuite le point d'intersection et ensuite à partir du départ de ton ennemie tu pourras déterminé à quel moment tu aurais due lancer ton projectile
    Non, justement la direction du projectile n'est pas connue. Elle doit être déterminée. Ce que l'on connaît, c'est que l'on lance le projectile dès que le fait ce calcul.

    Citation Envoyé par Flodelarab Voir le message
    C'est le discriminant que tu appelles Delta ?
    Non parce qu'aux lycéens, on leur parle de b2-4ac
    Tu confonds avec l'abscisse du sommet de la parabole. N'est-ce pas ?
    Houlà oui, et dire que je ne l'ai pas remarqué et que je suis rentré dan son jeu ^^ avec mon b que je disais être nul

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Tu confonds avec l'abscisse du sommet de la parabole. N'est-ce pas ?
    Effectivement

    J'ai oublié de mettre Vb au carré.
    J'ai corriger ceci ainsi que le discriminant sur l'event graph, maintenant t1 =!t2, et t2>0.
    Apres avoir remplacer t1 par t2 dans l'algorythme, (car t1<0 et t2>0) cela fonctionne parfaitement !! (du moins uniquement lorsque je simule, lorsque je lance le jeu, ca ne fonctionne plus si l'angle est >90°, allez savoir pourquoi.. Je vais essayer de résoudre ce problème)

    Le point d'impact sera toujours le même
    Je ne comprends pas, calculer t2 revient a calculer t(impact) n'est ce pas? Pourquoi alors P ne se déplacerai pas, sachant que l'on se base sur la position de l'ennemi en temps réel et non uniquement sur sa position initiale?

    En tout cas, merci de m'avoir d'avoir pris le temps de m'aidé a compléter cet algorithme , j'avoue ne pas directement penser aux formules mathématiques mais plutot essayer plusieurs cas et contre exemples pour en déduire une formule mathématique

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Il y a une infinité de possibilités.
    Si l'arme était un laser, l'angle de rotation de la tour serait indexé par le temps.
    Comme l'arme envoie des projectiles, le temps de rechargement doit entrer en ligne de compte. Sinon, c'est faux.
    A moins de refaire le calcul à chaque fois. Ce que ne semble pas faire la vidéo.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juillet 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    A moins de refaire le calcul à chaque fois. Ce que ne semble pas faire la vidéo.
    Pourtant si, le calcul était bien exécuté a chaque tick, mais étrangement P ne se déplaçait pas

    Voici ce que ca donne avec le nouvel algorithme (j'ai édité mon précédent post) :

  12. #12
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    C'est beau.
    Donc résolu ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] [Pandas] Algorithme calcul à partir de points
    Par Gr1nch3 dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/08/2016, 19h11
  2. Réponses: 8
    Dernier message: 20/02/2015, 08h00
  3. [MySQL-5.1] Calcule distance sur POINT
    Par bannik dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 31/05/2013, 15h48
  4. calculer zoom idéal d'une plage de cellules pour l'imprimer
    Par homerlehamster dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2011, 13h47
  5. calcul d'un point sur la base d'un cone
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/11/2003, 21h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo