miércoles, 19 de septiembre de 2012

Pirámide cuadrada en Open GL


// piramide.cpp: define el punto de entrada de la aplicación de consola.
//

#include"stdafx.h"
//librería para utilizar operaciones matemáticas
#include<glut.h>

voidInicializacion(void);
voidDibuja(void);

int main()
{
       //inicio del boblebuffering para evitar parpadeo
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
//tamaño de la pantalla
glutInitWindowSize(600,600);
//posición de inicio de la pantalla
glutInitWindowPosition(0,0);
//título de la pantalla
glutCreateWindow("Pirámide cuadrada");
//llamado a inicialización
Inicializacion();
//llamado a dibuja
glutDisplayFunc(Dibuja);
//ciclo para pausar la pantalla
glutMainLoop();

return 0;
}

voidInicializacion(void)
{
       //matriz a modificar
glMatrixMode(GL_PROJECTION);
//resetear a la matriz a su estado por default
glLoadIdentity();
//se indica la perspectiva en que se verá
gluPerspective(70,1,0.1,100);
//matriz de transformacion
glMatrixMode(GL_MODELVIEW);
//permiyte trasladar un objeto en el espacio
glTranslated(0,0,-10);
//glRotated permite rotar un objeto
//------------------------------vistas de la pirámide
//--------vista de dos caras
glRotated(50,1,1,0);
//--------vista de tres caras
//glRotated(85,1,1,0);
//--------vista de la base y dos caras
//glRotated(-40,1,-5,0);
//--------vista de la base y un cara
//glRotated(200,1,0,0);
//--------vista de una cara
//glRotated(0,0,0,0);
//--------vista de la base
//glRotated(-90,100,0,0);
//--------vista de las cuatro caras
//glRotated(90,100,0,0);
//limpiamos la pantalla con un color
//glClearColor(0,0,0,0);
//glShadeModel especifica un tipo de sombreado o relleno
//en este caso es un relleno plano al tratarse de GL_FLAT
//no lo usamos para colorear como si fuese degradado
//glShadeModel(GL_FLAT);
//habilitanos GL_CULL_FACE el cual especifica si facetas delantera o
//trasera son estraídas o eliminadas
glEnable(GL_CULL_FACE);
//aquí se indica que se van a extraer las facetas traseras
glCullFace(GL_BACK);
//glFrontFace define los poligones de frente o espalda
//GL_CW especifica que los polígonos se verán de frente
glFrontFace(GL_CW);
}


void Dibuja(void)
{
       //limpiamos pantalla
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//inicio de dibujo de un cuadrado

//-----base de la piramide--varios colores
//se usa GL_QUADS para crear un cuadrilátero
glBegin(GL_QUADS);
//vértices en 3d
glColor3f(1,0,0);//rojo
glVertex3d(-4,0,-4);//4
glColor3f(1,1,0);//amarillo
glVertex3d(-4,0,4);//3
glColor3f(0,0,1);//azul
glVertex3d(4,0,4);//2
glColor3f(0,1,0);//verde
glVertex3d(4,0,-4);//1
glEnd();
//------------------caras de la pirámide
//para las caras triangulares
//se usará GL_TRIANGLES
//--------Cara 4  amarillo con blanco
glBegin(GL_TRIANGLES);
//vértices en 3d
glColor3f(1,1,1);//blanco
glVertex3d(0,4,0);
glColor3f(1,1,0);
glVertex3d(-4,0,-4);//1
glVertex3d(4,0,-4);//4
glEnd();

//--------Cara 1 rojo con blanco
glBegin(GL_TRIANGLES);
//vértices en 3d
glColor3f(1,1,1);//blanco
glVertex3d(0,4,0);
glColor3f(1,0,0);//rojo
glVertex3d(4,0,-4);
glVertex3d(4,0,4);
glEnd();
//--------Cara 3 verde con blanco
glBegin(GL_TRIANGLES);
//vértices en 3d
glColor3f(1,1,1);//blanco
glVertex3d(0,4,0);
glColor3f(0,1,0);//verde
glVertex3d(-4,0,4);
glVertex3d(-4,0,-4);
glEnd();
//-------Cara 2 azul con blanco
glBegin(GL_TRIANGLES);
//vértices en 3d
glColor3f(1,1,1);//blanco
glVertex3d(0,4,0);
glColor3f(0,0,1);//azul
glVertex3d(4,0,4);
glVertex3d(-4,0,4);
glEnd();

//cambio del bufer oculto al activo
glutSwapBuffers();
}