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:
- Tutte le trasformazioni saranno ora interessando la matrice di proiezione.
- Cancellare la vecchia matrice di proiezione e sostituirla con la matrice identità.
- Utilizzare l'intero schermo come viewport.
- 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.
- 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).
Spero che non si "digitino" realmente le geometrie dell'oggetto (eccetto quelle molto semplici). Dovresti caricarli da un file. – datenwolf