Per espandere il commento di Kylotan, puoi usare le formule 2D in 3D. Supponendo che Y sia attivo:
calcola la posizione del bersaglio nello spazio X'Y'Z ', dove l'asse X' è parallelo alla direzione di volo della freccia, l'asse Y 'è su e Z' è perpendicolare agli assi X 'e Y'.
Dopo aver calcolato X 'e Y', è possibile riconvertire in spazio XYZ reale
Esempio
Un arciere è a (1,0,1). Vuole lanciare una freccia su (4,0,5). Consideriamo X 'come vettore unitario (0.6, 0, 0.8) poiché punta direttamente dal punto sorgente a quello di destinazione. Quindi prendiamo Z 'per essere (-0,8, 0, 0,6) perché è una perpendicolare, ma poiché la freccia non si muove nell'asse Z', la ignoreremo. Il tuo problema ora è capire come scoccare una freccia da (0,0) a (0,5) nello spazio X'Y '.
.. fai calcoli 2D qui. Nota che probabilmente vorrai funzioni parametriche di X 'e Y' in termini di t , la variabile temporale.
Un modo per astrarre la conversione tra le due coordinate è usare una matrice di trasformazione.
let archer = Vector3d(1.0,0.0,1.0)
let target = Vector3d(4.0,0.0,5.0)
let travel = target - archer
let transform = Matrix4d.CreateTranslation(-archer) *
Matrix4d.CreateRotationY(Math.Atan2(travel.Z,travel.X))
Vector3d.Transform(archer, transform) // transforms archer to (0,0,0)
Vector3d.Transform(target, transform) // transforms target to (5,0,0)
quando riconvertiamo da X'Y'Z ' a XYZ , questa è semplicemente una trasformazione lineare inversa.
let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)