2011-08-29 12 views
5

En primer lugar, quiero pedir disculpas por una pregunta tan larga. No tienes que leerlo Puede ir directamente a la parte preguntas y luego buscar detalles si es necesario (he tratado de proporcionar tanta información como sea posible, porque en mi experiencia es demasiado mejor el código que muy poco). Entonces, ...Confundido sobre el triángulo de devanado y las transformaciones

Estoy un poco confundido acerca del triángulo y las transformaciones, que creí entender. Estoy tratando de dibujar un cubo que se define de la siguiente manera:

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, 
    }; 

y estos son los supuestos colores de mis caras:

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 
}; 

Como se puede ver en los comentarios, utilizo términos arriba, abajo, izquierda, derecha, etc. Estas palabras tienen su significado si suponemos que estamos mirando el cubo desde la posición, por ejemplo, (0, 0, -3a) en coordenadas mundiales. Ahora, según tengo entendido, las caras frontales de mi cubo están enrolladas en sentido contrario a las agujas del reloj (es decir, si miramos el cubo desde cualquier posición fuera de él y enumeramos los vértices en los triángulos que vemos, obtendremos un giro en sentido antihorario) .

Entonces, necesito 1. Permitir el descarte. 2. Diga que en el sentido contrario a las agujas del reloj está la cara frontal 3. Recupere la cara trasera. Este es el código para que:

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

Mi matriz de proyección es una matriz de proyección en perspectiva, y la matriz modelview es sólo una matriz LookAt. Son alimentados como uniformes del sombreador de vértices.

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)); 

Mi shader de vértice se define como sigue:

#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; 
} 

Mi shader fragmento es trivial - sólo se emite el color interpolada.

Ahora ... aquí es la salida que me sale:

enter image description here

si cambio glFrontFace(GL_CCW); a glFrontFace(GL_CW);, o alternativamente, cambie a glCullFace(GL_BACK)glCullFace(GL_FRONT), tengo la esperaba (al menos más que el esperado anterior, ver quesions segunda y tercera) renderizado:

enter image description here

veo tres problemas aquí, ea ch se describe en una pregunta:

preguntas reales:

P1: ¿Por qué es el reverso de devanado de lo que pretendía? ¿No he enrollado los vértices en sentido antihorario para las caras frontales?
Q2 ¿Por qué mi cara "izquierda" y mi cara "derecha" cambiaron de lugar? Se suponía que la cara izquierda era amarilla y la derecha verde, no viceversa. ¿Qué pasa con mi transformación?
Q3es algo malo con mi transformación porque la coordenada x de mi vector del ojo es positiva, lo que significa que realmente debería ver un poco del lado derecho, ¡no un poco del lado izquierdo!

He hecho estas preguntas juntas porque creo que están todas conectadas, y probablemente con algo muy básico que me falta. Muchas gracias por tomarse el tiempo para aclarar estas cosas.

Respuesta

9

OpenGL asume por defecto un sistema de coordenadas de mano derecha, es decir, el eje Z positivo apunta hacia FUERA de la pantalla. Las posiciones del vértice del cubo indican que estás asumiendo un sistema de coordenadas para zurdos. Sin embargo, si coloca esos valores en un RHS, entonces sus coordenadas LHS-antihorario se vuelven en el sentido de las agujas del reloj (1), las caras en lugares de intercambio de un eje (2) y las transformaciones oculares asumidas irán en dirección opuesta (3).

+1

Todavía estoy confundido. ¿No soy libre de definir mi sistema de coordenadas "mundo" como quiera? Y la función LookAt toma vectores en coordenadas mundiales, ¿no? Entonces, ¿qué diferencia hace la dirección predeterminada del eje Z? –

+1

Ahhh ... Creo que estoy empezando a conseguirlo ahora ... No puedo cambiar las *** disposiciones relativas *** de los tres ejes, incluso en el sistema de coordenadas del mundo. ¿Está bien? –

+3

@Armen Sí, eso es todo. Podría escalar su matriz de vista de modelo en (1,1, -1) y, por lo tanto, reflejar el eje z para asumir el sistema zurdo deseado, pero no lo sugeriría, ya que sería algo así como un truco en torno a la estándar de facto de un sistema diestro. –

Cuestiones relacionadas