34
J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador OpenGL 1. Introducción 2. Estructura de un programa 3. Dibujo con OpenGL 4. Visualización y transformaciones 5. 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. Addison-Wesley, 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/

Seminario OpenGL

Embed Size (px)

Citation preview

Page 1: Seminario OpenGL

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/

Page 2: Seminario OpenGL

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

Page 3: Seminario OpenGL

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.

Page 4: Seminario OpenGL

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

Page 5: Seminario OpenGL

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. 

Page 6: Seminario OpenGL

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

Page 7: Seminario OpenGL

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

Page 8: Seminario OpenGL

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

Page 9: Seminario OpenGL

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

Page 10: Seminario OpenGL

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

Page 11: Seminario OpenGL

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

Page 12: Seminario OpenGL

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

Page 13: Seminario OpenGL

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

Page 14: Seminario OpenGL

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

Page 15: Seminario OpenGL

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

Page 16: Seminario 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

Page 17: Seminario 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

Page 18: Seminario 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

Page 19: Seminario OpenGL

J.C. Torres – P. Cano Univ. de Granada. Dpto. Lenguajes y S.I. Diseño Asistido por ordenador

Crear geometríaDibujo con OpenGL

Page 20: Seminario 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

Page 21: Seminario 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

Page 22: Seminario 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

Page 23: Seminario OpenGL

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

Page 24: Seminario 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

Page 25: Seminario OpenGL

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

Page 26: Seminario OpenGL

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

Page 27: Seminario OpenGL

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

Page 28: Seminario OpenGL

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

Page 29: Seminario OpenGL

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

Page 30: Seminario OpenGL

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

Page 31: Seminario OpenGL

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

Page 32: Seminario OpenGL

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

Page 33: Seminario OpenGL

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

Page 34: Seminario OpenGL

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