2010-07-31 23 views
14

No quiero entrar en la trigonometría compleja para calcular rotaciones y cosas así para mi mundo tridimensional, por lo que gluLookAt parece una buena alternativa. De acuerdo con la documentación, todo lo que tengo que hacer es colocar 3 coordenadas para la posición de las cámaras, tres para lo que debería estar mirando y una posición "arriba". Lo último no tenía sentido hasta que supuse que tenía que estar en ángulo recto con la línea de visión en la dirección en que debería estar la parte superior de la pantalla.¿Cómo uso gluLookAt correctamente?

No funciona así en absoluto. Tengo un código de Python. Este es el código que inicializa algunos datos y un código para el modo cuando entro en esta parte del juego:

def init(self): 
    self.game_over = False 
    self.z = -30 
    self.x = 0 
def transfer(self): 
    #Make OpenGL use 3D 
    game.engage_3d(45,0.1,100) 
    gluLookAt(0,0,-30,0,0,0,0,1,0) 

"game.engage_3d (45,0.1,100)" básicamente establece la matriz de proyección para tener una Ángulo de visión de 45 grados y coordenadas cercanas y lejanas de 0.1 y 100.

El primer gluLookAt coloca la cámara en la posición correcta, muy bien.

Tengo un cubo dibujado con el centro de (0,0,0) y funciona bien sin gluLookAt. Antes de llegar a lo que tengo este código:

gluLookAt(self.x,0,self.z,0,0,0,0,1,0) 
if game.key(KEY_UP): 
    self.z += 2.0/game.get_fps() 
if game.key(KEY_DOWN): 
    self.z -= 2.0/game.get_fps() 
if game.key(KEY_LEFT): 
    self.x += 2.0/game.get_fps() 
if game.key(KEY_RIGHT): 
    self.x -= 2.0/game.get_fps() 

Ahora de eso, la posición superior debe ser siempre la misma, ya que es siempre en ángulo recto. Lo que habría pensado que haría es mover hacia adelante y hacia atrás el eje z con las teclas hacia arriba y hacia abajo y hacia la izquierda y la derecha a través del eje x con las teclas izquierda y derecha. Lo que realmente sucede es que cuando uso las teclas izquierda y derecha, el cubo girará alrededor del "ojo" acelerado por las teclas. La tecla hacia arriba hace que otro cubo de la nada recorta la pantalla y golpee el primer cubo. La tecla Abajo trae de vuelta el misterioso cubo clonado. Esto se puede combinar con la rotación para dar un resultado completamente diferente ya que la documentación dijo que surgiría.

¿Qué demonios está mal?

Gracias.

Respuesta

37

(La intuición detrás del vector "arriba" en gluLookAt es simple: Mire cualquier cosa. Ahora incline la cabeza 90 grados. Donde usted no ha cambiado, la dirección que está mirando no ha cambiado, pero la imagen en su retina claramente tiene. ¿Cuál es la diferencia? Donde está apuntando la parte superior de su cabeza. Ese es el vector ascendente.)

Pero para responder a su pregunta: las llamadas gluLookAt no deben concatenarse. En otras palabras, el único patrón en el que está bien usar gluLookAt si no sabe exactamente cómo funciona es la siguiente:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# do not touch the modelview matrix anymore! 

Parece a partir del código que se está haciendo algo como esto:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...); 
# some stuff.. 
gluLookAt(...); 

Esto generará resultados extraños, porque gluLookAt multiplica la matriz actual por la matriz de visualización que calcula. Si quieres concatenar transformaciones, es mejor que averigües cómo hacer para que glTranslate, glScale y glRotatef trabajen para ti. Mejor aún, debes aprender cómo funcionan las transformaciones de coordenadas y aferrarte a glMultMatrix.

+0

Muchas gracias. Funciona perfectamente ahora. Puedo pasar ahora a cosas más avanzadas. ¿Pero estás diciendo que gluLookAt es lento? –

+2

No es que sea lento. Es que gluLookAt oculta algunas cosas que debes saber cuando estás haciendo una programación OpenGL seria. En particular, debe aprender a combinar diferentes transformaciones de coordenadas.Esto requiere acostumbrarse, y es un tanto frustrante al principio, pero al final vale la pena: muchas técnicas de gráficos se construyen de manera inteligente sobre la transformación de sistemas de coordenadas. –

+36

+1 si realmente inclinó su cabeza :-) –

Cuestiones relacionadas