PRÁCTICA 2. Introducción a OpenGL. Interactividad.


 

INTRODUCCIÓN A OPENGL
 
En esta práctica vas a escribir tu primer código que utilizará la librería gráfica OpenGL para dibujar. Partirás del ejemplo que utilizamos la semana pasada (cuadrado.c) y harás una serie de modificaciones para conseguir los resultados que se te piden en los ejercicios que hay a continuación. Una breve descripción de la librería puede encontrarse en el siguiente Tutorial de OpenGL, aunque probablemente tendrás suficiente con los apuntes de clase.

Para empezar la práctica se debe crear un proyecto tal y como aprendiste la semana pasada (repásala si no te acuerdas, practica 1). Añade los ficheros fuente cuadrado.c y cuadrado.h; y también las librerías opengl32.lib, glu32.lib, y glut32.lib. Compílalo, ejecútalo y comprueba que el resultado es el esperado.


EJERCICIOS

 
En primer lugar repasa cuidadosamente el código fuente del ejemplo cuadrado.c. Cualquier duda que tengas pregúntasela a tu profesor de prácticas. Cuando tengas claro como funciona el programa haz los siguientes ejercicios.

1. Prueba a modificar los parámetros de las función glutInitWindowSize y glutInitWindowPosition. Observa lo que ocurre cuando defines una ventana no cuadrada. ¿Sabes porqué?

2. Modifica el código del programa cuadrado.c a fin de obtener uno a uno los siguientes resultados.

 

3. Modifica de nuevo el código del programa cuadrado.c a fin de obtener los siguientes resultados.

 


INTERACTIVIDAD

 
En esta parte de la práctica aprenderás a utilizar las posibilidades que ofrece la biblioteca funciones de utilidades glut de OpenGL (Manual glut) para dotar a tu aplicación de interacción con el usuario. Estudia como maneja los eventos producidos por la pulsación de los botones del ratón o de las teclas en el teclado alfanumérico. 

La tarea interactiva más simple que implementa la librería glut es permitir que se controle la ejecución de la aplicación mediante un bucle principal de visualización. El formato de la orden es:

void glutMainLoop (void);

La ejecución de esta función espera a que se produzcan eventos. Cada vez que se produce un evento lo atiende y ejecuta la función registrada, encargada de responder al evento (función de callback).

Los posibles eventos que puede responder OpenGL se dividen en tres grupos:

Eventos de ventana.

Se generan al crear la ventana de la aplicación, cambiar su tamaño o su posición en la pantalla. Los eventos de ventana se atienden registrando una función de respuesta con la función:

void glutReshapeFunc (void (*func)(int ancho, int alto));

Eventos de teclado.

Se generan al pulsar alguna tecla. Se atienden definiendo una función de respuesta con la función:

void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y));

Eventos de ratón.

Para registrar la función de respuesta cuando se produce una pulsación de algún botón del ratón se usa:

void glutMouseFunc (void (*func) (int boton, int estado, int x, int y);

Para registrar la función de respuesta cuando el ratón se está moviendo sobre la ventana activa se usa;

void glutMotionFunc (void (*func)(int x, int y));

En esta práctica vamos a trabajar con los eventos de teclado y ratón, dejando los de ventana para prácticas posteriores.


EJERCICIOS

 
1. Crea un proyecto nuevo y añade los ficheros: raton.c y raton.h. En primer lugar examina el código y pregunta a tu profesor de prácticas cualquier cosa que no entiendas. Compila y ejecuta el código. Comprueba el funcionamiento del programa presionando el botón izquierdo del ratón y las teclas rgEsc.

2. Modifica el código para que además atienda a los siguientes eventos de teclado:

Tecla 'b' fija el color a azul
Tecla 'y' fija el color a amarillo
Tecla 'R' fija el color de fondo a rojo
Tecla 'G' fija el color de fondo a verde
Tecla 'B' fija el color de fondo a azul
Tecla 'Y' fija el color de fondo a amarillo

OpenGL trabaja con el espacio de colores llamado RGB (Red Green Blue, o bién rojo verde azul). Así lo especificamos al haber llamado a glutInitDisplayMode(). Cada color está definido por tres valores entre 0 y 1, ambos incluídos. La siguiente tabla contiene las definiciones de los colores mas llamativos:

color componente(red) componente(green) componente(blue)
rojo 1.0 0.0 0.0
verde 0.0 1.0 0.0
azul 0.0 0.0 1.0
blanco 1.0 1.0 1.0
negro 0.0 0.0 0.0
amarillo 1.0 1.0 0.0
magenta 1.0 0.0 1.0
cyan 0.0 1.0 1.0

3. Modifica el código para que al pulsar el botón derecho del ratón se borre la ventana.

4. Modifica de nuevo el código de forma que al pulsar el botón izquierdo del ratón se capture el primer punto de la recta, y al soltarlo se capture el segundo y se dibuje la recta que une ambos puntos.

5. Modifica el código para que antes de soltar el botón izquierdo siempre sea visible la recta que se dibujaría.

6. Modifica el código de forma que los dos puntos indicados por el usuario sean la diagonal de un rectángulo y lo visualice. 

7. Añade un evento de teclado que te permita seleccionar entre dibujar líneas y rectángulos.