jueves, 25 de abril de 2013

Interactividad con OpenGL.


Cuando se programa con la librería GLUT.H OpenGL es encargado de detectar cualquier evento que se genera durante la ejecución de la aplicación, y de esta manera mandar llamar una funcion definida por el programador donde se puede especificar, mediante estructuras y variables, como es que se debe responder o que cambios se deben hacer al registrarse dicho evento. Los eventos mas comunes son los generados por el raton, el teclado, el mismo procesador y eventos basados en tiempo. Cuando se programa con OpenGL y no se utiliza la libreria glut.h, entonces la detección y administración de los eventos corre acargo del lenguaje sobre el que esta ejecutando y compilando OpenGL.

Tiempo Real

Se denomina aplicaciones de tiempo real, aquellas que van ejecutando cálculos mientras van desplegando las imágenes. Esto es util para lograr que la interactvidad del  usuario sea mas natural y realista, ya que al generar un evento en el que el usuario presiona un tecla, entonces se puede cambiar alguna variable y obligar a redibujar la escena realizando de nueva cuenta todos los cálculos que son necesarios. El tiempo real es muy utilizado en simulaciones, videojuegos, programas de diseño e incluso en animaciones. La principal desventaja de esta tecnica es que las computadoras requieren mayor poder de cómputo y muchas veces la calidad grafica no es la optima.

Por otro lado se tiene el manejo de graficas precalculadas o bien graficas en tiempo muerto, en las cuales todos los cálculos matemáticos se encuentran realizados previamente, con lo que el procesador solo se limita a mostrar solo una secuencia de imágenes. Esta técnica es muy útil para generar animaciones, películas, DVD’s etc.Su principal ventaja es el lograr graficas de alta calidad, pero requieren mayor cantidad de memoria para que puedan funcionar.

Funciones para interactividad con OpenGL
-          glutIdleFunc
-          glutMouseFunc
-          gluMotionFunc
-          glutPassiveFunc
-          glutKeyboardFunc
-          glutSpecialFunc
-          glutTimerFunc

glutIdleFunc

Esta función se manda a ejecutar cada vez que el procesador este inactivo, por lo que cada vez que el procesador no tenga nada que hacer se disparara este evento. Funciones de este tipo pueden ser muy utiles para hacer animaciones, solo que estas dependen de la velocidad del microprocesador, del tamaño de la ventana y de la resolucion de la pantalla para determinar la velocidad a la que correrá la animación.

            void glutIdleFunc(nombre_función);

glutMouseFunc
Esta función se manda llamar cada vez que se presiona o se libera un boton del mouse.

            void glutMouseFunc(nombre función);

Nombre función = void nombre función(int, int, int,int);


Boton que se presiona o libera:
-          GLUT_RIGHT_BUTTON
-          GLUT_LEFT_BUTTON
-          GLUT_MIDDLE_BUTTON

Estado del boton:
-          GLUT_UP
-          GLUT_DOWN

Posición:
La posición en pixeles del cursor del Mouse relativa a la ventana(x,y)

glutMotionFunc y glutPassiveFunc
Esta función se manda llamar cada vez que ocurra un desplazamiento del mouse, mientras se presiona un boton.

            void glutMotionFunc(nombre función);

            Nombre función = void nombre(int x, int y);






glutPassiveFunc
Esta función se manda llamar cuando se mueve el mouse sin mantener presionado ningun boton.
            void glutPassiveFunc(nombre función);

            Nombre función = void nombre(int x, int y);

glutKeyboardFunc
 Esta función se manda llamar cada vez que se presiona una tecla que tiene codigo ASCII definido, es decir, este evento se genera al presionar teclas de letras, números, signos de puntuación, ortográficos, y otras teclas especiales como el enter, el tab, barra espaciadora, escape, suprimir, etc.

            void KeyboardFun(nombre función);

            void nombre función = (unsigned char, int , int);

glutSpecialFunc
Esta función se ejecuta cada vez que se presiona una tecla que no tiene codigo ASCII y que OpenGL maneja como tecla especial, se puede decir que es el complemento de la función anterior.

            voidSpecialFunc(nombre función);
           
            void nombre función(int, int, int);

Constantes:
-          GLUT_KEY_F1
-          GLUT_KEY_F2
-          GLUT_KEY_F12
-          GLUT_KEY_UP
-          GLUT_KEY_DOWN
-          GLUT_KEY_LEFT
-          GLUT_KEY_RIGHT
-          GLUT_KEY_INSERT
-          GLUT_KEY_HOME
-          GLUT_KEY_END
-          GLUT_KEY_PAGE_DOWN
-          GLUT_KEY_PAGE_UP

glutTimerFunc
Esta función se ejecuta despues de un cierto tiempo, el cual se especifica en milisegundos, esta función puede ser muy util para generar animaciones que no dependan de la velocidad del micorprocesador. La principal diferencia con la función glutIdleFunc es que la función glutTimerFunc no se manda llamar sola indefinidamente, por lo que si se desea generar la animacion sea necesario llamarla recursivamente de manera explicita.

            void glutTimerFunc(int tiempo, nombrefuncion, int parametro);