Calcul de la vitesse minimale du projectile nécessaire pour atteindre la cible en arc parabolique


Réponses:


15

La fonction de plateau parabolique est définie comme:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • Valeurs connues:

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • Valeurs inconnues:

    Vo: Initial Velocity
  • Pour calculer 'Vo', nous pouvons donner des valeurs à la fonction F:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • Vous pouvez maintenant obtenir toutes les valeurs pour atteindre la cible depuis l'origine en donnant des valeurs à t dans l'équation F:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

très bonne réponse. sachez simplement que g n'est pas signé. à mesure que g augmente, Voy devrait également augmenter.
milkplus

Comment le t (temps nécessaire à l'impact) est-il connu?
Dewald Swanepoel

13

J'ai récemment dû résoudre un problème similaire, j'ai trouvé deux solutions, basées sur la formule que j'ai trouvée sur la page wikipedia 'Dan the Man' déjà mentionnée: Trajectoire d'un projectile

Dans cette solution, vous avez réellement besoin de toute façon de l'angle de lancement fixe ou de la vitesse x. La vitesse Y n'est pas nécessaire lorsque nous lançons le projectile dans un angle spécifique.

Solution 1, l'angle de lancement est fixe, calculez la vitesse:

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

Solution 2, la vitesse est fixe, calculez l'angle de lancement:

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

Dans mon cas, ces solutions ont très bien fonctionné.


2

Si vous ne vous souciez pas si elle est mathématiquement correcte, seulement qu'elle semble assez correcte, calculez le chemin droit et faites suivre votre projectile à ce chemin, mais "poussez-le" le long de la normale de cette ligne en fonction de sa distance vers le bas le segment de ligne, de sorte qu'il monte à mesure qu'il s'approche du milieu du segment et diminue lorsqu'il s'éloigne du milieu du segment de ligne.

Vous pouvez utiliser une onde sinusoïdale pour cela, en utilisant la plage de degrés de -90 à +90 (où -90 est le point gauche sur le segment de ligne, 90 est le point droit et vous lerp au milieu), et multipliez le résultat par une constante pour l'intensifier.

Si vous avez besoin d'une réponse mathématique / physique purement correcte, cela n'aidera pas. Si vous ne le faites pas, cela peut probablement fonctionner assez bien pour vous!

N'oubliez pas, la programmation de jeu consiste à utiliser des illusions qui semblent correctes (et moins coûteuses à calculer), au lieu du réalisme.


7
Re: "en utilisant des illusions qui semblent correctes (et qui sont moins chères à calculer)", je suis d'accord en général, mais dans ce cas, cela semble un peu idiot étant donné la facilité et le bon marché d'utiliser l'arc parabolique mathématiquement correct.
Nathan Reed

1
Il est vrai que cela semble une simplification inutile, mais je ne pense pas que cette réponse soit mauvaise dans le mauvais sens, et elle ne mérite pas le downvote (même si elle ne mérite pas beaucoup de upvotes).
Will

En fait, si vous allez utiliser une onde sinusoïdale, elle devrait être de 0 à 180 (ou 0 à pi en radians)
Daniel Kaplan

2

Si vous avez juste besoin de quelque chose qui est à peu près correct et d'une vitesse fixe, vous pouvez utiliser cette méthode très simplifiée.

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

La distance peut être négative, mais cela fonctionnera toujours car l'angle dépend également de la distance. Si la distance est négative, l'angle à ajouter est également négatif.

Vous devrez jouer avec distanceFactor pour trouver la bonne valeur. Cela dépend de la gravité et de la puissance du projectile. Il doit être proche de 1 divisé par la distance maximale que le projectile peut couvrir.


1
La tête haute. Quand j'ai essayé votre code, vous aviez cos et péché à l'envers. J'ai modifié votre code, il devrait donc être correct.
MrValdez
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.