2013-04-25 15 views
20

sto cercando di capire la creazione di spazi in OpenGL:oggetto, mondo, macchina fotografica e proiezione spazi in OpenGL

  1. spazio oggetto spazio

  2. mondo

  3. spazio fotocamera

  4. Spazio di proiezione


La mia comprensione di queste fasi è corretta?

  1. Il "cubo" viene creato nel centro del sistema di coordinate cartesiano, direttamente all'interno del programma digitando i vertici coordinate.

  2. Le coordinate vengono trasformate in coordinate all'interno del "mondo", che significa spostarlo in qualsiasi punto dello schermo.

Beh, in realtà mi piacerebbe che tu verificassi la mia comprensione di questi due termini.


Ora, sto creando un triangolo sullo schermo nero. In che modo il codice openGL si adatta a questi spazi?

Funziona sul flag per impostazione predefinita, ma quello è il secondo stadio - lo spazio del mondo. Significa che chiamare glVertex3f() crea un triangolo nello spazio oggetti?

Dove è lo spazio mondiale?


Inoltre, ho letto che gli ultimi due spazi non fanno parte della pipeline openGL (o come si chiama). Tuttavia, OpenGL contiene bandiere come il GL_PROJECTION, ad esempio:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glViewport(0, 0, w, h); // w - width, h - height 
gluPerspective(45, ratio, 1, 100); // radio = w/h 
glMatrixMode(GL_MODELVIEW); 

Cosa codice? Imposta la prospettiva. Crea l'asse z? Ma non è già la parte dello spazio dell'oggetto?

+2

Spero che non si "digitino" realmente le geometrie dell'oggetto (eccetto quelle molto semplici). Dovresti caricarli da un file. – datenwolf

risposta

35

1) Lo spazio oggetto è i vertici dell'oggetto relativi all'origine dell'oggetto. Nel caso di un cubo 1x1x1, i tuoi vertici sarebbero:

(0.5, 0.5, 0.5) 
(-0.5, 0.5, 0.5) 
(0.5, -0.5, 0.5) 
(-0.5, -0.5, 0.5) 

ecc

2) lo spazio World è dove l'oggetto è nel vostro mondo. Se vuoi che questo cubo sia a (15, 10), devi creare una matrice di traduzione che, una volta moltiplicata per ogni vertice, centra i tuoi vertici attorno a (15, 10). Ad esempio, il primo vertice diventerebbe (15.5, 10.5, 0.5). La matrice per passare dall'oggetto allo spazio mondiale è chiamata matrice "modello".

3) Lo spazio per gli occhi (a volte chiamato spazio della fotocamera) è il mondo relativo alla posizione del visualizzatore.Poiché questa deve essere una matrice che viene moltiplicata per ogni vertice, è tecnicamente l'inverso dell'orientamento della telecamera. Cioè, se vuoi una telecamera al (0, 0, -10), la tua matrice "vista" deve essere una traduzione di (0, 0, 10). In questo modo tutti gli oggetti nel mondo sono in avanti di 10 unità, facendo sembrare che sei indietro di 10 unità.

4) Lo spazio di proiezione è il modo in cui applichiamo una prospettiva corretta a una scena (supponendo che non stai utilizzando una proiezione ortografica). Questo è quasi sempre rappresentato da un tronco, e lo this article può spiegarlo meglio di me. Essenzialmente stai mappando lo spazio 3d su un altro spazio distorto.

OpenGL gestisce quindi lo spazio per le clip e lo spazio dello schermo.


Funziona su GL_MODELVIEW bandiera per impostazione predefinita, ma questa è la seconda fase - lo spazio mondo. Significa che chiamare glVertex3f() crea un triangolo nello spazio oggetti?

si imposta vertici con glVertex3f() nello spazio oggetti sempre. (Questo è in realtà un modo molto vecchio e lento a farlo, ma che non è davvero il punto di questa domanda)

Quando si imposta GL_MODELVIEW, è solo cambiando la matrice del modello (che può essere manipolato con glLoadMatrix, glTranslate, glRotate , glScale, ecc.).


riga per riga, il vostro pezzo di codice sta facendo il seguente:

  1. Tutte le trasformazioni saranno ora interessando la matrice di proiezione.
  2. Cancellare la vecchia matrice di proiezione e sostituirla con la matrice identità.
  3. Utilizzare l'intero schermo come viewport.
  4. Imposta la matrice di proiezione su una prospettiva con un campo visivo verticale di 45 gradi con un rapporto aspetto di w/h, il piano vicino alla clip a 1 unità di distanza e il piano di clip lontano a 100 unità di distanza.
  5. Tutte le trasformazioni stanno interessando di nuovo la matrice modelview.

L'asse Z esiste già, questo imposta solo la matrice di proiezione che fornisce la prospettiva, indica a OpenGL di utilizzare l'intera finestra per il rendering. Questo non è lo spazio dell'oggetto, è il modo in cui trasformi lo spazio dell'oggetto nello spazio di proiezione.


Anche una nota a margine, si sta utilizzando molto, molto vecchio OpenGL (1992 anni). glTranslate, ecc. sono stati ritirati molto tempo fa e ora vengono semplicemente rimossi dall'API. L'unica ragione per cui puoi ancora usarli è perché i driver li tengono lì per motivi di compatibilità. Ti consiglierei di usare l'OpenGL moderno (3.0+). Le moderne pipeline grafiche sono di diversi ordini di grandezza più veloci rispetto alla modalità immediata (glBegin, glVertex, glEnd).

Problemi correlati