Este documento presenta un manual de prácticas en OpenGL utilizando Dev C++. Incluye 16 prácticas que muestran funciones básicas y avanzadas de OpenGL como la creación de un tablero de ajedrez, una estrella, un cubo con líneas y más, explicando el código necesario para cada objeto.
1. CECyTEM PLANTEL TECÁMAC
Manual de prácticas en OPEN GL “Dev
C++”
Alumnos: Belmonte Vargas Baruch Isaí
Ponce Serrano Carlos Andrés
Prof.: René Domínguez Escalona
Grupo: 303
2. Introducción.
En este manual se podrá apreciar algunas de las principales
funciones del lenguaje de programación de OPEN GL y así
se podrá aplicar para diseño gráfico, se mostraran
funciones principales o primitivas del programa para la
realización de objetos en el programa se verá desde lo más
básico hasta lo más avanzado como puede ser desde la
elaboración de un cuadro hasta la animación de un objeto
en 2D & 3D.
3. Índice.
1°- Tablero de Ajedrez
2°-Estrella
3°- Cubo con líneas
4°-Cubo delineado
5°-Muñeco con triángulos
6°-Piramide
7°-Casita
8°- Oso
9°-Cubo con Cubitos
10°-Muñeco con formas
11°-Animación circulo
12°- Nombre 3D
13°-Animación sistema solar
14°-Movimiento en ocho
15°-Semaforo
16°- Cubo 3D con líneas.
4. 1° TABLERO DE AJEDREZ
En esta práctica aremos un tablero de ajedrez con cuadros unos negro y uno blanco de
8*8. La realizaremos con la primitiva GL_POINTS, comenzaremos por definir el color de
cada cuadro con glColor3f(0.0 , 0.0 , 0.0) que sería negro, luego el tamaño del punto
glPointSize(50) y en seguida anotaremos la primitiva ya mencionada
glBegin(GL_POINTS).
Luego de esto se pondrán las coordenadas glVertex2i(100,800); por ejemplo deberán de
ser 4 coordenadas para insertar un cuadro
glVertex2i(100,500);
glVertex2i(100,600);
glVertex2i(100,700);
glVertex2i(100,800);
y así lo haremos consecutivamente hasta lograr hacer el tablero indicado.
CODIGO:
void dibuja(void) //funcion dibuja
{
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
glColor3f(0.0 , 0.0 , 0.0);
glPointSize(50);
glBegin(GL_POINTS);
glVertex2i(100,500);
glVertex2i(100,600);
11. 2° ESTRELLA
En esta práctica haremos una estrella a base de líneas con la primitiva glBegin(GL_LINES),
definiremos en tamaño de la línea y el color con:
glPointSize(10);
glColor3f(0.0 , 0.0 , 0.0);
y comenzaremos a anotar cada una de las coordenadas para así llegar a la forma de la estrella.
CODIGO:
void dibuja(void) //funcion dibuja
{
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
glBegin(GL_LINES);
glPointSize(10);
glColor3f(0.0 , 0.0 , 0.0);
glVertex2i(174,300);
glVertex2i(425,300);
glBegin(GL_LINES);
glPointSize(10);
glColor3f(0.0 , 0.0 , 0.0);
glVertex2i(200,150);
glVertex2i(425,300);
glBegin(GL_LINES);
glPointSize(10);
glColor3f(0.0 , 0.0 , 0.0);
13. 3° CUBO CON LÍNEAS
En esta práctica utilizaremos 2 primitivas glBegin(GL_QUADS) para hacer cuadros y
glBegin(GL_LINES); para hacer las líneas igual que practicas anteriores definiremos el color de
la línea o cuadro con glColor3f(1.0 , 0.0 , 0.0);.
Primero haremos la parte trasera del cubo para que se noten las líneas de enfrente y no estén
cubiertas por las demás líneas o cuadros.
Y de igual forma definiremos cada coordenada hasta lograr el cubo con líneas.
CODIGO:
void dibuja(void) //funcion dibuja
{
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
glColor3f(0.0 , 0.0 , 0.0);
glPointSize(50);
glBegin(GL_LINES);
glVertex2i(200, 100);
glVertex2i(300, 100);
glVertex2i(200, 100 );
glVertex2i(200, 200);
glVertex2i(200, 200);
glVertex2i(300, 200);
glVertex2i(300, 200);
glVertex2i(300, 100);
15. 4°CUBO DELINEADO
Esta práctica la haremos como la práctica de CUBO CON LÍNEAS lo único que modificaremos será
el grosor de la línea con la instrucción glLineWidth(3) el tamaño de la línea será colocado dentro
del paréntesis y le modificaremos el color de cada lado para ver así la separación de cada lado.
CODIGO:
void dibuja(void) //funcion dibuja
{
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
glLineWidth(5);
//enfrente
glBegin(GL_QUADS);
glColor3f(1.0 , 0.0 , 0.0);
glVertex2i(200,200);
glVertex2i(300,200);
glVertex2i(300,200);
19. 5°MUÑECO CON TRIÁNGULOS
En esta práctica haremos un muñeco utilizando una nueva primitiva glBegin(GL_TRIANGLES) y
también primitivas ya utilizadas antes.
Para esta instrucción se necesitan 3 coordenadas ya no 2 como en las instrucciones
glBegin(GL_QUADS) o glBegin(GL_LINES)
De igual forma trataremos de encontrar cada una de las coordenadas para lograr el dibujo a base
de triángulos y si es necesario ocuparemos otras primitivas.
Como en el caso del balón también se utiliza una nueva primitiva glBegin(GL_POLYGON) a
base de 8 coordenadas.
También utilizamos colores degradados. Estos se logran colocando la instrucción de color entre
las coordenadas y no solo poniéndole hasta arriba de cada grupo de coordenadas por ejemplo:
glColor3f(1.0 , 1.0 , 0.0);
glVertex2i(320,100);
glVertex2i(340,100);
glColor3f(1.0 , 1.0 , 1.0);
glVertex2i(360,80);
glVertex2i(360,60);
glVertex2i(340,40);
glVertex2i(320,40);
glColor3f(1.0 , 1.0 , 0.0);
glVertex2i(300,60);
glVertex2i(300,80);
CODIGO:
void dibuja(void) //funcion dibuja
{
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
27. 6° PIRAMIDE
Esta práctica la haremos con una nueva instrucción llamada FOR: for (i=0;i<=10;i++){ dentro de
ella podemos cambiar los valores, esta instrucción funciona para repetir alguna primitiva, ya sea
cuadros, líneas etc….
En esta ocasión la utilizaremos para repetir un cuadro pero que vaya aumentando su tamaño a
cierta distancia
La instrucción va antes de que empecemos a colocar las coordenadas, y pondremos la variable
dentro de las coordenadas, en este caso la variable es i y colocando esta variable hará la
instrucción for.
Por ejemplo:
glVertex2i(240-20*i,240-20*i);
glVertex2i(260+20*i,240-20*i);
El 240 en el valor de x, el -20 es la separación entre el cuadro y se multiplicara por i que es la
variable con la cual se efectuara el mismo cuadro.
Luego de Esto haremos las líneas diagonales para simular la pirámide vista desde arriba.
CODIGO:
void dibuja(void) //funcion dibuja
{
int i;
glClear(GL_COLOR_BUFFER_BIT); //borra pantalla
glPointSize(10);
glColor3f(0.0 , 0.0 , 0.0);
glBegin(GL_LINES);
for (i=0;i<=10;i++){
//ABAJO
31. 7° CASITA.
Esta práctica es como un repaso de todas las primitivas e instrucciones vistas anteriormente. Para
lograr dicho dibujo empezaremos por hacer los objetos de atrás para delante para que se puedan
notar todas las figuras.
Por ejemplo primero haremos la cerca con la instrucción for y se haga repetitiva la figura y esta
figura será hecha con la primitiva POLYGON.
De igual forma ocuparemos for para los pinos, pero primero tenemos que hacer el pasto como ya
antes mencionamos haremos primero lo que se encuentra atrás.
Rejas, pasto, banqueta, calle, piedras y así sucesivamente, hasta llegar a los detalles de la casa
que serían las ultimas figuras que haremos.
CODIGO:
void dibuja(void)
{
int i,j=0;
43. 8°- Oso
Esta practica la logramos hacer por medio de una nueva instruccion, la instruccion la
llamaremos circulo.
Para lograr esto incluiremos la paqueteria #include <math.h> para que formule nuestras
operaciones matematicas.
nuestras instrucción se llamara circuloc devido a que solo será la circunferencia
void circuloc(int x, int y, int t, int radio)
{
int angulo=0;
glPointSize(t);
glBegin(GL_POINTS);
//glColor3f (1.0, 0.0, 1.0);
glVertex2f(x,y);
//glColor3f(0,0.0,0.0);
for (angulo=0;angulo<=360; angulo+=1){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
y con circulo haremos un circulo con area
void circulo(int x, int y, int radio)
{
int angulo=0;
glBegin(GL_TRIANGLE_FAN);
// glColor3f (1.0, 0.0, 1.0);
glVertex2f(x,y);
44. for (angulo=0;angulo<=360; angulo+=1){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
Y así juntaremos las coordenadas hasta lograr hacer un oso.
CODIGO:
void circuloc(int x, int y, int t, int radio)
{
int angulo=0;
glPointSize(t);
glBegin(GL_POINTS);
//glColor3f (1.0, 0.0, 1.0);
glVertex2f(x,y);
//glColor3f(0,0.0,0.0);
for (angulo=0;angulo<=360; angulo+=1){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
void circulo(int x, int y, int radio)
{
int angulo=0;
glBegin(GL_TRIANGLE_FAN);
// glColor3f (1.0, 0.0, 1.0);
48. 9°-Cubo con Cubitos
Esta practica esta un poco complicada devido a que utilizaremos una funcion for pero
multiplicaremos todo un cubo. para arriba a los lados creando solo el prerimetro de uno
más grande pero tenemos que tomar en cuenta los cubos que ya estan hechos para que
no se deformen o salga una linea más grande que otra.
10°-Muñeco con formas.
Este muñeco es facil de hacer ya que utilizaremos todas las primitivas he instruciones ya
vistas pero las uniremos y cambiaremos su color.
11°-Animación circulo
Haremos que un circulo se mueva alrededor de la pantalla con una instruccion nueva.
CODIGO:
void circulo
(int x, int y, int radio)
{
51. 12°- Nombre 3D
Este nombre se hará a base se cubitos se ira poniendo uno tras otro, aquí las coordenadas
cambiaran, cada que se haga un cubo ese cubo tendra las coordenadas 0,0 y al ultimo
solo modificaremos los colores.
55. 13°-Animación sistema solar.
Esta animacion se podra hacer por medio de un movimiento del circulo pero circular.
comenzaremos por definir el sol, y aspi susecivamente hasta hacer todos los planetas le
modificaremos el color y la hubicacion de hacia donde dará la vuelta.
CODIGO:
void circulo(int x, int y, int radio)
{
int angulo=0;
glBegin(GL_TRIANGLE_FAN);
//glColor3f (0.5, 0.5, 0.5);
glVertex2f(x,y);
//glColor3f(0,0.0,0.0);
for (angulo=0;angulo<=360; angulo++){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
void circuloc(int x, int y, int t, int radio)
{
int angulo=0;
glPointSize(t);
glBegin(GL_POINTS);
glVertex2f(x,y);
59. 14°-Movimiento en ocho
Esta practica la haremos haciendo 4 circulos 2 seran solo la circunferencia y los
pondremos pegados, los otros 2 seran con area y los pondremos encima de modo que se
de la forma de un 8, haremos un circulo más pequeño que recorrera la circunferencia de
los primeros 2 circulos. Y así su recorrido será continuo.
CODIGO:
15°-Semaforo.
El objetivo de este será hacer la simulacion de un semaforo, dibujremos la estructura de
un semaforo normal y haremso que prenda de rojo a verde de verde a amarillo y a rojo,
y así sucesivamente.
CODIGO:
void circuloc(int x, int y, int t, int radio)
{
int angulo=0;
glPointSize(t);
60. glBegin(GL_POINTS);
//glColor3f (1.0, 0.0, 1.0);
glVertex2f(x,y);
//glColor3f(0,0.0,0.0);
for (angulo=0;angulo<=360; angulo+=1){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
void circulo(int x, int y, int radio)
{
int angulo=0;
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x,y);
for (angulo=0;angulo<=360; angulo++){ glVertex2f(x + sin(angulo) * radio, y +
cos(angulo) * radio);}
glEnd();
}
void dibuja(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//esto
glBegin(GL_QUADS);//Cuadros fondo semaforo
glColor3f(0.2 , 0.2 , 0.0);
glVertex2i(170,437);
glVertex2i(320,437);
65. 16°- Cubo 3D con líneas.
Este cubo se lograra hacer con una malla, y con la intervencion del teclado la malla se
multiplicara y hará un cubo. y se podra mover con el teclado.
De igual forma tedra teclas para hacer un zoom.
CODIGO:
void mover(void){
glTranslated(0,0,zoom);
glRotated(girax,1.0,0.0,0.0);
glRotated(giray,0.0,1.0,0.0);
}
void creaMalla(void){
int i, long_eje=10,j;
glColor3f(1.0,1.0,0.0);
glBegin(GL_LINES);
for(i=-long_eje;i<=long_eje;i++){
for(j=-long_eje;j<=long_eje;j++){
glVertex3f(j,-long_eje,i);
glVertex3f(j,long_eje,i);
glVertex3f(-long_eje,j,i);
glVertex3f(long_eje,j,i);
glVertex3f(j,i,-long_eje);
glVertex3f(j,i,long_eje);
glVertex3f(-long_eje,j,i);
glVertex3f(long_eje,j,i);
68. {
glClearColor(1.0,1.0,1.0,0.0) ;// Definimos el negro como color de fondo
glEnable(GL_DEPTH_TEST); // Activamos el z-Buffer
glEnable(GL_LIGHTING); // Activamos la iluminación
glEnable(GL_LIGHT0); // Activamos la luz 0
glMatrixMode(GL_PROJECTION); // set the view volume shape
glLoadIdentity(); glOrtho(-15,15,-15,15,-30,30);
glMatrixMode(GL_MODELVIEW); // position and aim the camera
glLoadIdentity();
gluLookAt(5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0);
}
void dibuja( void )
{
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable(GL_DEPTH_TEST); // Activamos el z-Buffer
glEnable(GL_LIGHTING); // Activamos la iluminación
glEnable(GL_LIGHT0); // Activamos la luz 0
//glShadeModel(GL_FLAT);
glShadeModel (GL_SMOOTH);
// Cargamos la matriz identidad para reiniciar las transformaciones
/* float angulo;
69. int i;
glLineWidth(20);
glBegin(GL_LINES);
glColor3d(1,1,1);
for (i=0; i<360; i+=10) {
angulo = (GLfloat)i*3.14159f/180.0f; // grados a radianes
glColor3d(1,1,1);
glVertex3i(0,0,-3);
glVertex3f(0+cos(angulo)*45, 0+sin(angulo)*45,0);
}
glEnd();*/
// Colocamos una luz
glLightfv(GL_LIGHT0,GL_DIFFUSE,(GLfloat []){0.0f,2.0f,2.0f,1.0f}); // Color de la luz
glLightfv(GL_LIGHT0,GL_AMBIENT,(GLfloat []){1.0, 1.0, 1.0, 4.0}); // Luz ambiente
glLightfv(GL_LIGHT0,GL_POSITION,(GLfloat []){0.0f,12.0f,5.0f,0.0f}); // Posición de la
luz
glLightfv(GL_LIGHT0,GL_EMISSION,(GLfloat []){0.5,0.5,0.5,1.0});
//glShadeModel (GL_SMOOTH);
// esfera
glPushMatrix();
mover();
if(malla) creaMalla();
if(ejes) creaEjes();
//glRotatef(anguloEsfera, 1.0f, 1.0f,0.0f);