Comment faire atterrir une flèche à une position spécifique dans l'espace mondial 3D

8

Dans mon jeu, lorsque je clique avec la souris sur le terrain quelque part, j'aimerais que le joueur tire une flèche vers cette position de manière parabolique.

La flèche a une position, une accélération et une vitesse utilisant toutes des vecteurs 3D. J'ai regardé la trajectoire d'un article de projectile sur wikipedia, mais je ne sais pas comment l'appliquer dans ma situation car cela explique les mathématiques 2D. Je me demandais s'il y avait une solution pour les vecteurs 3D? Avez-vous de bonnes ressources liées à la situation 3D?

pseudo
la source
5
Je n'écrirai pas cela comme une réponse car j'espère que quelqu'un pourra donner une réponse plus approfondie, mais vous pouvez utiliser la solution 2D en 3D. La solution 2D s'applique au plan vertical qui traverse le point de départ et d'arrivée, vous prenez donc la solution 2D et la faites pivoter pour correspondre à ce plan dans l'espace 3D.
Kylotan

Réponses:

12

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'.

diagramme

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)
Jimmy
la source
Merci, j'ai réussi à le faire fonctionner! Toujours en train de trouver comment le faire fonctionner avec différentes hauteurs maintenant ... :)
Nick
Nooooo! Euh. Cela peut être résolu analytiquement dans n'importe quelle dimension sans recourir à des coordonnées changeantes ou à la trigonométrie. Voir Comment tenir compte de l'accélération lors de la visée de projectiles? et playtechs.blogspot.com/2007/04/aiming-at-moving-target.html pour des exemples.
Electro