Ich habe eine 3rd-Person-Kamera, die nicht direkt auf den Player schaut, sondern irgendwo vor ihm.
Wenn der Benutzer in den Aufnahmemodus wechselt, möchte ich, dass sich die Kamera um den Player dreht, um das Ziel zu erreichen.
Im Bild oben. "O" ist der Spieler (Ursprung), "L" ist der Lookat, "C" ist die Kameraposition und "T" ist das Ziel. Ich möchte die Lookat-Linie C-> L so drehen, dass sie an T (C '-> L' -> T ') um den Ursprung ("O") vorbeigeht.
Grundsätzlich muss ich den Winkel Alpha finden, den ich im Bild rot eingefügt habe.
Ich speichere meine Kameraposition in einer Struktur wie der folgenden:
struct CameraTarget {
Quaternion absoluteRotation;
Vec3 absolutePosition;
Vec3 cameraOffset;
Vec3 lookatOffset;
float FOV;
}
Wenn ich also den Winkel finden könnte, den ich suche, könnte ich etwas tun wie:
cam->absoluteRotation = cam->absoluteRotation * alpha;
Damit der Spieler immer auf das Ziel schaut.
Wenn der Lookat am Ursprung vorbeiging, konnte ich es einfach tun
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;
Im obigen Diagramm funktioniert dies jedoch nicht ganz, da die Drehung vom Ursprung versetzt ist.