Respuestas:
La función de trayectoria parabólica se define como:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
Valores conocidos
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
Valores desconocidos:
Vo: Initial Velocity
Para calcular 'Vo', podemos dar valores a la función F:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
Ahora puede obtener todos los valores para alcanzar el objetivo desde el origen dando valores a t en la ecuación F:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
Recientemente tuve que resolver un problema similar, se me ocurrieron dos soluciones, basadas en la fórmula que encontré en la página de Wikipedia 'Dan the Man' ya mencionada: Trayectoria de un proyectil
En esta solución, realmente necesita el ángulo de lanzamiento fijo o la velocidad x. La velocidad Y no es necesaria cuando lanzamos el proyectil en un ángulo específico.
Solución 1, el ángulo de lanzamiento es fijo, calcule la velocidad:
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
Solución 2, la velocidad es fija, calcule el ángulo de lanzamiento:
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
En mi caso, estas soluciones funcionaron bastante bien.
Si no le importa si es matemáticamente correcto, solo que se ve lo suficientemente correcto, calcule el camino recto y haga que su proyectil siga ese camino, pero "empújelo" a lo largo de la línea normal en función de su distancia hacia abajo el segmento de línea, por lo que sube a medida que se acerca a la mitad del segmento y cae a medida que se aleja de la mitad del segmento de línea.
Puede usar una onda sinusoidal para esto, usando el rango de grados de -90 a +90 (donde -90 es el punto izquierdo en el segmento de línea, 90 es el punto correcto y usted se mueve en el medio), y multiplique el resultado por una constante para escalarlo.
Si necesita la respuesta matemática / física puramente correcta, esto no ayudará. ¡Si no lo hace, esto probablemente puede funcionar bastante bien para usted!
No olvides que la programación del juego se trata de usar ilusiones que parecen correctas (y son más baratas de calcular), en lugar de realismo.
Si solo necesita algo que sea correcto y tenga una velocidad fija, puede usar este método muy simplificado.
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 distancia puede ser negativa, pero seguirá funcionando porque el ángulo también depende de la distancia. Si la distancia es negativa, el ángulo que debe agregarse también es negativo.
Tendrá que jugar con distanceFactor para encontrar el valor correcto. Depende de la gravedad y el poder del proyectil. Debe estar cerca de 1 dividido entre la distancia máxima que puede cubrir el proyectil.