Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
Curso:
- Computación Gráfica
Profesor:
- Víctor Enrique Quevedo Dioses
Alumnos:
- Edgar Flores Osís
- Katherine Berrú Ruiz
Tema: Animación
Programa utilizado:
- Codeblocks
La Animación
Batman en Rotación y Movimiento 2D
La animación es muy importante dentro de los gráficos en computación la capacidad de conseguir
movimiento a partir de una secuencia de fotogramas o “frames”. La animación es fundamental
para un simulador de vuelo, una aplicación de mecánica industrial o un juego. En el momento en
que el ojo humano percibe más de 24 frames en un segundo, el cerebro lo interpreta como
movimiento real. En este momento, cualquier proyector convencional es capaz de alcanzar
frecuencias de 60 frames/s o más. Evidentemente, 60 fps (frames por segundo) será más suave (y,
por tanto, más real) que 30 fps. La clave para que la animación funcione es que cada frame esté
completo (haya terminado de renderizar) cuando sea mostrado por pantalla. Supongamos que
nuestro algoritmo (en pseudocódigo) para la animación es el siguiente ejemplo:
abre_ventana();
borra_ventana();
dibuja_frame(i);
espera_hasta_la_1/24_parte_de_segundo();
Si el borrado de pantalla y el dibujado del frame tardan más de 1/24 de segundo, antes de que se
pueda dibujar el siguiente, el borrado ya se habrá producido. Esto causaría un parpadeo en la
pantalla puesto que no hay una sincronización en los tiempos. Para solucionar este problema, ogl
nos permite usar la clásica técnica del doble-buffering: las imágenes renderizadas se van
colocando en el primer buffer, y cuando termina el renderizado, se vuelca al segundo buffer, que
es el que se dibuja en pantalla. Así nunca veremos una imagen cortada, solventando el problema
del parpadeo. El algoritmo quedaría:
abre_ventana();
borra_ventana();
dibuja_frame(i);
swap_buffers();
}
La cantidad de fps siempre quedará limitada por el refresco de nuestro monitor. Aunque OpenGL
sea capaz de renderizar 100 frames en un segundo, si el periférico utilizado (monitor, cañón) solo
nos alcanza los 60 hz., es decir, las 60 imágenes por segundo, aproximadamente 40 frames
renderizados se perderán.
Sentencias Principales:
GLVIEWPORT: Marca la región sobre la que queremos dibujar. Este comando por lo general es
llamado utilizando las dimensiones de la ventana como parámetros pero también puede
cambiarse si queremos dibujar diferentes escenas en un mismo objeto, un ejemplo puede ser
dibujar un espejo retrovisor.
GLMATRIXMODE: Cambia la matriz con la que se están haciendo operaciones.
GLLOADIDENTITY: Carga la matriz identidad a la matriz actual.
GLORTHO: Crea una proyección ortográfica.
GLSCALEF: sirve para el tamaño, de grande a pequeño
GLFLUSH: sirve para mostrar la imagen obtenida y borrarla, listo para volver a dibujar
nuevamente, forza la ejecución de comandos GL en tiempo finito
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
glTranslatef(dist, 0.0, 0.0); /// Multiplica la matriz actual por una Matriz de desplazamiento
//vela
glVertex2f(0.0,0.2); ///Primer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(0.4,0.45); ///Segundo Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(0.0,0.7); ///Tercer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
//Asta
glVertex2f(0.0,0.7); ///Primer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(-0.02,0.7); ///segundo Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(-0.02,-0.1); ///Tercer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(0.0,-0.1); ///Cuarto Vértice "2f": 2 números (porque está en 2D) y es de tipo float
//Base
glVertex2f(0.6,-0.1); ///Primer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(-0.6,-0.1); ///Segundo Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(-0.4,-0.4); ///Tercer Vértice "2f": 2 números (porque está en 2D) y es de tipo float
glVertex2f(0.4,-0.4); ///Cuarto Vértice "2f": 2 números (porque está en 2D) y es de tipo float
/// DOUBLE: "double búffer" sirve para dar mayor fuidez al tener 2 cuadros de dibujo.
glutMainLoop(); /// Permite que las funciones GLUT que controlen otras funciones se repitan
cuando sea necesario "bucle inteligente"
}
Ejemplo de Batman:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>// libreria para uzar los signos matematicos
#include <GL/glut.h>
#define Frac_Circ 100 // Cien fracciones de circulo
#define PI 3.1415926535897932 // libreria para uzar pi
#include <math.h>
#define PI 3.1415936
void creaLetras(void){
glBegin(GL_POLYGON);
glColor3f(0,0,0);
}
void creaLogo(void){
glPushMatrix();
glRotatef(-34,0,0,1);
creaCuadrado();
glPopMatrix();
glPushMatrix();
glRotatef(214,0,0,1);
creaCuadrado();
glPopMatrix();
case 34:
bandera = 1;
break;
case 35:
bandera=0;
break;
case 50:
figura =50;
break;
case 51:
figura=51;
break;
case 52:
figura=52;
void creaCirculos(void){
glBegin(GL_POLYGON);
for (float i = 0;i<2*PI; i+=.0001){
dx = radio*cos(i)+cx;
dy = radio*sin(i)+cy;
glVertex2f(dx,dy);
}
glEnd();
}
void reiniciaEscala(void){
glScalef(0,0,0);
glEnd();
glFlush();
glPopMatrix();
glPushMatrix();
glRotatef(216,0,0,1);
creaPico();
glPopMatrix();
glPushMatrix();
glRotatef(288,0,0,1);
creaPico();
glPopMatrix();
glPopMatrix();
}
//float r,g,b;
//lilnea de arriba de la cabeza
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-5,11);
glVertex2f(-5,12);
glVertex2f(4,12);
glVertex2f(4,11);
glEnd();
glColor3f(0,0,1);
glColor3f(1,1,1);
glBegin(GL_QUADS);
glVertex2f(-5,7);
glVertex2f(-5,6);
glVertex2f(-4,6);
glVertex2f(-4,7);
glEnd();
glColor3f(1,1,1);
glBegin(GL_QUADS);
glVertex2f(1,4);
glVertex2f(1,6);
glVertex2f(4,6);
glVertex2f(4,4);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-5,-5);
glVertex2f(-5,-8);
glVertex2f(-3,-8);
glVertex2f(-3,-5);
glBegin(GL_QUADS);
glVertex2f(-4,-4);
glVertex2f(-4,-5);
glVertex2f(-3,-5);
glVertex2f(-3,-4);
glBegin(GL_QUADS);
glVertex2f(-4,-8);
glVertex2f(-4,-9);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-11,-8);
glVertex2f(-11,-12);
glVertex2f(-6,-12);
glVertex2f(-6,-8);
glEnd();
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(5,-8);
glVertex2f(5,-12);
glVertex2f(10,-12);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-3,-11);
glVertex2f(-3,-12);
glVertex2f(-2,-12);
glVertex2f(-2,-11);
glEnd();
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(1,-11);
glVertex2f(1,-12);
glVertex2f(2,-12);
//aqui empiezan los bloques
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-13,-5);
glVertex2f(-13,-6);
glVertex2f(-9,-6);
glVertex2f(-9,-5);
glEnd();
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-12,-4);
glVertex2f(-12,-5);
glVertex2f(-8,-5);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(5,-2);
glVertex2f(5,-3);
glVertex2f(9,-3);
glVertex2f(9,-2);
glEnd();
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(6,-3);
glVertex2f(6,-4);
glVertex2f(10,-4);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-7,1);
glVertex2f(-7,-1);
glVertex2f(-6,-1);
glVertex2f(-6,1);
glEnd();
glColor3f(0,0,0);
glBegin(GL_QUADS);
glVertex2f(-6,-1);
glVertex2f(-6,-2);
glVertex2f(5,-2);
glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2f(-10,-3);
glVertex2f(-10,-4);
glVertex2f(-8,-4);
glVertex2f(-8,-3);
glEnd();
glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2f(7,-3);
glVertex2f(7,-4);
glVertex2f(9,-4);
glVertex2f(9,-3);
glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2f(-12,-6);
glVertex2f(-12,-12);
glVertex2f(-11,-12);
glVertex2f(-11,-6);
glEnd();
glColor3f(0,0,1);
glBegin(GL_QUADS);
glVertex2f(10,-6);
glVertex2f(10,-12);
void animar(void) {
rotar=rotar+inc;
if (botar==1){
ang=ang+0.001;
ry=10*cos(ang);
}
if (botar==2){
ang=ang+0.001;
rx=10*sin(ang);
}
glutPostRedisplay();
}
glutAddSubMenu("Color", colores);
glutAddSubMenu("GrayScale",gs);
glutAddSubMenu("State", state);
glutAddSubMenu("Figura",figura);
glutAddSubMenu("Eje",eje);
glutAttachMenu(GLUT_RIGHT_BUTTON);
float aspectratio;