2012-10-24 8 views
7

domanda iniziale

voglio usare 'gluPerspective', 'glViewport' e 'gluLookAt' di manipolare la mia macchina fotografica e schermo.gluPerspective, glViewport, gluLookAt e il GL_PROJECTION e GL_MODELVIEW da matrici

Quali funzioni applicare a quale modalità matrix? E in che ordine dovrei/devo usarli?

Per esempio, io sto cercando di impostare il mio schermo e la fotocamera in questo modo: (Ma non funziona!)

glMatrixMode(GL_PROJECTION) // Apply following to projection matrix - is this correct? 
glLoadIdentity(); // Reset first 
glPerspective(45.0, (double)w/(double)h, 1.0, 200.0); // Set perspective 
glViewport(0, 0, w, h); // Set viewport 

glMatrixMode(GL_MODELVIEW); // Apply following to modelview - should glViewport come under here? 
glLoadIdentity(); // Reset first 
gluLookAt(px, py, pz, cx, cy, cz, ux, uy, uz); // Set position, centre and then up vectors 
// This surely comes after calling GL_MODELVIEW? 

Ho guardato in giro per la documentazione on-line, e capisco le funzioni, basta non dove dovrebbero andare e in che ordine!

Qualche tempo dopo ...

Si tratta di alcuni mesi dopo ora e sto aggiungendo una modifica rapida per mostrare il sistema che uso per rendere le cose con OpenGL. Questo per aiutare gli altri che vedono questa domanda in futuro.

Principalmente uso due metodi.

Metodo 1:

Questo gruppi metodo tutto insieme.

// Firstly, the window may have been resized so re-create the viewing area 
glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area); 

Questo ricrea il viewport per il rendering su tutta l'area all'interno della finestra. Con SFML, si potrebbe fare qualcosa di simile window.width() o window.height(), o qualcosa di simile a seconda di quale toolkit a finestre si utilizza (sovrabbondanza, glfw, sdl ecc) ...

// The second step is to add a projection matrix. There are three main ones I like to use 
// Uncomment the one you want 
glMatrixMode(GL_PROJECTION); // Tell OpenGL to manipulate the correct matrix stack 
glLoadIdentity(); // Reset the projection matrix, or bad things happen after multiple calls to below functions! 
// glOrtho(...) // Uncomment to use 2D rendering 
// gluPerspective(...) // Uncomment to use (easy) 3D rendering 
glFrustrum(...) // Uncomment to use (harder/less intuitive?) 3D rendering 
glMatrixMode(GL_MODELVIEW); // I always prefer to leave OpenGL in the modelview manipulation mode. 
    // I consider it the "default" and safest mode to leave OpenGL in, as any rogue 
    // calls to functions changing its contents is likely to mess up your geometry 
    // which should be visible as a problem on the screen, which tells you you need 
    // to fix something! Manipulating the other matrix stacks may not show obvious 
    // problems. 

Avrete è necessario selezionare uno dei tre di 'glOrtho', 'gluPerspective' e 'glFrustrum'. C'è anche "gluOrtho2D", ma usalo con cura! (Preferisco specificare me stesso vicino e lontano con 'glOrtho'.) È necessario sostituire il '...' con i tuoi argomenti anche alla funzione.

// The third step is to clear the screen and set your camera/geometry position 
glClear(GL_COLOR_BUFFER_BIT); // use bitwise OR ('||') with 'GL_DEPTH_BUFFER_BIT' and 'GL_STENCIL_BUFFER_BIT' if required 
gluLookAt(...); 
// I like to use gluLookAt, or at least I _italic_used to! Now I implement my own camera... 
// That is another fun thing you should try if you are comfortable with 3D geometry and hard math! 

// The fourth step is to draw your scene. You may want to put lighting stuff first or in with the drawing 
glutWireTeapot(...); 

Metodo 2:

Il secondo metodo è lo stesso come sopra, ma per spostare il primo passo in una funzione separata. Quindi è necessario rilevare gli eventi di ridimensionamento della finestra e chiamare questa funzione. Con l'eccesso, è possibile specificare un callback. Con SFML puoi rilevare un evento quando la finestra viene ridimensionata. Ho dimenticato come funziona SDL, ma è simile. Non ho ancora imparato come funziona glfw.

Speriamo che questo ti possa aiutare.

Alcuni principianti di OpenGL (probabilmente me stesso incluso in una volta) provano a specificare le traduzioni della telecamera sulla matrice PROJECTION. Non farlo - A capo mi scombussolano l'illuminazione e forse altre cose.

+0

Quello che hai lì sembra appropriato per me. Forse il tuo errore è altrove. – Tim

+0

Assicurati che la scena si trovi tra i piani vicini e lontani specificati in glPerspective. – Max

+0

Se hai capito le funzioni, capiresti dove vanno. Ad esempio, sembra che tu ritenga che 'glViewport' crei una matrice. Non è così. –

risposta

3

ho definire la mia funzione di callback Reshape come:

chiamata glViewport(...) una volta all'inizio.

Poi ricaricare la matrice di proiezione con una matrice di identità:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

Poi:

glPerspective(...) 
glMatrixMode(GL_MODELVIEW); 

gluLookAt(...) possono essere chiamati in qualsiasi momento in seguito, se è necessario modificare la vostra posizione della telecamera.

Funziona per i miei scopi semplici.

+0

Grazie, questa è la risposta che stavo cercando. Se chiamo gluLookAt due volte, sposterà di nuovo la fotocamera? Allo stesso modo, chiamando glRotatef due volte Ruoterai la camera/scena due volte, faranno lo stesso gluLook? – user3728501

+0

Siamo spiacenti, un'altra domanda: glViewPort modifica una matrice? Devo chiamare glMatrixMode (GL_PROJECTION) prima di qualsiasi chiamata a glViewPort? – user3728501

+0

Sì, ruoterà l'intera scena due volte. Ma se lo inserisci nella funzione di richiamata del display, ricorda che la funzione di visualizzazione viene richiamata ripetutamente, devi caricare la matrice di visualizzazione del modello con una matrice di identità all'inizio della funzione di richiamata del display. – Max

Problemi correlati