Eu tenho uma câmera de terceira pessoa que não olha diretamente para o jogador, mas em algum lugar à sua frente.
Quando o usuário entra no modo de disparo, quero que a câmera vire o player para enfrentar o alvo.
Na imagem acima. "O" é o jogador (Origem), "L" é a aparência, "C" é a posição da câmera e "T" é o alvo. Quero girar a linha lookat C-> L para que ela passe por T (C '-> L' -> T ') ao redor da origem ("O").
Basicamente, preciso encontrar o ângulo alfa que coloquei em vermelho na imagem.
Eu guardo a posição da minha câmera em uma estrutura como esta:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Então, se eu pudesse encontrar o ângulo que estou procurando, poderia fazer algo como:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Para fazer com que o jogador sempre olhe para o alvo.
Se o lookat estivesse passando pela Origem, eu poderia simplesmente fazer
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;
No entanto, no diagrama acima, isso não funciona muito, pois a rotação é deslocada da Origem.