OpenGL: cómo mover la escena en respuesta a la entrada del mouse usando gluLookAt

Estoy usando OpenGL en Qt a través del QGLWidget, y estoy tratando de implementar alguna interacción básica impulsada por el mouse y el teclado.

Entonces, por ejemplo, las teclas de flecha del teclado se usarán para "panear" la escena, la rueda del mouse para acercar la escena y el mouse se debe usar para rotar el modelo.

Descubrí cómo implementar la panorámica y el zoom, pero tengo problemas para implementar la rotación.

Esto es lo que tengo hasta ahora:

void MyGLWidget::paintGL() {
    glLoadIdentity();
    gluLookAt(0+camDelta[0],0+camDelta[1],-100+camDelta[2],centerCoords[0]+lookAtDelta[0],centerCoords[1]+lookAtDelta[1],centerCoords[2]+lookAtDelta[2],0,1,0);
    // draw stuff here
}

Así que básicamente configuré la inicial gluLookAt parámetros, y luego agregué dos matrices, float camDelta[3] y float lookAtDelta[3], para realizar un seguimiento del cambio en la posición de la cámara y hacia dónde mira en respuesta a la interacción del usuario con la escena.

Para la rueda del mouse, hago:

void MyGLWidget::wheelEvent(QWheelEvent *event) {
    camDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    lookAtDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    updateGL();
}

Del mismo modo en MyGLWidget::keyPressEvent, modifico los deltas' [0] campo para panoramizar a la izquierda y a la derecha, y los deltas [1] para desplazarse hacia arriba y hacia abajo.

Entonces mi pregunta es, ¿cómo implemento algo similar para admitir la rotación con el mouse? Estoy un poco confundido, porque supongo que tendré que cambiar de alguna manera no solo hacia dónde mira la cámara sino también el vector hacia arriba, pero realmente no tengo una idea clara de cómo hacerlo.

preguntado el 12 de junio de 12 a las 22:06

Hola, Houbysoft, también estoy buscando la funcionalidad de desplazamiento panorámico en Android. [Necesito mover GLSurfaceview usando un evento táctil]. Si tiene alguna idea ahora, por favor proporcione un código de muestra. sería útil para mí completar mi trabajo... mi código de muestra aquí.mediafire.com/?09f9q51xnqhq2l7.which -

2 Respuestas

Lo que he hecho para cosas como esta se llama el modelo de cámara orbital.

Realiza un seguimiento de la posición del objetivo de la cámara (o mira) y otros 3 parámetros: acimut, declinación (o inclinación) y distancia (o radio). El acimut es la rotación de la cámara alrededor del objetivo horizontalmente (como si el objetivo estuviera en el suelo y estuvieras caminando alrededor de él en círculos mientras lo miras). La declinación es la rotación vertical. La distancia es, bueno, la distancia entre el objetivo y la cámara.

Estas también se llaman coordenadas esféricas:

http://mathworld.wolfram.com/SphericalCoordinates.html

Quieres las ecuaciones como esta:

x = r * sin(phi) * cos(theta)
y = r * sin(phi) * sin(theta)
z = r * cos(phi)

Donde r es la distancia, theta es el acimut y phi es la declinación. Esto le da el desplazamiento para pasar de la posición de observación de la cámara a la posición de la cámara.

Así que esto es lo que haces. Mantenga la posición del objetivo de la cámara, pero no la posición de la cámara. Cuando mueva la cámara, mueva la posición de destino. Cuando gire la cámara, ajuste el acimut y la declinación. Cuando hagas zoom con la cámara, ajusta la distancia. Luego, cada cuadro antes de llamar a gluLookAt, calcule la posición de la cámara usando la fórmula anterior. Simplemente agregue esa x, y y z a la posición de destino.

Respondido el 15 de junio de 12 a las 22:06

Hola ALan, también estoy buscando la funcionalidad de desplazamiento panorámico en Android. [Necesito mover GLSurfaceview usando un evento táctil]. Si tiene alguna idea ahora, por favor dé un código de muestra. sería útil para mí completar mi tarea. Estoy luchando aquí. mi código de muestra aquí.mediafire.com/?09f9q51xnqhq2l7.which - harikrishnan

El mejor enfoque para esto es usar Quaternions. Así como los números complejos son bastante útiles para rotar en 2D, los cuaterniones son perfectos para la rotación en 3D.

El estándar 'rotar alrededor del eje x, y, z' puede funcionar, se comportará de manera extraña y no como se esperaba.

Puedes obtener un buen tutorial sobre todo esto en: http://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation

Respondido el 15 de junio de 12 a las 22:06

Hola lvan, también estoy buscando la funcionalidad de desplazamiento panorámico en Android. [Necesito mover GLSurfaceview usando el evento táctil]. Si tiene alguna idea ahora, por favor dé un código de muestra. sería útil para mí completar mi tarea. Estoy luchando aquí. mi código de muestra aquí.mediafire.com/?09f9q51xnqhq2l7.which - harikrishnan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.