Realizar el cuadricóptero mostrado en la figura:
La aplicación en Qt y OpenGl debe realizar lo siguiente:
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:
Ahora, si consideramos que la base cuadrada del cuadricóptero tiene por lado 2L, entonces las aspas deberán tener, respectivamente, su centro en: (L,L), (-L,L), (-L,-L) y (L,-L). Se considera para este análisis el aspa con centro en (L,L) previamente rotada, que ahora deberá transladarse del origen al punto (L,L), la diferencia en la transformación aplicada a cada aspa es el punto al que se translada cada una. Tenemos entonces para el aspa de la esquina superior: T(L,L).
En resumen, para llevar un punto de una aspa Pa1 en el origen a su posición final en el cuadricóptero Pa2, debemos hacer: Pa2 = T(L,L) R(α) Pa1, con el ángulo y punto adecuado para cada aspa.
Luego de colocar cada aspa en su lugar después de las transformaciones inicadas y de dibujar la base cuadrada, podemos pensar que tenemos el cuadricóptero como conjunto reprersentado en el origen y este será el siguiente elemento que se analizará.
Una vez que se sabe que hacer se muestra acontinuación los detalles de la implementació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:
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: