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

Unity Discussion :

Calcul du vecteur direction pour tirer un projectile vers le joueur [Unity 5]


Sujet :

Unity

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut Calcul du vecteur direction pour tirer un projectile vers le joueur
    Bonjour,

    je fais un space shooter en 3d sous unity.
    J'ai rajouté des ennemis qui tirent vers le joueur, mais je n'arrive pas à trouver dans quelle direction il faut tirer pour atteindre le joueur à coup sûr si celui-ci ne change pas de direction.
    À un instant T, je connais la position du joueur, sa direction, sa vitesse.
    Je connais aussi la position de départ du projectile ainsi que sa vitesse.
    Il me manque à déterminer la direction que doit prendre le projectile pour atteindre le joueur en considérant que celui-ci continuera dans sa direction.
    J'ai essayé de faire des calculs avec des équations à plusieurs inconnues, mais j'obtiens une infinité de solutions.
    Merci de m'aider.

  2. #2
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Hello,

    Pour ce genre de truc, en règle générale, on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	Vector3 dir = (target.position-gun.position).normalized;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par Greg Latiner Voir le message
    Hello,

    Pour ce genre de truc, en règle générale, on écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	Vector3 dir = (target.position-gun.position).normalized;
    Cela fonctionne si le projectile se déplace à la vitesse de la lumière, sinon il ratera sa cible à tous les coups!
    Pour mon projet, on verra le projectile se déplacer et pendant qu'il bougera, le joueur bougera aussi.
    Donc, il me faut calculer le point d'impact qui se situera devant le joueur en tenant compte du déplacement de celui-ci.

  4. #4
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Je n'ai fait que répondre à ta question, qui était
    Citation Envoyé par dvince38 Voir le message
    Il me manque à déterminer la direction que doit prendre le projectile pour atteindre le joueur en considérant que celui-ci continuera dans sa direction..
    en fournissant la façon de déterminer cette direction. Après il faut être plus précis dans la formulation de ta demande.
    Dans ce que tu laisses entendre dans ta réponse, alors il te faut regarder du coté des raycasts, connaissant la direction désormais, cela ne devrait pas poser de soucis.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    Merci pour ton aide,
    je vais essayer d'être plus clair avec un dessin :
    Nom : exp.jpg
Affichages : 2024
Taille : 27,5 Ko
    Il faut déterminer la direction dans laquelle l'ennemi doit tirer pour que le projectile touche le joueur quelques secondes plus tard.

  6. #6
    Membre expérimenté
    Avatar de Greg Latiner
    Homme Profil pro
    Développeur JV
    Inscrit en
    Février 2014
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Développeur JV

    Informations forums :
    Inscription : Février 2014
    Messages : 341
    Points : 1 313
    Points
    1 313
    Par défaut
    Ben au moins là, j'ai compris
    Bon se que tu cherches à faire c'est de la prédiction de tir ou encore plus simplement un calcul de trajectoire d'interception.
    Ça tu peux trouver sur la toile, les sujets ne manquent pas.
    A titre d'exemple: un peu de lecture : Calculer une trajectoire d'interception

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 44
    Points : 41
    Points
    41
    Par défaut
    En regardant le lien que tu m'as donné et en cherchant sur d'autres forums, j'ai trouvé une solution satisfaisante.
    Le code fait un calcul approximatif du point d'impact, mais en faisant plusieurs itérations on arrive à une précision assez bonne.
    Ensuite, il faut rajouter un peu de hasard, pour que ça fasse plus réel.

    Nom : exp.jpg
Affichages : 2047
Taille : 73,0 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        float DistanceToLine(Vector3 origine, Vector3 direction, Vector3 point)
        {
            return Vector3.Cross(direction, point - origine).magnitude;
        }
     
        Vector3 CalculTrajectoireIntersection(Vector3 PositionJoueur, Vector3 DirectionJoueur, float VitesseJoueur)
        {
            float distanceTotaleCible = 0;
            float distanceTotaleProjectile = 0;
            float distancePrecedente = 9999999999999999999;
            Vector3 projectileDirection = new Vector3(0, 0, 0);
     
            //Calcul du rapport des vitesses : rapport = vitesse cible / vitesse Projectile
            float rapport = (float)VitesseJoueur / (float)speed;
     
            Vector3 newPos = transform.position;
            for (int i = 0; i < 10; i++) // augmenter 10 pour avoir une précision plus importante
            {
                //Calcul de la distance que le Projectile doit parcourir pour croiser la trajectoire de la cible
                float distance = DistanceToLine(PositionJoueur, DirectionJoueur, newPos);
     
                //On arrête quand la distance entre le Projectile et le joueur est faible
                //On fait la vérification par rapport à la distance précédente parce que dans certains cas la distance diminue puis ré-augmente et les résultats sont faux.
                if (distancePrecedente < distance) break;
                distancePrecedente = distance;
     
                distanceTotaleProjectile += distance;
     
                //Calcul de la distance que la cible va parcourir pendant le temps de trajet du Projectile
                distanceTotaleCible += rapport * distance;
     
                projectileDirection = ((PositionJoueur + DirectionJoueur * distanceTotaleCible) - transform.position).normalized;
     
                newPos = transform.position + projectileDirection * distanceTotaleProjectile;
            }
     
            return projectileDirection;
        }

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

Discussions similaires

  1. Calcul des vecteurs de co-occurrences pour les mots
    Par samorra dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 21/05/2011, 01h36
  2. calculer les rotations à partir du vecteur direction
    Par dvince38 dans le forum Moteurs 3D
    Réponses: 3
    Dernier message: 04/07/2010, 04h48
  3. Réponses: 3
    Dernier message: 14/06/2009, 23h17
  4. Calcul d'angle entre 2 vecteurs - direction
    Par lothei dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 03/09/2007, 19h29
  5. Réponses: 1
    Dernier message: 17/02/2006, 11h15

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