Mam aparat w 3 osobie, który nie patrzy bezpośrednio na gracza, ale gdzieś przed nim.
Gdy użytkownik wejdzie w tryb fotografowania, chcę, aby aparat obrócił gracza w stronę celu.
Na obrazku powyżej. „O” to odtwarzacz (Origin), „L” to wygląd, „C” to pozycja kamery, a „T” to cel. Chcę obrócić linię patrzenia C-> L, tak aby przechodziła obok T (C '-> L' -> T ') wokół początku („O”).
Zasadniczo muszę znaleźć kąt alfa, który umieściłem na czerwono na zdjęciu.
Przechowuję pozycję kamery w takiej strukturze:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Więc gdybym mógł znaleźć kąt, którego szukam, mógłbym zrobić coś takiego:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Aby gracz zawsze patrzył na cel.
Gdyby minęło pochodzenie, mógłbym to po prostu zrobić
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;
Jednak na powyższym schemacie to nie działa, ponieważ obrót jest przesunięty względem początku.
źródło