Rotation d'une caméra à la troisième personne vers une cible

10

J'ai une caméra à la troisième personne qui ne regarde pas directement le joueur mais quelque part devant lui.

Lorsque l'utilisateur entre en mode de prise de vue, je veux que l'appareil photo tourne autour du joueur pour faire face à la cible.

exemple de ce dont je parle

Dans l'image ci-dessus. "O" est le joueur (origine), "L" est le lookat, "C" est la position de la caméra et "T" est la cible. Je veux faire pivoter la ligne de lookat C-> L afin qu'elle passe par T (C '-> L' -> T ') autour de l'origine ("O").

Fondamentalement, je dois trouver l'angle alpha que j'ai mis en rouge dans l'image.

Je stocke la position de ma caméra dans une structure comme celle-ci:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Donc, si je pouvais trouver l'angle que je cherchais, je pourrais faire quelque chose comme:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Pour que le joueur regarde toujours la cible.

Si le lookat passait par l'Origine je pourrais simplement faire

Vec3 origDir = cam->lookAtOffset - cam->absolutePosition;
origDir.normalize();
Vec3 newDir = cam->target - cam->absolutePosition;
newDir.normalize();
Quaternion q(origDir, newDir); // from->to
cam->absoluteRotation = cam->absoluteRotation * q;

Cependant, dans le diagramme ci-dessus, cela ne fonctionne pas tout à fait car la rotation est décalée par rapport à l'origine.

Matchoc
la source

Réponses:

1

Me répondre si cela aide un jour quelqu'un d'autre:

SFDKT a la bonne idée de projeter le point cible dans la direction actuelle de la caméra.

Cependant, mon plus gros problème était de trouver ce point P. Il s'est avéré qu'un peu de trigonométrie a réussi à le résoudre.

Considérant le triangle formé par les trois points CPO:

  1. Comme je connais les longueurs LO, OC et CL, je peux calculer l'angle en C.

  2. Maintenant, je connais l'angle C et la longueur de OC et PO. En utilisant la loi des sinus, vous pouvez trouver l'angle en O. (J'ai trouvé ce site Web très utile pour trouver les angles manquants)

  3. Ensuite, je peux trouver le dernier angle manquant P et utiliser à nouveau la loi de Sines pour trouver la longueur CP.

  4. Prendre la direction du regard posC + normalisé (CL) * longueurCP me donne la position de P.

  5. Une fois que j'ai PI, je peux calculer la rotation la plus courte entre OP et OT, ce qui me donne le quaternion dont j'ai besoin pour faire tourner ma caméra.

J'ai eu un peu de mal avec le roulis indésirable en 3D, mais je viens de résoudre le problème avec Z = 0, puis j'ai calculé la rotation de tangage manquante pour garder le vecteur haut de la caméra droit.

Matchoc
la source
0

cette image ajoute la symétrie nécessaire pour résoudre la question plus facilement.

entrez la description de l'image ici

Projetez simplement le Llong du vecteur CLpour que |P-O|=|T-O|.

Maintenant, il ne s'agit évidemment que de deux triangles identiques ( CPOet C'TO) tournés de l'angle souhaité. C'EST À DIREang(OT)-ang(OP)

C'et L'sont tous les deux les mêmes que Cet Laprès la rotation, environ O, de la même quantité.

DSWFB
la source