Drehen einer Kamera einer dritten Person in Richtung eines Ziels

10

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.

Beispiel für das, wovon ich spreche

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.

Matchoc
quelle

Antworten:

1

Ich antworte mir, ob es eines Tages jemand anderem hilft:

SFDKT hat die richtige Idee, den Zielpunkt in die aktuelle Blickrichtung der Kamera zu projizieren.

Mein größtes Problem war jedoch, diesen Punkt P zu finden. Es stellte sich heraus, dass ein bisschen Trigonometrie es schaffte, ihn zu lösen.

Betrachtet man das Dreieck aus den drei Punkten CPO:

  1. Da ich die Längen LO, OC und CL kenne, kann ich den Winkel bei C berechnen.

  2. Jetzt kenne ich den Winkel C und die Länge von OC und PO. Mit dem Sinusgesetz können Sie den Winkel bei O finden. (Ich fand diese Website sehr nützlich, um die fehlenden Winkel zu finden.)

  3. Dann kann ich den letzten fehlenden Winkel P finden und erneut das Sinusgesetz verwenden, um die Länge CP zu ermitteln.

  4. Nehmen Sie die Blickrichtung posC + normalisiert (CL) * LängeCP gibt mir die Position von P.

  5. Sobald ich PI habe, kann ich die kürzeste Drehung zwischen OP und OT berechnen, die mir die Quaternion gibt, die ich zum Drehen meiner Kamera benötige.

Ich hatte ein bisschen Probleme mit unerwünschtem Rollen in 3D, aber ich habe gerade das Problem mit Z = 0 gelöst und dann die fehlende Pitch-Rotation berechnet, um den Aufwärtsvektor der Kamera gerade zu halten.

Matchoc
quelle
0

Dieses Bild fügt die Symmetrie hinzu, die zur einfacheren Lösung der Frage erforderlich ist.

Geben Sie hier die Bildbeschreibung ein

Nur projizieren Lentlang des Vektors , CLso dass |P-O|=|T-O|.

Jetzt sind es offensichtlich nur zwei identische Dreiecke ( CPOund C'TO), die um Ihren gewünschten Winkel gedreht wurden. IEang(OT)-ang(OP)

C'und L'sind beide gleich Cund Lnach dem Drehen ungefähr Oum den gleichen Betrag.

DSWFB
quelle