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.
Muchas gracias. Funciona perfectamente ahora. Puedo pasar ahora a cosas más avanzadas. ¿Pero estás diciendo que gluLookAt es lento? –
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. –
+1 si realmente inclinó su cabeza :-) –