Para ampliar el comentario de Kylotan, puede usar las fórmulas 2D en 3D. Asumiendo que Y está arriba:
calcule la posición del objetivo en el espacio X'Y'Z ', donde el eje X' es paralelo a la dirección de vuelo de la flecha, el eje Y 'está arriba y Z' es perpendicular a los ejes X 'e Y'.
Una vez que haya calculado X 'e Y', puede volver a convertir al espacio XYZ real
Ejemplo
Un arquero está en (1,0,1). Quiere disparar una flecha a (4,0,5). Consideramos que X 'es el vector unitario (0.6, 0, 0.8) ya que apunta directamente desde el origen al punto de destino. Luego consideramos que Z 'es (-0.8, 0, 0.6) porque es una perpendicular, pero como la flecha no se mueve en el eje Z', la ignoraremos. Su problema ahora es descubrir cómo disparar una flecha de (0,0) a (0,5) en el espacio X'Y '.
.. hacer cálculos 2D aquí. Tenga en cuenta que probablemente querrá funciones paramétricas de X 'e Y' en términos de t , la variable de tiempo.
Una forma de abstraer la conversión entre las dos coordenadas es usar una matriz de transformación.
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)
Cuando volvemos a convertir de X'Y'Z ' a XYZ , esto es simplemente una transformación lineal inversa.
let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)