Réponses:
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)
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é.
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.
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.