Tarea 1. Transformaciones en 2D: Cuadricóptero

(Corrección)

Oliver Fernando Cuate González

ocuate@computacion.cs.cinvestav.mx

22 de Octubre de 2013

Problema

Realizar el cuadricóptero mostrado en la figura:

Cuadricóptero

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

  1. Con las flechas del teclado debe transladarse todo el cuadricóptero sobre la ventana de OpenGL. No debe salirse el cuadricóptero de la ventana.
  2. Presionando la tecla "r" el cuadricóptero rota.
  3. Presionando la tecla ESC, si las hélices no rotan, se ponen a rotar; si las hélices rotan, entones dejan de rotar. Chequen el sentido correcto de giro.

Análisis

Para resolver este problema se necesita el uso de las trasnformaciones báscias en 2D. Las transformaciones que se utilizarán son:

Para realizar las transformaciones de manera adecuada, en especial las rotaciones, es recomendable dibujar nuestro objeto en el origen. Por lo tanto, para poder hacer esta translación, lo primero que se debe de definir es en dónde se encontrará el punto de referencia de cada objeto con respecto al origen, es decir, que posición tendran incialmente los objetos. De manera natural el punto de referencia del cuadricóptero debería encontarse en el centro de masa del mismo, que se ubica en el centro del cuadrado, por otra parte las hélices también deberían de tener su centro en este punto antes de ser puestas en la posición deseada. Esta será la convención que se utlizará para este trabajo.

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. Antes de continuar es importante notar que cada hélice del cuadricóptero, así como su base cuadrada, tendrán un comportamiento distinto antes de conformar el cuadricóptero, es por eso que debemos realizar transformaciones diferentes para cada elemento.

Sin embargo como conjunto, lo que se desea es llevar el cuaricóptero de una posición base en el origen, a nueva una posición (a,b). En esta nueva posición se tendrá además la base cuadrada rotada un ángulo θ y las aspas rotadas un ángulo α según la dirección y "velocidad de giro". Esta es la idea central, los detalles relativos a la implementación se detallarán más adelante.

Veamos las tranformaciones por cada elemento considerando su posición inicial en el origen:

Una vez 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 tener un control de la posición del cuadricóptero según lo que haga el usuario, debemos definir las variables de posición: px, py.

Las flechas de navegación modifican los valores de (px,py) según correspona y se actualiza.

Para que el objeto no se salga de la pantalla hay que calcular los límites del sistema coordenado en OpenGL según las ecuaciones vistas en clase. Se define un tamaño máximo del centro del cuadricóptero a la punta de alguna de sus aspas y se restringe a que la posición (px,py) no se acerque a más de esta distancia a cualquiera de los límites del sistema. Se define de esta forma porque el cuadrícoptero podría ser llevado en su posición original a un punto límite, y si se rota estando ahí una parte de terminaría por salir de la pantalla, al restringir de esta forma se evita esa posibilidad.

Para controlar el giro automático de las aspas se utiliza un timer y una variable que indica si las aspas giran 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. La variable de control de giro para las aspas se controla con la tecla ESC. La base del cuadricóptero tiene también un grio automático controlado con la tecla "g".

Si se presiona la tecla "r" se aumenta el ángulo de la base y se actualiza una sola vez.

Como se mencionó anteriormente se tienen cinco elementos distintos: cuatro aspas y una base cuadrada, que en su momento se conjuntan para formar el cuadricóptero y hacer transformaciones sobre este objeto. Cada que se hace una transformación en el cuadricóptero, se debe usar una matriz identidad para cada elemento, por lo que se tienen cinco push() con sus respectivos cinco pop() para cada transformacion del cuadricóptero. Un esquema de como se realiza esto se mustra a continuación:

  1. Inicializar ventana.
  2. Arrancar el timer para el control de las variables que definen el estado del cuadricóptero.
  3. Dibujar objeto de la siguiente manera:

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

vista1 vista2

Descargar Archivo