Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Intro A OpenGL
Intro A OpenGL
ndice
1. Introduccin
2. OpenGL y GNU/Linux
3. Conceptos bsicos sobre OpenGL
4. Animaciones
5. Iluminacin
6. Texturas
7. Interaccin con el teclado
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Introduccin
Objetivo del cursillo
A quin va dirigido?
OpenGL y GNU/Linux
La librera OpenGL
OpenGL y GNU/Linux
La librera OpenGL
La librera OpenGL
La librera GLU
GLX
Adems, GLUT
OpenGL y GNU/Linux
GNU/Linux y OpenGL
La librera Mesa
Es Libre
Es una implementacin software, excepto para ciertas
tarjetas, que usan el driver Mesa/Glide:
OpenGL y GNU/Linux
GNU/Linux y OpenGL
Xlibmesa
OpenGL y GNU/Linux
OpenGL y GNU/Linux
El espacio 3D
0
1
0
0
0
0
1
0
0
0
0
1
Roberto Garrido (Ro) - ESIDE e-ghost 2006
El espacio 3D
Transformaciones de objetos
Translacin
El espacio 3D
Transformaciones de objetos
Rotacin
El espacio 3D
Transformaciones de objetos
Escalado
El espacio 3D
Transformaciones de objetos
El espacio 3D
Transformaciones de objetos
0
1
0
0
0
0
1
0
0
0
0
1
1003
0100
0010
0001
1003
0100
0010
0001
1
4
0
0
0 (Ro) - ESIDE 0e-ghost 2006
Roberto Garrido
1
1
El espacio 3D
Varias razones:
Sobre Glut
Activacin/Desactivacin de opciones
glEnable(<OPTION>), glDisable(<OPTION>)
glEnable(GL_LIGHTING)
Roberto Garrido (Ro) - ESIDE e-ghost 2006
glMatrixMode(GL_PROJECTION)
glMatrixMode(GL_MODELVIEW)
glPopMatrix() y glPushMatrix()
El dibujado en OpenGL
glBegin(<MODO_DE_DIBUJADO>)
Descripcin
Se dibujan vrtices separados
Cada par de vrtices se interpreta como una lnea
Los vrtices describen el contorno de un polgono
Cada triplete de vrtices de interpreta como un tringulo
Cada cuarteto de vrtices se interpreta como un
cuadriltero
GL_LINE_STRIP
Lneas conectadas
GL_LINE_LOOP
Lneas conectadas, con unin entre el primer y ltimo
vrtice
GL_TRIANGLE_STRIP Se dibuja un tringulo, y cada nuevo vrtice se interpreta
con un tringulo entre los dos anteriores vrtices y el nuevo
GL_TRIANGLE_FAN Se dibujan tringulos con un vrtice comn
GL_QUAD_STRIP
Igual que el TRIANGLE_STRIP, con cuadrilteros
El dibujado en OpenGL
Color: glColor*
Normal: glNormal*
Coordenadas de textura: glTexCoor*
Dibujado de vrtices:
glVertex*
El color en OpenGL
La proyeccin en OpenGL
La proyeccin en OpenGL
Proyeccin perspectiva
gluPerspective()
Includes
#include <GL/glut.h>
Funcin main
glutDisplayFunc(display);
glutMainLoop();
return 0;
Funcin display
void display(void)
{
glClearColor(0.0,0.0,0.0,0.0);
// Color de fondo: negro
glClear(GL_COLOR_BUFFER_BIT);
// Boramos la pantalla
glMatrixMode(GL_PROJECTION);
// Modo proyeccin
glLoadIdentity();
// Cargamos la matriz identidad
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
// Proyeccin ortogrfica, dentro del cubo sealado
glMatrixMode(GL_MODELVIEW);
// Modo de modelado
Funcin display
glBegin(GL_TRIANGLES);
// Dibujamos un tringulo
glColor3f(1.0,0.0,0.0);
// Color del primer vrtice: rojo
glVertex3f(0.0,0.8,0.0);
// Coordenadas del primer vrtice
glColor3f(0.0,1.0,0.0);
// Color del segundo vrtice: verde
glVertex3f(-0.6,-0.2,0.0);
// Coordenadas del segundo vrtice
glColor3f(0.0,0.0,1.0);
// Color del tercer vrtice: azl
glVertex3f(0.6,-0.2,0.0);
// Coordenadas del tercer vrtice
glEnd();
// Terminamos de dibujar
glFlush();
// Forzamos el dibujado
sleep(10);
// Esperamos 10 segundos
exit(0);
// Salimos del programa
}
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Ejecutamos:
roberto@garridocuarto:~$./myfirstopenglprogram
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Visualizando en perspectiva...
Cdigo de dibujado
glBegin(GL_QUADS);
// Dibujamos un cuadrado
glColor3f(0.0,1.0,1.0);
// Color para el cuadrado
glVertex3f(-0.5,0.5,-0.5);
// Coordenadas del primer vrtice (superior-izquierda)
glVertex3f(-0.5,-0.5,0.5);
// Coordenadas del segundo vrtice (inferior-izquierda)
glVertex3f(0.5,-0.5,0.5);
// Coordenadas del primer vrtice (inferior-derecha)
glVertex3f(0.5,0.5,-0.5);
// Coordenadas del primer vrtice (superior-derecha)
glEnd();
// Termina
Visualizando en perspectiva...
Guardamos y ejecutamos
Visualizando en perspectiva...
Primera modificacin
gluPerspective(60.0,1.0,1.0,100.0);
// Proyeccin perspectiva. El ngulo de visualizacin es de 60 grados, la razn ancho/alto es
1 (son inguales), la distancia mnima es z=1.0, y la distancia mxima es z=100.0
Segunda modificacin
glTranslatef(0.0,0.0,-2.0);
// Alejamos el cuadrado del observador dos unidades en el eje Z
Visualizando en perspectiva...
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA |
GLUT_DEPTH);
Jerarquas
Jerarquas
Jerarquas
Jerarquas
Jerarquas
De manera recursiva
Jerarquas
glTranslatef(0,0,-16.0);
Jerarquas
Figura humanoide
Animaciones
Animaciones
Animaciones
Animaciones
Esquema de dibujado
Animaciones
void test();
void modifySpeed(float inc);
float * getPosv();
Funcin
Crea una instancia de la clase. La esfera
rebotar si llega a la poscin +-maxpos,
y tendr una velocidad speed. Su
situacin y direccin iniciales son
aleatorias
Comprueba que la figura est dentro de
los mrgenes, y si no le est, corregir su
direccin. Despus, actualiza su poscin
Incrementa la velocidad en inc
Obtiene un vector con la posicin de la
esfera (en la posicin 0, la coordenada X,
en la 1 la Y, y en la 2 la Z)
Animaciones
Funciones de glut
glutDisplayFunc()
glutIdleFunc()
Variables globales
float * pos;
TSphere * sphere;
Animaciones
Animaciones
Funcin display
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glutWireCube(10);
glPushMatrix();
glColor3f(0.0,0.0,1.0);
pos = sphere->getPosv();
glTranslatef(pos[0],pos[1],pos[2]);
glutSolidSphere(1,10,10);
glPopMatrix();
glFlush();
}
Animaciones
Funcin idle
void idle(void)
{
sphere->test();
usleep(33);
glutPostRedisplay();
}
Animaciones
El doble buffering
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA |
GLUT_DEPTH);
glutSwapBuffers();
Animaciones
Animaciones
Iluminacin
Iluminacin
Se basa en
Iluminacin
Luces
Iluminacin
Materiales
Normales
Iluminacin
Iluminacin
Luces
glEnable(GL_LINGHTING);
Iluminacin
Luces
Posicin/Direccin
Puntuales
Focales
Iluminacin
Posicin/Direccin
glLightfv(GL_LIGHTn,GL_POSITION,val_ptr);
glLightfv(GL_LIGHTn,GL_SPOT_DIRECTION,val_prt);
glLightf(GL_LIGHTn,GL_SPOT_CUTOFF,val);
Iluminacin
glLightf(GL_LIGHTn,GL_SPOT_EXPONENT,val);
Intensidad de la luz
Iluminacin
Atenuacin de la luz
glEnable(GL_LIGHTn);
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Iluminacin
Materiales
Iluminacin
glMaterialfv(GL_FRONT[_AND_BACK],[GL_AMBIE
NT|GL_DIFUSSE|GL_AMBIENT_AND_DIFUSSE|
GL_SPECULAR],val_ptr);
val_ptr es un puntero a un vector de componentes
RGBA
glMaterialf(GL_FRONT[_AND_BACK],GL_SHININE
SS,val);
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Iluminacin
Materiales
glColorMaterial(GL_FRONT[_AND_BACK],[GL_AMBIENT|
GL_DIFUSSE|GL_AMBIENT_AND_DIFUSSE|GL_SPECULAR]);
glColor3f(r_val,g_val,b_val);
Iluminacin
Iluminacin
Arrays a definir
Iluminacin
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFF
USE,mat_color);
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Iluminacin
glLightfv(GL_LIGHT0,GL_POSITION,light_dir);
Iluminacin
Iluminacin
Iluminacin
Iluminacin
Iluminacin
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE, mat_ambient_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialf(GL_FRONT,GL_SHININESS,mat_shininess);
Iluminacin
Iluminacin
Bucle de dibujado
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(30.0,0.0,0.0,1.0);
glRotatef(rot_angle_y,0.0,1.0,0.0);
glRotatef(rot_angle_x,1.0,0.0,0.0);
glLightfv(GL_LIGHT0,GL_POSITION,light_pos);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,spot_dir);
glTranslatef(light_pos[0],light_pos[1],light_pos[2]);
glColorMaterial(GL_FRONT,GL_EMISSION);
glEnable(GL_COLOR_MATERIAL);
glColor4fv(focus_emission);
glutSolidCone(0.2,0.5,7,7);
glColor4fv(mat_emission);
glDisable(GL_COLOR_MATERIAL);
glPopMatrix();
glutSolidSphere(1.0,20,20);
glFlush();
glutSwapBuffers();
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Iluminacin
Iluminacin
Ejercicio propuesto
Modificar sphere-rebotes-multi
Iluminacin
Texturas
Coordenadas de textura
Texturas
Texturas
Creamos la textura
Definimos las condiciones en las que se va a
aplicar la textura
Habilitar la aplicacin de texturas
Dibujar las escenas, proporcionando las
coordenadas de textura
Texturas
Creacin de la texura
glBindTexture(GL_TEXTURE_2D, texture);
Creamos la textura
Texturas
Creacin de la textura
Texturas
Texturas
Mediante glEnable(GL_TEXTURE_2D);
Texturas
glBindTexture(GL_TEXTURE_2D,texture);
Repeticin de texturas
Texturas
Repeticin de texturas
Para el suelo
glBindTexture(GL_TEXTURE_2D,texture_floor);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3f(-6.0,0.0,-6.0);
glTexCoord2d(0.0,1.0);
glVertex3f(-6.0,0.0,6.0);
glTexCoord2d(1.0,1.0);
glVertex3f(6.0,0.0,6.0);
glTexCoord2d(1.0,0.0);
glVertex3f(6.0,0.0,-6.0);
glEnd();
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Texturas
Repeticin de texturas
Para la pared
glBindTexture(GL_TEXTURE_2D,texture_wall);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3f(-6.0,4.0,-6.0);
glTexCoord2d(0.0,1.0);
glVertex3f(-6.0,0.0,-6.0);
glTexCoord2d(1.0,1.0);
glVertex3f(6.0,0.0,-6.0);
glTexCoord2d(1.0,0.0);
glVertex3f(6.0,4.0,-6.0);
glEnd();
Roberto Garrido (Ro) - ESIDE e-ghost 2006
Texturas
Texturas
Repeticin de texturas
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterfv(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
Texturas
Repeticin de texturas
Texturas
Funciones de CALLBACK
Modificacin de lit-sphere
Variables globales
rot_angle_x, rot_angle_y
Modificacin de lit-sphere
Modificacin de lit-sphere
Modificacin de lit-sphere
Redimensionado de la ventana
Modificacin de lit-sphere
Recursos de inters