OpenGL ruotando una telecamera attorno ad un punto
Domanda
In OpenGL sto provando a ruotare una videocamera attorno a un punto, con la distanza della videocamera r dal punto e rivolta verso il punto quando ruota. In altre parole, voglio che la videocamera si sposti lungo la circonferenza di un cerchio a un raggio r dal centro, con la videocamera rivolta verso il centro in qualsiasi punto lungo la circonferenza.
Diciamo che nello spazio 3d il centro del cerchio è (3, 0, 3);
Ho provato:
// move to center of circle
glTranslatef(-3, 0, -3)
// move a distance away from the circle
glTranslatef(0, 0, r);
// rotate along the y "up" axis
glRotatef(CameraAngle, 0, 1, 0);
dove CameraAngle indica i gradi che vengono spostati attorno al cerchio.
Il mio risultato finale è che la telecamera sta ancora ruotando lungo l'origine, non al centro del cerchio. Qualcuno può aiutarmi a risolvere questo problema? Grazie!
Soluzione
Devi:
- ruota la videocamera intorno all'origine e poi traducila (*)
o
- usa
gluLookAt
per mantenere la fotocamera puntata al centro del cerchio
(*) normalmente ruotano attorno all'origine. Per ruotare attorno ad un altro punto P
devi:
- translate (-P)
- Ruota ??li>
- translate (P)
Altri suggerimenti
è un po 'confuso, ma penso che dovresti:
// move camera a distance r away from the center
glTranslatef(0, 0, -r);
// rotate
glRotatef(angley, 0, 1, 0);
glRotatef(anglex, 1, 0, 0);
// move to center of circle
glTranslatef(-cx, -cy, -cz)
nota che l'ordine NON deve essere modificato.
Perché preoccuparsi di tutto il problema di ruotare la telecamera e non ruotare la scena stessa?
È molto più semplice. basta ruotare la matrice modelview attorno all'origine. Otterrai lo stesso esatto risultato.
Trovo problemi come questo molto più facili da risolvere con gluLookAt (). Definisci un percorso per la telecamera (un cerchio è facile!) E mantieni il "centro" punto fisso (cioè la cosa che stai guardando).
L'unico trucco possibile è definire un buon vettore, ma di solito non troppo lavoro. Se il percorso e il punto target sono sullo stesso piano, puoi usare sempre lo stesso vettore up!