Obracanie kamery trzeciej osoby w kierunku celu

10

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.

przykład tego, o czym mówię

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.

Matchoc
źródło

Odpowiedzi:

1

Odpowiadając sobie, czy to pomoże komuś innemu:

SFDKT ma dobry pomysł na rzutowanie punktu docelowego na bieżący kierunek patrzenia kamery.

Jednak moim największym problemem było znalezienie tego punktu P. Okazało się, że odrobinę trygonometrii udało się go rozwiązać.

Biorąc pod uwagę trójkąt utworzony z trzech punktów CPO:

  1. Ponieważ znam długości LO, OC i CL, mogę obliczyć kąt w C.

  2. Teraz znam kąt C oraz długość OC i PO. Korzystając z prawa sinusów, możesz znaleźć kąt w O. (Uważam, że ta strona jest bardzo przydatna do znajdowania brakujących kątów)

  3. Następnie mogę znaleźć ostatni brakujący kąt P i ponownie użyć prawa Sinusów, aby znaleźć długość CP.

  4. Popatrz w kierunku posC + znormalizowana (CL) * długośćCP daje mi pozycję P.

  5. Kiedy już mam PI, mogę obliczyć najkrótszy obrót między OP i OT, co daje mi czwartorzęd, którego potrzebuję, aby obrócić kamerę.

Miałem trochę problemów z niechcianym przechyleniem w 3D, ale właśnie rozwiązałem problem z Z = 0, a następnie obliczyłem brakujący obrót skoku, aby utrzymać wektor w górę kamery prosto.

Matchoc
źródło
0

to zdjęcie dodaje symetrię potrzebną do łatwiejszego rozwiązania pytania.

wprowadź opis zdjęcia tutaj

Wystarczy rzutować Lwzdłuż wektora CL, aby |P-O|=|T-O|.

Teraz są to oczywiście tylko dwa identyczne trójkąty ( CPOi C'TO) obrócone o pożądany kąt. TO ZNACZYang(OT)-ang(OP)

C'i L'oba są takie same Ci Lpo obróceniu, mniej więcej Oo tę samą ilość.

DSWFB
źródło