J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
OpenGL1. Introducción2. Estructura de un programa3. Dibujo con OpenGL4. Visualización y transformaciones5. Estructura del código de prácticas
Referencias● Shreiner et al: OpenGL(R) Programming Guide: The red book, Version 2. Addison
Wesley, 2005. http://www.opengl.org/documentation/red_book/● The OpenGL Reference Manual The Blue book. Version 1.4. AddisonWesley, 2004. http://www.opengl.org/documentation/blue_book/● J. Ribelles, J. Lluch (eds.): OpenGL en fichas: Una introducción práctica. Publicacions de
la Universitat Jaume I. 2003.● R.S. Wright, B. Lipchak: Programación OpenGL. Anaya 2005● OpenGL Overview. http://www.opengl.org/about/overview/ ● OpenGL 2.1 Reference Pages http://www.opengl.org/sdk/docs/man/
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
1. Introducción
OpenGL es una API abierta y estándar
● Oculta el hardware● Hace que la aplicación sea portable
Permite manejar:
● Elementos geométricos● Propiedades visuales● Transformaciones● Especificación de fuentes de luz● Especificación de cámara
Aplicación
OpenGL
Hardware
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
IntroducciónBibliotecas auxiliares: GLU y GLUT
GLU es la librería de utilidades de OpenGL. Incluye funciones para crear texturas y dibujar superficies.
GLUT es el toolkit de OpenGL, incluye funciones para interaccionar con el sistema de gestion de ventanas. Es portable e independiente de la plataforma. Permite crear ventanas gráficas y procesar eventos de entrada. Además incluye funciones para dibujar objetos poliédricos simples.
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
La estructura de procesamientoen una implementacióntípica es un cauce
Aplicación
OpenGLBuffer de ordenes
Transformación e iluminación
Rasterización
Memoria de imagen
Estado
Introducción
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Aplicación
OpenGL
GPU (Unidad de procesamiento gráfico)
Buffer de ordenes
Memoria de imagen
Estado
Rasterización
Transformación e iluminación
Introducción
Puede estar implementado porsoftware o hardware.
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
2. Estructura de un programavoid pick(int x, int y){ GLuint buff[512]; GLint hits; GLint viewport[4]; int i;
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); fijaProyeccion();
Dibuja(); glMatrixMode (GL_PROJECTION); glPopMatrix (); // Deja la transformacion como estaba
hits = glRenderMode (GL_RENDER);
if(hits==0 ) return; // Nada seleccionado if(hits==1) printf(" Escenario \n"); // buff // 0 #names1 // 1 min Z1 // 2 max Z1 // 3..2+#names1 names1 // 3+#names1 #names2 // 4+#names1 min Z2 // 5+#names1 max Z2 // 6+#names1..5+#names1+#names2 names2
i = buff[6+buff[0]]1; // Primer identificador de segundo hit
printf (" Id: %d \n",i); // Se mira solo el primer identificador /* if(i>0 && i< COCHESSIZE){ if(coches[i].v < 0.01) { printf(" > velocidad %5.1f \n",vold); coches[i].v = vold;} else { }
Ejecución secuencial
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
void pick(int x, int y){ GLuint buff[512]; GLint hits; GLint viewport[4]; int i;
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); fijaProyeccion();
Dibuja(); glMatrixMode (GL_PROJECTION); glPopMatrix (); // Deja la transformacion como estaba
hits = glRenderMode (GL_RENDER);
if(hits==0 ) return; // Nada seleccionado if(hits==1) printf(" Escenario \n"); // buff // 0 #names1 // 1 min Z1 // 2 max Z1 // 3..2+#names1 names1 // 3+#names1 #names2 // 4+#names1 min Z2 // 5+#names1 max Z2 // 6+#names1..5+#names1+#names2 names2
i = buff[6+buff[0]]1; // Primer identificador de segundo hit
printf (" Id: %d \n",i); // Se mira solo el primer identificador /* if(i>0 && i< COCHESSIZE){ if(coches[i].v < 0.01) { printf(" > velocidad %5.1f \n",vold); coches[i].v = vold;} else {
void pick(int x, int y){ GLuint buff[512]; GLint hits; GLint viewport[4]; int i;
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); fijaProyeccion();
Dibuja(); glMatrixMode (GL_PROJECTION); glPopMatrix (); // Deja la transformacion como estaba
hits = glRenderMode (GL_RENDER);
if(hits==0 ) return; // Nada seleccionado if(hits==1) printf(" Escenario \n"); // buff // 0 #names1 // 1 min Z1 // 2 max Z1 // 3..2+#names1 names1 // 3+#names1 #names2 // 4+#names1 min Z2 // 5+#names1 max Z2 // 6+#names1..5+#names1+#names2 names2
i = buff[6+buff[0]]1; // Primer identificador de segundo hit
printf (" Id: %d \n",i); // Se mira solo el primer identificador /* if(i>0 && i< COCHESSIZE){ if(coches[i].v < 0.01) { printf(" > velocidad %5.1f \n",vold); coches[i].v = vold;} else { vold = coches[i].v; printf(" < velocidad %5.1f \n",vold); coches[i].v = 0.0; } }*/ // setViewTrans();}
Secuencial + subrutinas
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Pulsación de ratón
Entrada de teclado
Redimensionaventana
En un sistema interactivo las acciones son disparadas por eventos
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
void pick(int x, int y){ GLuint buff[512]; GLint hits; GLint viewport[4]; int i;
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); fijaProyeccion();
Dibuja(); glMatrixMode (GL_PROJECTION); glPopMatrix (); // Deja la transformacion como estaba
hits = glRenderMode (GL_RENDER);
if(hits==0 ) return; // Nada seleccionado if(hits==1) printf(" Escenario \n"); // buff // 0 #names1 // 1 min Z1 // 2 max Z1 // 3..2+#names1 names1 // 3+#names1 #names2 // 4+#names1 min Z2 // 5+#names1 max Z2 // 6+#names1..5+#names1+#names2 names2
i = buff[6+buff[0]]1; // Primer identificador de segundo hit
printf (" Id: %d \n",i); // Se mira solo el primer identificador /* if(i>0 && i< COCHESSIZE){ if(coches[i].v < 0.01) { printf(" > velocidad %5.1f \n",vold); coches[i].v = vold;} else { vold = coches[i].v; printf(" < velocidad %5.1f \n",vold); coches[i].v = 0.0; } }*/ // setViewTrans();}
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
Pulsación de ratón
Entrada de teclado
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
Redimensionaventana
La organización del código está dirigida por los eventos
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
void pick(int x, int y){ GLuint buff[512]; GLint hits; GLint viewport[4]; int i;
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); fijaProyeccion();
Dibuja(); glMatrixMode (GL_PROJECTION); glPopMatrix (); // Deja la transformacion como estaba
hits = glRenderMode (GL_RENDER);
if(hits==0 ) return; // Nada seleccionado if(hits==1) printf(" Escenario \n"); // buff // 0 #names1 // 1 min Z1 // 2 max Z1 // 3..2+#names1 names1 // 3+#names1 #names2 // 4+#names1 min Z2 // 5+#names1 max Z2 // 6+#names1..5+#names1+#names2 names2
i = buff[6+buff[0]]1; // Primer identificador de segundo hit
printf (" Id: %d \n",i); // Se mira solo el primer identificador /* if(i>0 && i< COCHESSIZE){ if(coches[i].v < 0.01) { printf(" > velocidad %5.1f \n",vold); coches[i].v = vold;} else { vold = coches[i].v; printf(" < velocidad %5.1f \n",vold); coches[i].v = 0.0; } }*/ // setViewTrans();}
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
Pulsación de ratón
Entrada de teclado
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
glSelectBuffer (512, buff); (void) glRenderMode (GL_SELECT); // Paso a modo seleccion
glInitNames(); glPushName(1);
glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
glGetIntegerv (GL_VIEWPORT, viewport); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3] y), 5.0, 5.0, viewport); return;}
Redimensionaventana
Comunicación por variables globales
Datos
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Main
Dibujo
Cambio tamañoventana X
Entrada
Inicialización
GlutMainLoop
Idle
Cola eventos
Eventos
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Eventos más usuales:
Cambio de tamaño de ventana. Entrada de letras Entrada de caracteres especiales Pulsación de ratón Movimiento de ratón Ausencia de eventos pendientes de procesar Eventos cronometrados Redibujado
Estructura de un programa
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
3. Dibujo con OpenGL
Estado de OpenGL
● Crear fuente de luz● Asignar propiedades de material● Asignar normales● Crear geometría
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Crear fuente de luzDibujo con OpenGL
El modelo más simple para el cálculo de iluminación es el de Lambert
Color s=Color obj I amb I dif I esp
I dif=Rdif cos=Rdif max L ∙ N , 0I esp=Resp max H ∙ N
n , 0
Iamb es la iluminación ambiente, es un parámetro de la escena, Rdif y Resp son la reflectividad difusa y especular, son parámetros de la superficie
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Act
ivar
Par
á met
ros
Crear fuente de luzGLfloat pos[4] ={10.0, 40.0, 10.0, 1.0 };GLfloat inten[4] ={0.4, 0.4, 0.4, 1.0 };GLfloat light_ambient[ ] = { 0.2, 0.2, 0.2, 1.0};GLfloat light_specular[ ] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv( GL_LIGHT0, GL_DIFFUSE, inten);glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);glLightfv( GL_LIGHT0, GL_POSITION, pos );
glEnable( GL_LIGHTING );glEnable( GL_LIGHT0 );
Componente homogénea 0= en el infinito
Dibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Asignar propiedades de materialfloat color[4]={0.2,0.7,1,1}; // R,G,B, AlfaGLfloat mat_specular[ ] = { 1.0, 1.0, 1.0, 1.0 };GLfloat low_shininess[ ] = { 5.0 };
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color );glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
Dibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Crear geometría
glBegin( GL_QUADS ); { glVertex3f( x, 0, 0 ); glVertex3f( x, y, 0 ); glVertex3f( x, y, z ); glVertex3f( x, 0, z ); } glEnd();
Dibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
GL_QUAD_STRIP
Crear geometríaDibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Crear geometríaDibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Asignar normales: Modo de sombreadoDibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
glShadeModel( GL_FLAT );
glShadeModel( GL_SMOOTH );
Asignar normales: Modo de sombreadoDibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
N
E2
E1
N = E1 x E2
N=E1×E2=Y 1 ∙ Z 2−Y 2∙ Z 1 , Z 1∙ X 2−X 1 ∙ Z 2, X 1∙ Y 2−Y 1 ∙ X 2
Asignar normales: Calculo de normalesDibujo con OpenGL
x
y
z
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
glShadeModel( GL_FLAT );glBegin( GL_QUADS );{
glNormal3f(1, 0, 0 ); glVertex3f( x, 0, 0 ); ..... glVertex3f( x, 0, z ); }glEnd();glShadeModel( GL_SMOOTH );glBegin( GL_QUADS );{
glNormal3f(1, 0, 0 ); glVertex3f( x, 0, 0 );
..... glNormal3f(1, 0, 0 );
glVertex3f( x, 0, z ); }glEnd();
Asignar normales: Calculo de normalesDibujo con OpenGL
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Dibujo con OpenGL
Luz ligada al observador Luz fija en la escena
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Pipeline de visualización
xyzw
v é rtice
Matriz de modelado
(Modelview)
Matriz de proyeccióm(Projection)
Normalización
Transformación de viewport
Coordenadasde mundo
Coordenadasde cámara
Coordenadasde recorte
Coordenadasnormalizadas
Coordenadasventana
Se utiliza para ubicar los objetos en el escenario Se utiliza para ubicar la
cámara
4. Visualización y transformaciones
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
glFrustrum
http://www.cs.virginia.edu/~gfx/Courses/2002/Intro.fall.02/Lectures/lecture03.ppthttp://www.cs.utoronto.ca/~faisal/teaching/notes/csc418/faisal/topics05.htmlhttp://www.glprogramming.com/red/chapter03.html
glOrtho
4. Visualización y transformacionesVisualizaciónProyección perspectiva y paralela
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Transformaciones geométricas
http://www.cs.utoronto.ca/~faisal/teaching/notes/csc418/faisal/topics04.html
Selección de transformación a editar: glMatrixMode( GL_MODELVIEW );
glMatrixMode( GL_PROJECTION);
Asignación de valor: glLoadIdentity(); glTranslatef( X, Y, Z ); glRotatef(ang, X, Y, Z); glScalef( X, Y, Z );
glLoadMatrixf( M );
(La composición no es conmutativa)
glutSolidTorus(0.5,3,24,32);
glTranslatef(0,5,0);glRotatef(90,0,1,0);glutSolidTorus(0.5,3,24,32);
4. Visualización y transformaciones
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Pila de transformacionesv é rti
ce
Matriz de modelado
(Modelview)
Matriz de proyeccióm(Projection)
Normalización
Transformación de viewport
Coordenadasde mundo
Coordenadasde cámara
Coordenadasde recorte
Coordenadasnormalizadas
Coordenadasventana
MO4MO34MO3
MO12
MP1MP4MP5
Pila de modelado Pila de proyección
glPushMatrix();
glPopMatrix();
4. Visualización y transformaciones
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Coordenadas homogéneas
x
w
y
1
Ph
P
Ph= x , y , z , w P=x ' , y ' , z ' t.q. x '=
xw
; y '=yw
; z '=zw
4. Visualización y transformaciones
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Transformaciones en coordenadas homogéneas
x ' , y ' , z ' , w ' =a 1 1 a 1 2 a 1 3 a 1 4
a2 1 a22 a23 a24
a3 1 a32 a33 a34
a4 1 a42 a43 a44 ∙
xyz1
1- Pasar a coordenadas homogéneas: (x,y,z) -> (x,y,z,1)
2- Aplicar transformación:
3- Proyectar al espacio 3D:(x”,y”,z”) = (x'/w',y'/w',z'/w')
4. Visualización y transformaciones
∙ Las transformaciones se pueden componer
∙ Las transformaciones se pueden almacenar
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Estructura del código de prácticas
Módulos:
grua: programa principal entradaMenu entradaTeclado estructura: funciones de dibujo de piezas modelo: evento de redibujado mouse: eventos de ratón visual: Transformación de visualización iu: Interfaz de usuario
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Fichero de cabecera
grua.h modelo.c#ifndef __gruaH__ #include <GL/glut.h>
#define __gruaH__ #include "glui.h"#ifndef __modelo__ #include
#define ambito extern .....#else #define __modelo__
#define ambito #include "grua.h"#endif
....ambito int COLORGRUA;
#endif
#undef ambito
Estructura del código de prácticas
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Interfaz de usuario: glui
Estructura del código de prácticas
Menús de persiana
Mensajes
Menús
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador
Próxima clase:
Tema 2: Modelado geométrico
Top Related