Risposte:
La funzione di vassoio parabolico è definita come:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
Valori noti:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
Valori sconosciuti:
Vo: Initial Velocity
Per calcolare 'Vo', possiamo dare valori alla funzione F:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
Ora puoi ottenere tutti i valori per raggiungere l'obiettivo dall'origine dando valori a t nell'equazione F:
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
Di recente ho dovuto risolvere un problema simile, ho trovato due soluzioni, basate sulla formula che ho trovato nella pagina di Wikipedia "Dan the Man" già menzionata: Traiettoria di un proiettile
In questa soluzione è necessario in ogni caso l'angolo di lancio fisso o la velocità x. La velocità Y non è necessaria quando lanciamo il proiettile in un angolo specifico.
Soluzione 1, l'angolo di lancio è fisso, calcola la velocità:
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
Soluzione 2, la velocità è fissa, calcola l'angolo di lancio:
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
Nel mio caso questa soluzione ha funzionato abbastanza bene.
Se non ti interessa se è matematicamente corretto, solo che sembra abbastanza corretto, calcola il percorso rettilineo e fai seguire al tuo proiettile quel percorso, ma "spingilo su" lungo il normale di quella linea in funzione della sua distanza in basso il segmento di linea, quindi aumenta man mano che si avvicina al centro del segmento e diminuisce man mano che si allontana dal centro del segmento di linea.
Per questo potresti usare un'onda sinusoidale, usando l'intervallo di gradi da -90 a +90 (dove -90 è il punto sinistro sul segmento di linea, 90 è il punto giusto e ti muovi nel mezzo), e moltiplica il risultato da una costante per ridimensionarlo.
Se hai bisogno della risposta matematica / fisica puramente corretta, questo non sarà di aiuto. In caso contrario, probabilmente questo potrebbe funzionare abbastanza bene per te!
Non dimenticare, la programmazione del gioco riguarda l'uso di illusioni che sembrano corrette (e sono più economiche da calcolare), invece del realismo.
Se hai solo bisogno di qualcosa che è giusto e hai una velocità fissa, puoi usare questo metodo molto semplificato.
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 distanza può essere negativa ma funzionerà comunque perché anche l'angolo dipende dalla distanza. Se la distanza è negativa, anche l'angolo che deve essere aggiunto è negativo.
Dovrai giocare con distanceFactor per trovare il giusto valore. Dipende dalla gravità e dalla potenza del proiettile. Dovrebbe essere vicino a 1 diviso per la distanza massima che il proiettile può coprire.