2012-05-17 3 views
13

questo è legato alla The LookAt target location doesn't matter if it is z = 0 or z = 1000 or -1000?Che cosa è esattamente il vettore UP nella funzione LookAt di OpenGL?

ho cercato

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.0f, 1.0f, 0.0f); 

e le cose funzionano bene, e ora posso cambiare 3 ° fila (il vettore UP), ultimo numero di 0.8:

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.0f, 1.0f, 0.8f); 

ed è esattamente lo stesso ... dopo ho provato e modificato la terza riga, il primo numero a 0.8:

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.8f, 1.0f, 0.8f); 

Ora la vista è come ruotata di 45 gradi a sinistra. Come funziona questo vettore UP?

risposta

27

Il vettore up viene utilizzato per creare un prodotto incrociato tra l'occhio e il centro vettore in dotazione per gluLookAt.

dalle intestazioni GLKit su iOS, si può vedere come l'implementazione:

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) 
{ 
    GLKVector3 ev = { eyeX, eyeY, eyeZ }; 
    GLKVector3 cv = { centerX, centerY, centerZ }; 
    GLKVector3 uv = { upX, upY, upZ }; 
    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv))); 
    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n)); 
    GLKVector3 v = GLKVector3CrossProduct(n, u); 

    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f, 
     u.v[1], v.v[1], n.v[1], 0.0f, 
     u.v[2], v.v[2], n.v[2], 0.0f, 
     GLKVector3DotProduct(GLKVector3Negate(u), ev), 
     GLKVector3DotProduct(GLKVector3Negate(v), ev), 
     GLKVector3DotProduct(GLKVector3Negate(n), ev), 
     1.0f }; 

    return m; 
} 

La risposta accettata in questa domanda How do I use gluLookAt properly? fornisce una buona descrizione di ciò che il vettore fino in realtà impatti.

(L'intuizione dietro il vettore "su" in gluLookAt è semplice: guarda qualsiasi cosa Ora inclina la testa di 90 gradi Dove non sei cambiato, la direzione che stai guardando non è cambiata, ma l'immagine nella tua retina ha chiaramente. Qual è la differenza? Dove punta la tua testa. Quello è il vettore in su.)
15

Il vettore su determina quale direzione è "su". Pensala come una videocamera ... se si tiene la fotocamera "correttamente", allora una linea immaginaria che va dal centro della fotocamera alla parte superiore della fotocamera potrebbe essere rappresentata da un vettore (0,1,0) . Se inclini la fotocamera di 45 gradi verso destra, la linea immaginaria che va dal centro della fotocamera alla "parte superiore" della fotocamera verrà ora rappresentata da un nuovo vettore (1,1,0). Se si inclina la fotocamera "indietro" appena un po ', il vettore "su" diventa ora (1,1,1) [o (1,1, -1) ... Ricevo sempre la polarità dell'asse z invertito].

Quindi, in breve, il vettore SU descrive il rotolo della videocamera pronunciando il punto "su" nell'orientamento della fotocamera.

Spero che questo aiuti. :)

(modifica per correggere sintesi come da commento)

+0

_ "Quindi, in breve, il vettore SU descrive il pitch, l'imbardata e il rollio della videocamera dicendo quale punto è" su "nell'orientamento della fotocamera." _ Wrong. Su è solo il rotolo (l'imbardata e il passo sono vincolati dal punto in cui la telecamera sta guardando). – Stan

+3

Questo potrebbe essere Vecchio, ma grazie per questo, questa è finora la prima spiegazione che aveva senso per me! –

2

Funziona esattamente come sembra funzionare.

Immagina di essere a un certo punto nello spazio. E loro immaginano che tu stia guardando alcune unità del punto 2000 direttamente nella direzione -Z da te.

Ci sono un numero infinito di telecamere possibili con queste caratteristiche, ma sono diverse in base al fatto di avere una diversa direzione "su". Quindi le diverse direzioni "su" corrispondono ad avere un diverso orientamento attorno alla direzione della vista.

Il vettore verso l'alto è la direzione del vettore che è allineata con la direzione "su" che si desidera avere. Cioè, se dovessi disegnare il vettore verso l'alto dal punto della tua videocamera, vedresti una linea verticale diritta rivolta verso l'alto.

Ora, guarda indietro alla tua vista immaginata e guarda quella linea verticale. Puoi dire se quella linea verticale si stava muovendo verso o lontano da te? No; è solo una linea verticale. Quindi non importa se il vettore in su parte punti nella direzione della vista. Ciò che importa è che la direzione verso l'alto non è esattamente che punta nella direzione della vista.

Quando si assegna alla direzione verso l'alto una coordinata Z diversa da zero, ora punta parzialmente nella direzione della vista (cioè: l'asse Z). Questa parte è in definitiva irrilevante rispetto alla direzione verso l'alto, quindi viene ignorata. Quando si attribuisce una direzione non uguale a coordinata X, vale a dire non nella direzione della vista, quindi è significativa.

Il punto è che se si modifica l'aspetto della vista o il punto di origine della telecamera, non è necessario modificare anche la direzione verso l'alto. Finché non stai guardando direttamente lungo l'asse ascendente, stai bene.

+0

Se sono seduto su una sedia guardando dritto davanti a me, con in mano un iPad proprio davanti ai miei occhi, allora la mia cima della mia testa sta puntando verso il cielo, quindi il '(0, 1, 0)' ... che ne dite se lo cambio a '(0, 0.00001, 1)', questo significa che sono quasi sdraiato, con il mio viso e gli occhi rivolti verso il cielo ... quindi come mai il risultato è esattamente lo stesso se uso '(0, 1, 0) '? –

+2

@ JeremyL: Perché se stai sdraiati con il viso e gli occhi rivolti verso il cielo, non guarderesti più il tuo iPad. Vedi il problema? La funzione deve capire quali sono i vincoli più importanti. La posizione della telecamera e la posizione di osservazione prevalgono nella direzione verso l'alto in termini di decidere * dove * stai guardando. La direzione verso l'alto è usata esclusivamente per l'orientamento * dopo * decidere dove stai guardando. Cambiare la direzione verso l'alto non cambierà mai dove stai guardando, solo * come * stai guardando in quella direzione. –

+0

quello che sto dicendo è che se sei quasi sdraiato, il risultato è ESATTAMENTE LO STESSO come seduto su una sedia che guarda dritto davanti –

4

I primi due parametri di gluLookAt sono la posizione della telecamera e il target della telecamera. Con solo questi due la fotocamera non è completamente vincolata. Immagina di stare in piedi da qualche parte con una macchina fotografica. È possibile tenere la fotocamera orizzontalmente per scattare una foto orizzontale, oppure è possibile tenere la fotocamera verticalmente per scattare una foto verticale. In entrambi i casi, la posizione della fotocamera e la posizione del soggetto dell'immagine sono uguali. È possibile ruotare la telecamera su qualsiasi angolo e questi due valori non cambiano. Il terzo parametro, il vettore su, seleziona l'orientamento della telecamera.