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.
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.
la source