J'ai deux objets (cible et joueur), les deux ont Position (Vector3) et Rotation (Quaternion). Je veux que la cible tourne et soit face au joueur. La cible, quand elle tire, doit tirer directement sur le joueur.
J'ai vu de nombreux exemples de slerping pour le joueur, mais je ne veux pas de rotation incrémentielle, eh bien, je suppose que ce serait ok tant que je peux faire que le slerp soit à 100%, et aussi longtemps que cela fonctionne.
FYI - Je suis capable d'utiliser la position et la rotation pour faire beaucoup d'autres choses et tout fonctionne très bien, sauf cette dernière pièce que je ne peux pas comprendre.
Échantillons de code exécutés dans la classe Target, Position = la position des cibles, Avatar = le joueur.
MODIFIER
J'utilise maintenant le code c # de Maik qu'il a fourni et cela fonctionne très bien!
0*(rotation A) + 1*(rotation B)
- en d'autres termes, vous définissez simplement la rotation sur la rotation B à long terme. Slerp sert uniquement à déterminer à quoi devrait ressembler la rotation (0% <x <100%) entre les deux.Réponses:
Il existe plusieurs façons de procéder. Vous pouvez calculer l'orientation absolue ou la rotation par rapport à votre avatar, cela signifie que votre nouvelle orientation = avatarOrientation * q. Voici le dernier:
Calculez l'axe de rotation en prenant le produit croisé du vecteur avant unitaire de votre avatar et le vecteur unitaire d'avatar à la cible, le nouveau vecteur avant:
Calculer l'angle de rotation à l'aide du produit scalaire
Créez le quaternion en utilisant rotAxis et rotAngle et multipliez-le avec l'orientation actuelle de l'avatar
Si vous avez besoin d'aide pour trouver le vecteur avant actuel de l'avatar, l'entrée pour 1. tirez juste :)
EDIT: Le calcul de l'orientation absolue est en fait un peu plus facile, utilisez le vecteur direct de la matrice d'identité au lieu du vecteur direct avatars comme entrée pour 1) et 2). Et ne le multipliez pas en 3), utilisez-le directement comme nouvelle orientation:
newRot = q
Important à noter: La solution présente 2 anomalies dues à la nature du produit croisé:
Si les vecteurs directs sont égaux. La solution ici est simplement de retourner le quaternion d'identité
Si les vecteurs pointent exactement dans la direction opposée. La solution ici est de créer le quaternion en utilisant les avatars axe haut comme axe de rotation et l'angle 180,0 degrés.
Voici l'implémentation en C ++ qui prend en charge ces cas marginaux. Le convertir en C # devrait être facile.
EDIT: Version corrigée du code XNA de Marc
la source
newForward
rotAngle
rotAxis
et lereturned quaternion
. Le code pour la foule sera le même, une fois que nous l'aurons fait fonctionner avec l'avatar, il sera facile de changer le titre de n'importe quel objet.