Tarea 2. Transformaciones en 3D: Cuadricóptero 3D

Oliver Fernando Cuate González

ocuate@computacion.cs.cinvestav.mx

15 de Octubre de 2013

Problema

Realizar la escena mostrada en la siguiente figura::

Escena

La aplicación en Qt y OpenGl debe realizar lo siguiente:

  1. El cuadricóptero debe estar subiendo y bajando.
  2. Las flechas del teclado controlan la inclinación del cuadricóptero.
  3. Con la tecla 'escape' las aspas rotan y dejan de rotar, como en la tarea anterior.
  4. Debe ponerse algunos widgets para situar al visor, a donde mira y el vector de arriba. Todo esto para visualizar la escena desde cualquier punto.

Análisis

Para resolver este problema se necesita el uso de las trasnformaciones báscias en 3D, así como el manejo de perspectivas en OpenGL. Las transformaciones que se utilizarán son:

En la siguiente figura se muestra el uso de gluLookAt.

gluLookAt

Para realizar las transformaciones de manera adecuada, en especial las rotaciones, es recomendable que los objetos sean dibujados originalmente con su punto de referencia ubicado en el origen de nuestro sistema coordenado y apartir de esta posición realizar las traslaciones, de no ser así se necesitaría primero transladar el objeto a una posición adecuada para rotarlo. El dibujo del cuadricóptero en 3D y del mundo virtual requiere el uso de varias figuras: cubos, cilindros y las aspas; la definición inicial de cada figura y las transformaciones a las que serán sometidas, se detallan más delante. Una vez que tenemos definida la posición que tendrá nuestro objeto en el orgien, se debe decidir cuáles transformaciones y en qué orden deben de realizarse para obtener los resultados deseados. Para tener una referencia clara de lo que se desea se muestra en la siguiente figura la posición de los ejes coordenados en openGL.

coordenadas

Lo que se desea es llevar al cuadricóptero, que inicialmente tendrá su centro en (0, 0, 0) y no estará inclinado, a una determinada posición (0, y, 0) con cierta inclinación, además para dar la impresión de que las aspas rotan es necesario que se tenga un ángulo de rotación para ellas. Para esto definiremos las siguientes variables:

Se describen a continuación las transformaciones y definición incial de cada elemento del cuadricóptero utilizadas para la resolución del problema:

Ahora que se sabe que hacer se muestra acontinuación los detalles de la implementación en Qt y OpenGL.

Alternativa de Solución en Qt y OpenGL

Para implementar el diseño discutido anteriormente con Qt y OpenGL, necesitamos definir los eventos del teclado y los widgets necesarios para obtener la funcionalidad deseada.

La flechas del teclado Arriba y Abajo, aumentarán y disminuirán la variable θz respectivamente y actualizarán el dibujo cada que se presionen. Lo anterior es para controlar inclinación del cuadricóptero, se se limitará a 50° en cada dirección. De manera análoga las flechas Arriba y Abajo tendrán un control sobre la variable θx.

La tecla "r" controlará la rotación del cuadricóptero sobre el eje y a través de la variable θy, no se tiene una restricción de giro para este ángulo.

Para activar las aspas mediante la tecla ESC, definimos un timer y una variable de control booleana que nos indicará si las aspas deben girar o no. El timer siempre esta activo y cada que se actualiza, verifica la variable de control de giro, en caso que deba girar aumenta el ángulo de giro de las aspas y si no no hace nada. Dentro del timer también se incluyen algunos comandos que establizan el cuadricóptero, es decir lo regresan poco a poco a su posición original sin inclinación en los ejes x y z, para que se de el efecto tanto de estabilización como de inclinación al momento de presionar las teclas, el valor da aumento o decremento en los ángulos θx y θz es menor en el timer que cuando se oprime una tecla. Además dentro del timer se definirá el control sobre la variable py, esta variable aumentará su valor hasta alcanzar cierta altura y posteriormente disminuirá hasta llegar a cero, en dónde volverá a aumentar de nuevo, esto producirá el efecto de que el cuadricóptero sube y baja.

Por último, para el control de la cámara de incluyen widgets de tipo QTextEdit para editar los valores (xeye, yeye, zeye), (xcen, ycen, zcen) y (xup, yup, zup) definidos con anterioridad, se restinge el valor de estas variables a un intervalo de -25 a 25, que es el valor establecido para cada eje en nuestro sistema coordenado. El mundo está dibujado en un cubo que se dfeine por los puntos (-20, -20, -20) y (20, 20, 20) para que los cambios en la vista se vean adeuadamente.

Las transformaciones se controlan con glPushMartix() y glPopmatrix, con esto y lo anterior un esquema de solución es el siguiente:

  1. Inicializar ventana con los widgets adecuados para el control de la cámara.
  2. Definir perspectiva.
  3. Arrancar el timer para el control de las variables que definen el estado del cuadricóptero.
  4. Dibujar objeto de la siguiente manera:

Estos son los detalles a grandes rasgos de la implementación. Por último se agregan un par de imágenes con diferente perspectiva y el link de descarga del código fuente del programa:

vista1 vista2

Descargar Archivo