Para expandir o comentário de Kylotan, você pode usar as fórmulas 2D em 3D. Supondo que Y esteja ativo:
calcule a posição do alvo no espaço X'Y'Z ', onde o eixo X' é paralelo à direção do vôo da seta, o eixo Y 'está para cima e Z' é perpendicular aos eixos X 'e Y'.
Depois de calcular X 'e Y', você pode converter novamente em espaço XYZ real
Exemplo
Um arqueiro está em (1,0,1). Ele quer disparar uma flecha para (4,0,5). Tomamos X 'como o vetor unitário (0,6, 0, 0,8), uma vez que aponta diretamente da fonte para o ponto de destino. Em seguida, consideramos Z '(-0,8, 0, 0,6) porque é uma perpendicular, mas como a seta não se move no eixo Z', a ignoraremos. Seu problema agora é descobrir como disparar uma flecha de (0,0) a (0,5) no espaço X'Y '.
.. faça cálculos 2D aqui. Observe que você provavelmente desejará funções paramétricas de X 'e Y' em termos de t , a variável de tempo.
Uma maneira de abstrair a conversão entre as duas coordenadas é usar uma matriz de transformação.
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 convertemos de X'Y'Z ' para XYZ , isso é simplesmente uma transformação linear reversa.
let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)