Ho una telecamera in terza persona che non guarda direttamente il giocatore ma da qualche parte davanti a lui.
Quando l'utente entra in modalità di scatto, voglio che la videocamera giri il giocatore verso il bersaglio.
Nell'immagine sopra. "O" è il giocatore (Origine), "L" è il lookat, "C" è la posizione della telecamera e "T" è il bersaglio. Voglio ruotare la linea di ricerca C-> L in modo che passi per T (C '-> L' -> T ') attorno all'origine ("O").
Fondamentalmente ho bisogno di trovare l'angolo alfa che ho messo in rosso nella foto.
Conservo la posizione della mia fotocamera in una struttura come questa:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Quindi, se potessi trovare l'angolazione che sto cercando, potrei fare qualcosa del tipo:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Per far sì che il giocatore guardi sempre il bersaglio.
Se il lookat stava passando da Origin, potrei semplicemente fare
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;
Tuttavia nel diagramma sopra questo non funziona del tutto poiché la rotazione è sfalsata rispetto all'origine.