OpenGL + Glut

[Principal] [Índice de artículos] [Capítulo 1] [Capítulo 3] [Capítulo 4]

Capítulo 2: Animaciones.

Hasta ahora vamos bien, pero es algo fome todavía, ahora vamos a ver animaciones. GLUT provee una función que controla la aplicación mientras esta está en estado de "ocio", mientras, al parecer no hace nada. Esta función es glutIdleFunc(void *(func)(void)), GLUT llama a ésta función todo el tiempo, haciendo que se logre una animación.

La animación se logra usando doble buffer, se dibuja algo en el buffer secundario, el que no se ve en pantalla, y luego se intercambia por el de la pantalla, si se hacen pequeños cambios, se logra ver una animación.

Es necesario definir nuestra ventana con doble buffer, esto se logra reemplazando los parámetros de glutInitDisplayMode por GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB , o sea, cambiar el buffer single por un buffer doble.

En la función dibujar, hemos limpiado el buffer de la pantalla, ahora debemos limpiar el buffer depth, el buffer secundario, para que no tenga cosas previamente dibujadas. Esto se logra usando glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) en la función dibujar.

Y para finalizar, al final de nuestra función dibujar hay que intercambiar los buffer, del secundario al primario, esto se logra con glutSwapBuffers();

Para nuestro ejemplo vamos a definir una variable global angulo, que va a ser el ángulo en que rotamos nuestro triángulo. Para rotar usamos la función glRotatef(float angle, float x, float y, float z), donde angle es el ángulo en cuanto queremos rotar y x, y o z deben ser diferentes de 0 para que rotemos ese eje.

Nuestra función de animación será la misma que dibuja.

float angulo=0.0;
 
int main(int argc, char **argv) {
	.
	.
	.
	glutIdleFunc(dibujar);
	.
	.
	.
}
 

void dibujar() {
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Se borran el buffer de pantalla y el depth
   glPushMatrix();		// Guarda la matriz actual en un stack
   glRotatef(angulo, 0.0, 1.0, 0.0);	// Rotamos en engulo sobre el eje y
   glBegin(GL_TRIANGLES);	// Se va a empezar una secuencia de triángulos.
      glColor3f(1.0, 0.0, 0.0);
      glVertex3f(-0.5, -0.5, 0.0);	// glVertex3f se usa para definir puntos con 3 coordenadas que sean flota, glvertex3d para 3 coordenadas que sean double.
      glColor3f(0.0, 1.0, 0.0);
      glVertex3f(0.0, 0.0, 0.0);
      glColor3f(0.0, 0.0, 1.0);
      glVertex3f(0.0, 0.5, 0.0);
   glEnd();				// Se termina de definir los triángulos.
   glPopMatrix();		// Recupera la matriz guardada en el stack
   glutSwapBuffers();
   angulo++;
}

La función glRotated(double angle, double x, double y, double z) es similar a glRotatef, pero ocupa valores double en vez de valores float.

La función para mover dentro del espacio es glTranslatef(float x, float y, float z) o glTranslated(double x, double y, double z), estas funciones mueven en x unidades sobre el eje x, y unidades sobre el eje y, y z unidades sobre el eje z.

La función para agrandar o achicar objetos es glScalef(float x, float y, float z) o glScaled(double x, double y, double z) los que agrandan o achican el tamaño de un objeto, multiplicando su medida en x por x, y asi sucesivamente. Si alguno de los factores es menor a 1 y mayor a 0, entonces los objetos se achican.

Otra función es glClearColor(r ,g ,b ,a) la cual podrá el color de borrado al color seleccionado mediante RGBA. Por ejemplo, si r, g y b son 1.0, entonces el fondo será blanco. La variable a es conveniente dejarla en 0.0 .

[Anterior] [Siguiente]