Comment trouver l'angle de lancement d'un projectile?

9

Je fais un jeu 2d dans lequel les unités tirent des flèches les unes sur les autres. Je connais la position du tireur et de la cible et la vitesse initiale du projectile. Je veux savoir l'angle que le projectile doit avoir pour atterrir sur la cible. La cible pourrait être à une hauteur différente de celle du tireur.

Pour résumer je connais v0, R et g et j'ai besoin de trouver l'angle (ou la hauteur?).

J'ai lu http://en.wikipedia.org/wiki/Projectile_motion , mais je ne trouve pas quelque chose en rapport avec ce dont j'ai besoin.

korn3l
la source
Cela dépend si vous voulez vous en tenir à une courbe balistique réaliste ou si une parabole est assez bonne.
AB.
Voulez-vous inclure le vent? Ou toute autre accélération horizontale? (Cela rend les mathématiques plus difficiles, bien sûr)
Seth Battin
Je veux réaliser un mouvement de projectile réaliste et il n'y a pas de vent impliqué.
korn3l

Réponses:

11

La formule pour trouver l'angle est

Formule

où v est la vitesse de lancement initiale, g est la constante de gravité, x et y sont la distance et la hauteur de la cible.

Les deux racines de cette équation vous donnent deux angles possibles. Si les résultats sont imaginaires, votre vitesse initiale n'est pas assez grande pour atteindre la cible (si vous voulez calculer l'angle de portée, lisez ceci ). C'est à vous de choisir l'angle sélectionné. Il serait judicieux de choisir le chemin le plus direct, c'est-à-dire l'angle le plus petit.

Vous pouvez voir un GIF de cette équation ci-dessous avec différentes valeurs cibles et une vitesse de lancement constante.

Formule représentée graphiquement sous forme de GIF animé

Ressources de cet article wikipedia

Stephen Tierney
la source
Notez que dans la plupart des cas, il existe deux solutions valides. En supposant qu'aucune traînée ou une portée maximale similaire n'est atteinte lorsque le projectile est tiré à un angle de 45 degrés. Aller plus haut OU plus bas diminuera la portée - ainsi, à moins que vous n'ayez besoin de chaque bit de punch de votre arme, il y aura une solution plus élevée et plus basse.
Loren Pechtel
Vous prendriez probablement l'angle qui a le temps de vol le plus court, qui est généralement un angle plus petit (probablement toujours mais je me permets la possibilité de me tromper gracieusement heh). Il est plus rapide de tirer au sol devant vos pieds en pointant vers le bas qu'en pointant vers un angle très raide.
Azaral
@StephenTierney Merci pour la réponse. C'est ce que je cherchais.
korn3l
Trouvé une solution beaucoup plus simple à ce problème, info de en.wikipedia.org/wiki/…
Stephen Tierney
2

Plus tôt cette année, j'ai créé un simple jeu de tir de haut en bas. J'ai utilisé la méthode suivante:

Réponse antérieure: /programming/15364852/move-sprite-diagonally/15365570#15365570

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}

Il calcule une trajectoire entre deux positions.

Deukalion
la source