2010-08-07 21 views
12

Estoy tratando de entender el sistema de coordenadas OpenGL. En todas partes veo que se describe como diestro, pero no se corresponde con mi experiencia. Traté de dibujar algunas formas y objetos tridimensionales y veo que aparentemente el eje z apunta "a la pantalla" (mientras que x apunta hacia la derecha, y arriba, que es la descripción del sistema de coordenadas para zurdos). ¿Qué me estoy perdiendo?Donde puntos OpenGL z-axis?

edición: Por ejemplo:
http://img576.imageshack.us/img576/9234/triangles.jpg
Si + Z puntos espectador, ¿por qué triángulo verde, que coordenada z es mayor, está detrás de rojo?

initializeGL:

qglClearColor(Qt::darkGray); 
glClearDepth(1.0); 
glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL);  
glEnable(GL_COLOR); 

resizeGL:

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-50.0f, 50.0f, -50.0f, 50.0f, 50.0, -50.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

paintGL:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glRotatef (-30.0, 1.0, 0.0, 0.0); 
glRotatef (20.0, 0.0, 1.0, 0.0); 
glColor3f(1.0, 0.0, 0.0); 
glBegin(GL_LINES); 
glVertex3f(45.0, 0.0, 0.0); 
glVertex3f(-45.0, 0.0, 0.0); 
glVertex3f(0.0, 45.0, 0.0); 
glVertex3f(0.0, -45.0, 0.0); 
glVertex3f(0.0, 0.0, 45.0); 
glVertex3f(0.0, 0.0, -45.0); 
glEnd(); 
glBegin(GL_TRIANGLES); 
//Red triangle: 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.0, 0.0, 1.0); 
glVertex3f(0.0, 20.0, 1.0); 
glVertex3f(20.0, 0.0, 1.0); 
//Green triangle:  
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-15.0, 0.0, 20.0); 
glVertex3f(0.0, 25.0, 20.0); 
glVertex3f(15.0, 0.0, 20.0); 
glEnd(); 
+0

"If + Z points viewer, ¿por qué el triángulo verde, cuya coordenada z es más grande, está detrás del rojo?" Has rotado toda la escena dos veces. Llame a glLoadIdentity para la matriz de vista modelo antes de renderizar triángulos, luego compare los resultados. – SigTerm

Respuesta

5

Últimos 2 parámetros glOrtho de referencia:

nearVal, Farval
Especificar las distancias a la más y aviones profundidad de recorte más lejos. Estos valores son negativos si el avión debe estar detrás del espectador.

Su plano de recorte más cercano está en frente del espectador y más lejos, detrás. Va a voltear el eje Z.

+3

Eso es esencialmente lo que dije 12 horas antes de esta respuesta. – JustBoo

+0

Sí, el eje z fue accidentalmente volteado pero luego tuve un problema para localizar la línea exacta de código responsable de eso – majaen

8

bien, lo que se destaca para mí es la función glOrtho. Usted tiene los planos de recorte cercanos y lejanos a solo 100 unidades de distancia. Eso parece muy pequeño. ¿Realmente lo quieres de esa manera? Está representado por los 2 últimos parámetros en esa función.

También sus objetos son muy grandes en relación con este pequeño tronco. Los objetos podrían estar sentados directamente en frente de su cámara y bloquearían la visibilidad de otros objetos.

Ampliaría todos los parámetros en la llamada glOrtho. HTH


En un sistema para diestros (OpenGL), Z negativo (-Z) debe apuntar a la pantalla. La Y positiva debe estar "arriba" y la X positiva debe estar a la derecha.

Esto parece ser lo que usted describió, y que es un sistema de coordenadas para diestros.

Quizás esto puede ayudar. http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

+0

Por eje z "en la pantalla" quise decir Z positiva (la coordenada Z del punto más grande es, cuanto más lejos esté). No uso glScale con valores negativos o algo así, así que es un poco misterioso para mí. – majaen

+0

@majaen: Tal vez configures la matriz modelview de forma diferente. Cuanto mayor es la z, más cerca están los objetos para ti. – SigTerm

+1

¿Estás seguro de que, en alguna parte del código, uno de los ejes no está siendo "volteado"? Recuerdo (vagamente) una vez que volteé ciertos ejes e incluso hice un origen en la parte superior izquierda para acomodar un sistema en Windows. Parece que algo en el código en alguna parte está causando rareza. – JustBoo

1

Depende de cómo dibuje.

una Identidad para la vista de modelo y un gluPerspective regular para proyección esperarán un sistema de coordenadas de entrada que sea diestro (como se menciona en JustBoo, ​​-z está en la pantalla).

si carga un conjunto diferente de matrices, sin embargo, nada le impide voltear una de las coordenadas en la matriz, lo que resulta en un sistema para zurdos. (o no voltear. gluPerspective/glFrustum realmente voltea las coordenadas z). Hay algunas cosas prácticas a tener en cuenta al hacer esto, como la orden de devanado para descartar.

5

¿Qué me falta?

En (la ventana del) sistema zurdo x puntos derecho, y puntos arriba, z puntos forward (lejos del espectador).

En diestro x puntos derecha, y puntos arriba, z puntos hacia atrás (hacia el espectador).

Picture

La imagen se toma desde wikipedia.

x es el dedo pulgar, y es el dedo índice y z es el dedo medio.

+0

gracias por el enlace, es mucho más simple de explicar con esta imagen :) – Calvin1602