Pour développer le commentaire de Kylotan, vous pouvez utiliser les formules 2D en 3D. En supposant que Y est en hausse:
calculer la position de la cible dans l'espace X'Y'Z ', où l'axe X' est parallèle à la direction de vol de la flèche, l'axe Y 'est vers le haut et Z' est perpendiculaire aux axes X 'et Y'.
Une fois que X 'et Y' ont été calculés, vous pouvez reconvertir en espace XYZ réel
Exemple
Un archer est à (1,0,1). Il veut tirer une flèche vers (4,0,5). Nous considérons X 'comme le vecteur unitaire (0,6, 0, 0,8) car il pointe directement du point source au point destination. Nous prenons alors Z 'pour être (-0,8, 0, 0,6) car c'est une perpendiculaire, mais comme la flèche ne se déplace pas dans l'axe Z', nous l'ignorerons. Votre problème est maintenant de savoir comment tirer une flèche de (0,0) à (0,5) dans l'espace X'Y '.
.. faites des calculs 2D ici. Notez que vous voudrez probablement des fonctions paramétriques de X 'et Y' en termes de t , la variable de temps.
Une façon d'abstraire la conversion entre les deux coordonnées est d'utiliser une matrice de transformation.
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)
lorsque nous reconvertissons de X'Y'Z ' en XYZ , il s'agit simplement d'une transformation linéaire inverse.
let inverse = Matrix4d.Invert(transform)
Vector3d.Transform(Vector3d.Zero, transform) // transforms (0,0,0) to (1,0,1)