Tarea 1. Transformaciones en 2D: Cuadricóptero

Oliver Fernando Cuate González

ocuate@computacion.cs.cinvestav.mx

25 de Septiembre 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 transladar nuestro objeto al 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 nuestro objeto con respecto al origen, es decir, que posición tendra nuestro objeto cuando lo coloquemos en el origen. 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. 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, por lo que debemos realizar transformaciones diferentes, aunque similares, para cada uno de estos elementos. Esto nos deja con cinco elementos diferentes.

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 elemento considerando que nuestro cuadricóptero se encuentra en el origen:

Alternativa de Solución en Qt y OpenGL

La única diferencia importante respecto al análisis previo es que el objeto puede estar fuera del origen, para tener una referencia de donde está se definen las variables px, py. Con esto se debe hacer una translación previa del cuadricóptero al origen y al final de vuelta a su posición original, es decir:

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.

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

Como se mencionó anteriormente se tienen cinco elementos distintos: cuatro aspas y una base cuadrada. 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.

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:

Descargar Archivo