Rotazione di una telecamera di terza persona verso un bersaglio


10

Ho una telecamera in terza persona che non guarda direttamente il giocatore ma da qualche parte davanti a lui.

Quando l'utente entra in modalità di scatto, voglio che la videocamera giri il giocatore verso il bersaglio.

esempio di ciò di cui sto parlando

Nell'immagine sopra. "O" è il giocatore (Origine), "L" è il lookat, "C" è la posizione della telecamera e "T" è il bersaglio. Voglio ruotare la linea di ricerca C-> L in modo che passi per T (C '-> L' -> T ') attorno all'origine ("O").

Fondamentalmente ho bisogno di trovare l'angolo alfa che ho messo in rosso nella foto.

Conservo la posizione della mia fotocamera in una struttura come questa:

struct CameraTarget {
     Quaternion absoluteRotation;
     Vec3 absolutePosition;
     Vec3 cameraOffset;
     Vec3 lookatOffset;
     float FOV;
}

Quindi, se potessi trovare l'angolazione che sto cercando, potrei fare qualcosa del tipo:

cam->absoluteRotation = cam->absoluteRotation * alpha;

Per far sì che il giocatore guardi sempre il bersaglio.

Se il lookat stava passando da Origin, potrei semplicemente fare

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;

Tuttavia nel diagramma sopra questo non funziona del tutto poiché la rotazione è sfalsata rispetto all'origine.

Risposte:


1

Rispondere a me stesso se un giorno aiuta qualcun altro:

SFDKT ha l'idea giusta di proiettare il punto target nella direzione di sguardo della telecamera corrente.

Tuttavia, il mio più grande problema era trovare questo punto P. Si è scoperto che un po 'di trigonometria è riuscita a risolverlo.

Considerando il triangolo formato dai tre punti CPO:

  1. Poiché conosco le lunghezze LO, OC e CL, posso calcolare l'angolo a C.

  2. Ora conosco l'angolo C e la lunghezza di OC e PO. Usando la legge dei seni puoi trovare l'angolo su O. (Ho trovato questo sito molto utile per trovare gli angoli mancanti)

  3. Quindi posso trovare l'ultimo angolo mancante P e usare di nuovo la legge di Sines per trovare la lunghezza CP.

  4. Prendi la direzione dello sguardo posC + normalized (CL) * lengthCP mi dà la posizione di P.

  5. Una volta che ho PI in grado di calcolare la rotazione più breve tra OP e OT che mi dà il quaternione ho bisogno di ruotare la mia macchina fotografica.

Ho avuto un po 'di problemi con il rollio indesiderato in 3D, ma ho appena risolto il problema con Z = 0, quindi ho calcolato la rotazione del pitch mancante per mantenere dritto il vettore della fotocamera.


0

questa immagine aggiunge la simmetria necessaria per risolvere più facilmente la domanda.

inserisci qui la descrizione dell'immagine

Basta proiettare L lungo il vettore in CLmodo che |P-O|=|T-O|.

Ora sono ovviamente solo due triangoli identici (CPO e C'TO) ruotati secondo l'angolo desiderato. IEang(OT)-ang(OP)

C'e L'sono entrambi uguali Ce Ldopo aver ruotato, circa O, della stessa quantità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.