Tengo una cámara en tercera persona que no mira directamente al jugador, sino en algún lugar frente a él.
Cuando el usuario ingresa al modo de disparo, quiero que la cámara dé la vuelta al jugador para mirar al objetivo.
En la imagen de arriba. "O" es el jugador (Origen), "L" es el lookat, "C" es la posición de la cámara y "T" es el objetivo. Quiero rotar la línea de búsqueda C-> L para que pase por T (C '-> L' -> T ') alrededor del Origen ("O").
Básicamente necesito encontrar el ángulo alfa que puse en rojo en la imagen.
Almaceno la posición de mi cámara en una estructura como esta:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Entonces, si pudiera encontrar el ángulo que estoy buscando, podría hacer algo como:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Para que el jugador mire siempre al objetivo.
Si el lookat pasara por Origin, simplemente podría hacer
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;
Sin embargo, en el diagrama anterior, esto no funciona del todo, ya que la rotación está desviada del origen.