2011-08-29 14 views
5

Prima di tutto, voglio scusarmi per una domanda così lunga. Non devi leggerlo. Puoi saltare direttamente alla domanda e poi cercare i dettagli se necessario (ho cercato di fornire quante più informazioni possibili, perché nella mia esperienza un numero eccessivo di codice è meglio che troppo poco). Quindi, ...Confuso su avvolgimento triangolo e trasformazioni

Sono un po 'confuso riguardo agli avvolgimenti e alle trasformazioni del triangolo, che pensavo di aver capito. Sto cercando di disegnare un cubo che è definito come segue:

const float a = 0.5f; //half of the cube side length 
    float positions[nComponents] = 
    { 
     //front face 
     -a, -a, -a, 
     a, -a, -a, 
     a, a, -a, 

     -a, -a, -a, 
     a, a, -a, 
     -a, a, -a, 

     //back face 
     -a, -a, a, 
     a, a, a, 
     a, -a, a, 

     -a, -a, a, 
     -a, a, a, 
     a, a, a, 

     //up face 
     -a, a, -a, 
     a, a, -a, 
     a, a, a, 

     -a, a, -a, 
     a, a, a, 
     -a, a, a, 

     //down face 
     -a, -a, -a, 
     a, -a, a, 
     a, -a, -a, 

     -a, -a, -a, 
     -a, -a, a, 
     a, -a, a, 

     //right face 
     a, -a, -a, 
     a, -a, a, 
     a, a, a, 

     a, -a, -a, 
     a, a, a, 
     a, a, -a, 

     //left face 
     -a, -a, -a, 
     -a, a, a, 
     -a, -a, a, 

     -a, -a, -a, 
     -a, a, -a, 
     -a, a, a, 
    }; 

e questi sono i presunti colori delle mie facce:

float face_colors[nFaces * dim] = 
{ 
    1,0,0, //front RED 
    1,1,1, //back WHITE 
    0,0,1, //up BLUE 
    0,1,1, //down SKY BLUE 
    0,1,0, //right GREEN 
    1,1,0, //left YELLOW 
}; 

Come si può vedere dai commenti, io uso termini up, giù, sinistra, destra, ecc. Queste parole ottengono il loro significato se supponiamo di guardare il cubo dalla posizione, diciamo, (0, 0, -3a) nelle coordinate del mondo. Ora, come comprendo, le facce anteriori del mio cubo sono avvolte in senso antiorario (cioè, se osserviamo il cubo da qualsiasi posizione al di fuori di esso, e enumeriamo i vertici nei triangoli che vediamo, avremo avvolgimento in senso antiorario) .

Quindi, ho bisogno di 1. Abilitare il culling. 2. Dì che in senso antiorario è la faccia anteriore. 3. Faccia indietro. Questo è il codice per questo:

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 
glFrontFace(GL_CCW); 
glCullFace(GL_BACK); 

mia matrice di proiezione è una matrice proiezione prospettica, e la matrice modelview è solo una matrice LookAt. Sono nutriti come uniformi per il vertex shader.

ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f); 
glm::vec3 center(0.0f, 0.0f, 0.0f); 
glm::vec3 eye(1.0f, 2.0f, -3.0f); 
glm::vec3 up(0.0f, 1.0f, 0.0f); 
ModelViewMatrix = glm::lookAt(eye, center, up); 
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix)); 
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix)); 

mio vertex shader è definito come segue:

#version 400 
layout(location = 0) in vec4 vVertex; 
layout(location = 1) in vec4 vColor; 
uniform mat4 P; 
uniform mat4 MV; 
out vec4 vFragColor; 
void main(void) 
{ 
    vFragColor = vColor; 
    gl_Position = P * MV * vVertex; 
} 

mio frammento Shader è banale - solo emette il colore interpolato.

Ora ... ecco l'output che ottengo:

enter image description here

se cambio glFrontFace(GL_CCW); a glFrontFace(GL_CW);, o, in alternativa, cambiare glCullFace(GL_BACK)-glCullFace(GL_FRONT), ho l'aspettavo (almeno più atteso rispetto alla quello precedente, vedi secondo e terzo quesions) di rendering:

enter image description here

vedo tre problemi qui, e bis ch descritto in una domanda:

QUESTIONI ATTUALI:

Q1: Perché è il contrario di avvolgimento di ciò che intendevo? Non ho ferito i vertici in senso antiorario per le facce anteriori?
Q2 Perché la mia faccia "sinistra" e la faccia "giusta" sono cambiate? La faccia sinistra doveva essere gialla e quella destra verde, non viceversa! Cosa c'è di sbagliato nella mia trasformazione?
Q3 Ci è qualcosa di sbagliato con la mia trasformazione, perché la coordinata x della mia vettore occhio è positiva, il che significa che in realtà dovrebbe vedere un po 'del lato destro, non un po' del lato sinistro!

Ho fatto queste domande insieme perché penso che siano tutte collegate, e probabilmente con qualcosa di molto semplice che mi manca. Grazie mille per aver dedicato del tempo a chiarire queste cose.

risposta

9

OpenGL per impostazione predefinita assume un sistema di coordinate a destra, ovvero l'asse Z positivo che punta OUT sullo schermo. Le posizioni dei vertici del cubo indicano che stai assumendo un sistema di coordinate mancino. Tuttavia, se si inseriscono questi valori in un RHS, le coordinate LHS in senso antiorario diventano in senso orario (1), le facce su un asse scambiano i punti (2) e le trasformazioni dell'occhio presunte andranno nella direzione opposta (3).

+1

Sono ancora confuso. Non sono libero di definire il mio sistema di coordinate "mondo", comunque mi piace? E la funzione LookAt prende i vettori nelle coordinate del mondo, no? Quindi che differenza fa la direzione dell'asse Z di default? –

+1

Ahhh ... Penso che sto iniziando a prenderlo ora ... Non posso cambiare le disposizioni relative *** dei tre assi anche nel sistema di coordinate del mondo. È giusto? –

+3

@Armen Sì, questo è tutto. Potresti scalare la tua matrice modelview di (1,1, -1) e quindi rispecchiare l'asse z per assumere il tuo sistema per mancini, ma non lo suggerirei, in quanto sarebbe qualcosa di simile ad un hack attorno al de- standard di fatto di un sistema di mano destra. –