2012-03-02 8 views
8

La documentazione OpenGL dicono che il gluLookAt() chiama dovrebbe essere fatto sulla matrice GL_MODELVIEW:gluLookAt() migliore utilizzo, su matrice GL_PROJECTION o su matrice GL_MODELVIEW

http://www.opengl.org/resources/faq/technical/viewing.htm

Infatti la documentazione collegamento a un articolo che dice che l'uso di gluLookAt() sulla matrice GL_PROJECTION è estremamente cattivo:

Help stamp out GL_PROJECTION abuse

D'altra parte, ci sono un sacco di tutorial ed esempi in cui gluLookAt() è i n fatto appello alla matrice GL_PROJECTION. E allo stesso tempo, mentre l'articolo menzionato sopra dice di NON usarlo sulla matrice GL_PROJECTION, è ovvio che nella maggior parte di questi casi non ci sono problemi visibili.

Le mie domande sono: qual è il modo migliore di usare gluLookAt() nei progetti di vita reale? È davvero così tanto no no da usarlo sulla matrice GL_PROJECTION?

+4

"D'altra parte, ci sono un sacco di tutorial ed esempi in cui gluLookAt() viene infatti chiamato sulla matrice GL_PROJECTION." Ci sono un sacco di tutorial GL un esempio che fa cose stupide. Questa non è una giustificazione per farli. In effetti, è ancora un altro motivo per evitare tutorial GL che non usano shader; almeno le esercitazioni sullo shader sono scritte da persone che sanno cose. –

risposta

8

La funzione gluLookAt() offre una matrice di trasformazione che trasforma una rotazione di un oggetto nella scena. Quindi questa è chiaramente una trasformazione del modello e deve andare nella matrice GL_MODELVIEW.

quanto riguarda il perché, questa diventa più chiaro quando fai da te in un vertex:

Mentre la posizione dei vertici sono infatti solo v.pos * modelview * projection, la matrice modelview è necessario senza il componente proiezione per altri calcoli (per esempio illuminazione e nebbia). Ecco perché la pipeline a funzione fissa separa queste due matrici.

Quindi è necessario attenersi ai paradigmi specificati nell'API e, soprattutto, non fidarsi mai delle miriadi di "tutorial" opengl difettosi.

+0

L'ordine delle operazioni durante la trasformazione di un vertice è normalmente in altro modo: 'projection * modelview * v.pos' se lo fai in questo modo, devi trasporre tutte le matrici ei vettori. – datenwolf

2

Non sono sicuro di aver capito la domanda. Stai chiedendo perché la pagina ti dice di non fare qualcosa che funziona solo "la maggior parte" del tempo?

Non è difficile da capire. "La maggior parte di tali usi", per definizione, significa che ci sono alcuni tali usi do problemi di esposizione.

Quindi è possibile fare la cosa che funzionerà a volte e poi rompere altre volte, oppure si può fare la cosa che funzionerà sempre.

Questa non è una scelta difficile. Anche più difficile da quando farlo nel modo giusto significa letteralmente spostare una riga di codice verso il basso di un paio di linee.

1

Le mie domande sono: qual è il modo migliore di usare gluLookAt() nei progetti di vita reale? È davvero così tanto no no da usarlo sulla matrice GL_PROJECTION?

Utilizzare sempre la matrice modelview per posizionare il punto di vista. Questo è anche nel nome della matrice modello (vale a dire il posizionamento della geometria) e vista (posizionamento del punto di vista).

La matrice di proiezione è una specie di obiettivo della "videocamera" OpenGL. Non muovi l'obiettivo della tua fotocamera, mantenendo il corpo della fotocamera in posizione per impostare la vista, vero? Spostare l'obiettivo ha le sue applicazioni, come implementare effetti di inclinazione/spostamento.

Problemi correlati