Creare Videogiochi - Game Developer

Versione completa: OpenGL Projection Matrix
Al momento stai visualizzando i contenuti in una versione ridotta. Visualizza la versione completa e formattata.
Leggendo una guida di opengl sono arrivato ad una parte dove l'autore propone di ridimensionare la finestra senza compromettere il render della finestra, per fare ció crea una funzione dove inserisce varia roba tra cui
Codice:
glMatrixMode(GL_PROJECTION);

e cerca di dare una spiegazione di questa riga che sinceramente non ho capito, qualcuno saprebbe spiegarmi in cosa consiste il projection matrix ?
Premesso che non conosco OpenGL, quindi è possibile che ti stia per dire un sacco di vaccate. Vado più che altro a logica e a robe viste right now su internet, sta a te valutare se quello che ti sto per dire è plausibile o no. La probabilità che ci siano parecchie inesattezze è alta, ma almeno una risposta la ricevi...

Per rappresentare un modello 3D (vale anche per il 2D, ma in questo caso penso che in 3D sia concettualmente più semplice da capire) bisogna associare ad ogni vertice del modello un punto sulla viewport (*), ovvero bisogna proiettare i vertici da uno spazio 3D a un piano 2D. Questa proiezione viene fatta attraverso una matrice.
Quando ridimensioni la finestra quello che vuoi realmente fare è ridimensionare la viewport: puoi anche mettere in fullscreen, ma se non ridimensioni la viewport hai le bande nere da tutti i lati. Per visualizzare meglio il problema supponiamo che nel ridimensionare la finestra cambia anche aspect ratio, la tua finestra di gioco passa da quadrata a rettangolare. Nel momento in cui ridimensioni la viewport, se non modifichi la matrice di proiezione, ottieni il classico effetto che vedi con i film in 4:3 messi su una TV in 16:9 (oppure quando allarghi un'immagine su Word): le immagini si spalmano su una superficie con dimensioni completamente diverse e risultano deformate.
Per risolvere questo problema devi dire a OpenGL che la matrice di proiezione che ha usato fino ad ora non va più bene.

Purtroppo (almeno... a me non piace, magari qualcuno la vede come una cosa positiva) OpenGL si basa su una macchina a stati finiti, quindi per cambiare il valore a una matrice devi prima dire "OpenGL, prendimi questa matrice!" e poi dire "OpenGL, scrivi questi valori nella matrice!". È un po' pacco fare tutto così, però vabbè... quel modo c'è e quel modo devi usare.
glMatrixMode(GL_PROJECTION) dovrebbe essere l'equivalente di "OpenGL, prendimi la matrice di proiezione".

(*) La viewport è un piano (2D) che rappresenta la porzione di schermo che sarà dedicata a farti vedere il gioco a schermo.


Ti ripeto che non sono pratico di sta roba, sta a te verificare se ciò che ti ho detto è giusto. Le probabilità che ci sia qualcosa di sbagliato (tutto?) non sono poi così basse.
Mhh si ho letto dal red book la spiegazione e altre spiegazioni varie su internet e direi che è giusto, ora prende senso il tutorial ovvero:
Codice:
void reshape (int width, int height)
{
    glViewport(0,0,(GLsizei)width, (GLsizei)height); //setta il viewport a 0,0 e poi prende la grandezza che gli diamo noi
    glMatrixMode(GL_PROJECTION); //passiamo alla matrice di proiezione per modificare la grandezza del viewport
    glLoadIdentity(); //reset
    gluPerspective(60, (GLfloat)width /(GLfloat)height, 1.0, 100.0); //fov, aspect ratio (width/height), distanza minima e massima per il rendering
    glMatrixMode(GL_MODELVIEW); //torniamo alla model view matrix
}
Se prima mi trovo nella model view matrix e voglio modificarla devo prima passare alla projection matrix e poi tornare alla model view.
Grazie steve