Estoy experimentando con pyOpenGL y he tenido problemas para que la cámara funcione correctamente.

def Draw():

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
     glMatrixMode(GL_MODELVIEW)
     glLoadIdentity()

     glRotatef(roty,1,0,0)
     glRotatef(rotx,0,1,0)
     glTranslate(0,0,eyez)

     glPushMatrix()

     glTranslate(0,0,-80)

     glBegin(GL_QUADS)
     glColor(0,1,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(50,50,10)
     glVertex3f(50,-5,10)

     glColor(1,0,0)
     glVertex3f(-50,-5,10)
     glVertex3f(-50,50,10)
     glVertex3f(-50,50,70)
     glVertex3f(-50,-5,70)
     glEnd()

     glPopMatrix()

     glutSwapBuffers()

Estas rotaciones funcionan muy bien, pero no puedo avanzar en la dirección en la que mira la cámara. Cuando haya modificado el código para poder avanzar de esta manera, la escena no girará correctamente. Lo que sucederá es que la escena rotará en círculo si retrocedo lo suficiente.

0
FlowofSoul 16 jul. 2011 a las 23:36

3 respuestas

La mejor respuesta

Si está escribiendo una aplicación que tiene el concepto de la cámara moviéndose (y girando también, supongo), en lugar de operar en el objeto con glRotate y glTranslate considere buscar gluLookAt, que le permite configurar las cosas centradas en la cámara, por así decirlo.

Por cierto, gluLookAt está en desuso, aunque algunas personas han dicho que "lo extrañan mucho". Si desea mantenerse alejado de esta función de utilidad obsoleta, consulte la fuente de esta función y haga rodar su matriz propia en la CPU.

5
Ray Toal 19 jul. 2012 a las 21:13

Aunque estoy más acostumbrado a programar en JOGL que cualquier otro enlace de OpenGL, le sugiero el siguiente punto de control:

*) ¿Ha configurado, en la función correcta (para mí, es la remodelación de JOGL GLEventListener (método int x, int y, int width, int height)), la ventana gráfica y el tronco?

=> Para la ventana gráfica (el área del marco utilizada para el dibujo OpenGL), normalmente solo se llama glViewport (x, y, ancho, alto) => asignando toda su zona de Canvas para sus dibujos GL

=> Para el frustum (el campo de visión de la cámara), primero debe cambiar a la matriz de proyección (glMatrixMode (GL_PROJECTION)), luego configurar su frustum, luego volver a la matriz GL_MODELVIEW para estar preparado para sus dibujos. Le sugiero que, para definir el tronco, llame a gluPerspective (45, (float) width / height, 0.001f, 1000f). 45 para 45 grados de medio ángulo, ancho / alto para dar la relación de pantalla, 0.001f para dar un plano de truncamiento cercano a 0.001f de su ojo (o la pantalla), 1000f para dar un plano de truncamiento de 1000f lejos de su ojo.

*) ¿Has pensado en usar, en tu función de dibujo, una llamada a gluLookAt, como sugieres Ray Toal? Le sugiero que llame a gluLookAt (

0,0,1, // La cámara se establece en (0,0,1), para que vea el punto 0,0,0

0,0,0, // la cámara apunta a (0,0,0)

0,1,0) // la cámara tiene (0,1,0) para su vector ascendente (entonces, Oy es el vector ascendente ... lógica)

Espero que esto le pueda ayudar

0
loloof64 17 jul. 2011 a las 13:08

Para avanzar, primero debe determinar dónde se encuentra hacia adelante . Debe obtener un vector 3D que apunte en la dirección de la cámara. Una forma de hacerlo es multiplicar el vector (0, 0, -1) por el inverso de la porción de rotación de la matriz de la cámara. En general, hay formas más fáciles de hacerlo, pero todas dependen de cómo esté calculando la matriz de su cámara.

Una vez que tiene un vector unitario apuntando en la dirección de la cámara, es fácil. Simplemente multiplique esto por qué tan lejos en esa dirección desea moverse y agréguelo a la posición actual de la cámara.

Tenga en cuenta que si usa gluLookAt, también necesitará compensar el punto de observación al mismo tiempo. De lo contrario, su cámara se moverá, pero intentará enfrentar un punto inmóvil en el espacio mundial.

2
Nicol Bolas 16 jul. 2011 a las 19:50