• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
OpenGL Projection Matrix
#1
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 ?
 
Rispondi
#2
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.
 
Rispondi
#3
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
 
Rispondi
  


Discussioni simili
Discussione Autore Risposte Letto Ultimo messaggio
  Guida OpenGL per C++ Riddick 4 2,906 20-04-2012, 08:21 PM
Ultimo messaggio: ferrass
  Configurare le OpenGL in Visual C++ Express 2010/2008 Riddick 0 1,370 12-10-2010, 11:20 PM
Ultimo messaggio: Riddick

Vai al forum:


Browsing: 1 Ospite(i)