Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

65
Cómo saldremos Cómo saldremos De aquí saldremos: De aquí saldremos: Flipando Flipando Alucinando Alucinando Con la mirada perdida en el infinito Con la mirada perdida en el infinito Queriendo simular o graficar todo Queriendo simular o graficar todo O de plano es que que no entendimos O de plano es que que no entendimos nada nada

Transcript of Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Page 1: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Cómo saldremosCómo saldremosDe aquí saldremos:De aquí saldremos:

FlipandoFlipando

AlucinandoAlucinando

Con la mirada perdida en el infinitoCon la mirada perdida en el infinito

Queriendo simular o graficar todoQueriendo simular o graficar todo

O de plano es que que no entendimos O de plano es que que no entendimos nadanada

Page 2: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

ObjetivosObjetivosEn este curso se introducirá a los En este curso se introducirá a los participantes a las técnicas básicas participantes a las técnicas básicas para modelar en 2D y 3D con OpenGL, para modelar en 2D y 3D con OpenGL, incluyendo animación, manejo de luces, incluyendo animación, manejo de luces, colores y materialescolores y materiales

En estas 40 horas: estarán listos para En estas 40 horas: estarán listos para ponerse a programar aplicaciones 2D y ponerse a programar aplicaciones 2D y 3D interactivas.3D interactivas.

Se les presentará el software libre Se les presentará el software libre necesario y se les facilitará plantillas necesario y se les facilitará plantillas para el desarrollo de aplicaciones para el desarrollo de aplicaciones simples.simples.

Page 3: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Panorama de Panorama de bibliotecas bibliotecas

gráficasgráficas

Page 4: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

1.1 El entorno 1.1 El entorno gráficográfico

Cada sistema operativo ofrecía sus Cada sistema operativo ofrecía sus gráficas por softwaregráficas por software

El HW para gráficas requería sus El HW para gráficas requería sus propias bibliotecaspropias bibliotecas

Las gráficas avanzadas eran complejasLas gráficas avanzadas eran complejas

Page 5: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

1.2 Soluciones1.2 SolucionesGKSGKS

Primera plataforma, introducida en 1977.Primera plataforma, introducida en 1977.

PHIGSPHIGSPlataforma gráfica montada sobre Xwindow, Plataforma gráfica montada sobre Xwindow, surgida a principios de los 80’s, disponible de surgida a principios de los 80’s, disponible de manera separada en sistemas DEC, Sun y otros.manera separada en sistemas DEC, Sun y otros.Estandarizada en ANSI, FIPS e ISO en 1989.Estandarizada en ANSI, FIPS e ISO en 1989.

OpenGLOpenGL

Direct3D, lanzado por Microsoft en 1995, siendo Direct3D, lanzado por Microsoft en 1995, siendo el principal competidor de OpenGL, pero el principal competidor de OpenGL, pero limitado a plataformas de MS.limitado a plataformas de MS.

VRMLVRMLDiseñado para ser utilizado en la Web, con éxito Diseñado para ser utilizado en la Web, con éxito limitado.limitado.

WebGLWebGLTambién para ser utilizado en la Web, basado También para ser utilizado en la Web, basado en JavaScript.en JavaScript.

Page 6: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

2. Historia de 2. Historia de OpenGLOpenGL

Principios de los 90s: IRIS GL, desarrollado Principios de los 90s: IRIS GL, desarrollado para las estaciones de trabajo de Silicon para las estaciones de trabajo de Silicon Graphics (SGI), compitiendo con PHIGS y Graphics (SGI), compitiendo con PHIGS y superándolo.superándolo.

En 1992 SGI decidió convertirlo en estándar En 1992 SGI decidió convertirlo en estándar abierto para establecer su influencia en el abierto para establecer su influencia en el mercado (abierto no significa gratuito ni mercado (abierto no significa gratuito ni código abierto).código abierto).

Se delegó las funciones para ventanas al Se delegó las funciones para ventanas al sistema oerativo. Nació OpenGL.sistema oerativo. Nació OpenGL.

En 1993 surge Mesa, que es la versión En 1993 surge Mesa, que es la versión abierta y libre de OpenGL.abierta y libre de OpenGL.

Page 7: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

3. Características, 3. Características, alcances y alcances y

beneficios de beneficios de OpenGLOpenGL

Page 8: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

3.1 ¿Qué es 3.1 ¿Qué es OpenGL?OpenGL?

OpenGL es una especificación estándar que OpenGL es una especificación estándar que define un API para el desarrollo de define un API para el desarrollo de aplicaciones para generar gráficas 2D y 3D.aplicaciones para generar gráficas 2D y 3D.

Soporta:Soporta:Diferentes plataformas (Linux, Mac, Diferentes plataformas (Linux, Mac, Windows,etc.)Windows,etc.)

Diferentes lenguajes (C,C++,Pascal,Java,etc.)Diferentes lenguajes (C,C++,Pascal,Java,etc.)

Diferentes compiladoresDiferentes compiladores

Diferentes tipos de computadoras (PCs, Diferentes tipos de computadoras (PCs, PDAs, celulares,etc.)PDAs, celulares,etc.)

Consiste en bibliotecas de funciones.Consiste en bibliotecas de funciones.

Page 9: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

3.2 Beneficios de 3.2 Beneficios de OpenGLOpenGL

Permite la producción de código Permite la producción de código ejecutable independiente (pero requiere ejecutable independiente (pero requiere que exista soporte nativo para OpenGL, que exista soporte nativo para OpenGL, ya sea en hardware o software)ya sea en hardware o software)

Muy universalMuy universal

Soportado completamente por Soportado completamente por aceleradores gráficos.aceleradores gráficos.

Page 10: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

4. Arquitectura de 4. Arquitectura de bibliotecas de bibliotecas de

apoyo en OpenGLapoyo en OpenGLY otros elementos necesariosY otros elementos necesarios

Page 11: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

4.1 Componentes 4.1 Componentes adicionales a adicionales a

OpenGLOpenGLGLUGLUUtilerías diversas complementariasUtilerías diversas complementarias

Manejadores de ventanasManejadores de ventanasGLUTGLUT

GlutGlutOpenGlutOpenGlutFreeGlutFreeGlut

GLAUXGLAUX

Más elementos interactivosMás elementos interactivosGLUI: Botones, controles, barras, etc.GLUI: Botones, controles, barras, etc.OpenAU: Para manejo de sonidos.OpenAU: Para manejo de sonidos.

Combinación básica recomendada: OpenGL, GLU, GLUTCombinación básica recomendada: OpenGL, GLU, GLUT

Page 12: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

4.2 Herramientas 4.2 Herramientas del cursodel curso

Conocimientos previosConocimientos previos

CompiladorCompilador

BibliotecasBibliotecas

Computadora con WindowsComputadora con WindowsNo olvidar que OpenGL es abierto en el No olvidar que OpenGL es abierto en el sentido de que está disponible para sentido de que está disponible para muchas plataformas, y casi con el mismo muchas plataformas, y casi con el mismo código (aplican restricciones).código (aplican restricciones).

Page 13: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

4.3 Compilador 4.3 Compilador para este taller:para este taller:DevC++DevC++

Gratuito y abierto, aunque ya no se esté Gratuito y abierto, aunque ya no se esté actualizando.actualizando.

Fácil de instalar y usar (existe versión Fácil de instalar y usar (existe versión para usar en memoria USB).para usar en memoria USB).

Módulos fáciles de incorporar e incluyen Módulos fáciles de incorporar e incluyen plantillas.plantillas.

También existe para Linux, pero aún no También existe para Linux, pero aún no es muy confiable.es muy confiable.

Page 14: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

4.4 4.4 Conocimientos Conocimientos

previospreviosProgramación en lenguaje CProgramación en lenguaje COpenGL está disponible para casi OpenGL está disponible para casi cualquier lenguaje, pero nos basaremos cualquier lenguaje, pero nos basaremos en éste, por ser poderoso.en éste, por ser poderoso.

Geometría y trigonometríaGeometría y trigonometría

Imaginación espacialImaginación espacialParece broma, pero a mucha gente le Parece broma, pero a mucha gente le cuesta trabajo crear modelos 3D en su cuesta trabajo crear modelos 3D en su mente para luego implantarlos.mente para luego implantarlos.

Page 15: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

5. Estructura de un programa en OpenGL5. Estructura de un programa en OpenGL

Page 16: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

5.1 Estructura 5.1 Estructura para el S.O.para el S.O.

Se requiere una estructura muy Se requiere una estructura muy específica para interactuar con el específica para interactuar con el Sistema Operativo, ya que depende del Sistema Operativo, ya que depende del sistema de ventanas, entradas y salidassistema de ventanas, entradas y salidas

El Sistema Operativo debe informar al El Sistema Operativo debe informar al programa de eventos:programa de eventos:

Cambio de tamaño de la ventanaCambio de tamaño de la ventanaEs necesario redibujar la ventanaEs necesario redibujar la ventanaEl usuario hizo clickEl usuario hizo clickEl usuario movió el ratónEl usuario movió el ratónEtc.Etc.

Page 17: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

5.1 Estructura 5.1 Estructura generalgeneral

Función main:Función main:Inicializar ventanaInicializar ventana

Establecer modosEstablecer modos

Crear ventana(s)Crear ventana(s)

Establecer callbacks Establecer callbacks (mensajes del (mensajes del sistema)sistema)

Iniciar ciclo de Iniciar ciclo de operaciónoperación

Función display:Función display:Redibujar la escena Redibujar la escena cuando se requieracuando se requiera

Función reshape:Función reshape:Recalcular razón de Recalcular razón de aspecto (proporción aspecto (proporción ancho-alto)ancho-alto)

Recalcular Recalcular dimensionesdimensiones

Otras funciones en Otras funciones en respuesta a respuesta a callbackscallbacks

idleidle

keyboardkeyboard

mousemouse

Page 18: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

displaydisplaySe invoca cada vez que se necesita una Se invoca cada vez que se necesita una imagen frescaimagen fresca

glClearglClearBorrar pantallaBorrar pantalla

Código o funciones para dibujarCódigo o funciones para dibujar

glFlushglFlushProcesar gráficos pendientes y Procesar gráficos pendientes y mostrarlosmostrarlos

Page 19: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

reshapereshapeSe ejecuta cuando se crea una ventana Se ejecuta cuando se crea una ventana o cambia de tamañoo cambia de tamaño

Recibe como parámetros las Recibe como parámetros las dimensiones de la ventanadimensiones de la ventana

Define razón de aspecto y dimensionesDefine razón de aspecto y dimensiones

Page 20: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

5.2 ¡Un 5.2 ¡Un esqueleto!esqueleto!

Se les ha proporcionado un programa Se les ha proporcionado un programa OpenGL mínimo pero funcional para OpenGL mínimo pero funcional para empezar a experimentarempezar a experimentar

Page 21: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

6. Modelado 2D y 6. Modelado 2D y 3D3D

Se pueden realizar todo tipo de Se pueden realizar todo tipo de aplicacionesaplicaciones

Page 22: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

6.1 Modelado 2D6.1 Modelado 2DTodas las operaciones se hacen en 2 Todas las operaciones se hacen en 2 dimensionesdimensiones

En Reshape (preferentemente) se debe En Reshape (preferentemente) se debe especificar:especificar:

gluOrtho2D( izq, der, sup, inf )gluOrtho2D( izq, der, sup, inf )

Se utilizan funciones para 2DSe utilizan funciones para 2DDe ser necesario se pueden utilizar 3D, De ser necesario se pueden utilizar 3D, poniendo en 0 el valor para Z.poniendo en 0 el valor para Z.

Page 23: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

6.2 Modelado 3D6.2 Modelado 3DLas operaciones se realizan en 3 dimensionesLas operaciones se realizan en 3 dimensiones

En Reshape (preferentemente) se debe especificar:En Reshape (preferentemente) se debe especificar:gluPerspective( ángulo, aspecto, dist-min, dist-max )gluPerspective( ángulo, aspecto, dist-min, dist-max )

Angulo: Es el ángulo de visiónAngulo: Es el ángulo de visiónEntre más estrecho, abarca menos, pero todo Entre más estrecho, abarca menos, pero todo aparece más grandeaparece más grande

Razón de aspecto: Relación entre ancho y altoRazón de aspecto: Relación entre ancho y altoAspecto=1: cuadradoAspecto=1: cuadrado

Distancia mínima: Objetos más cercanos serán Distancia mínima: Objetos más cercanos serán ignoradosignorados

Distancia máxima: Objetos más lejanos serán Distancia máxima: Objetos más lejanos serán ignoradosignorados

Page 24: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

7. Primitivas7. PrimitivasAlgunos elementos básicos para dibujo Algunos elementos básicos para dibujo

básicobásico

Page 25: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

7.1 Colores 7.1 Colores planos (o hasta planos (o hasta

degradados)degradados)Para definir color (sin iluminación):Para definir color (sin iluminación):static GLfloatstatic GLfloat rojo[] = { 1.0, 0.0, rojo[] = { 1.0, 0.0, 0.0 };0.0 };

glColor3fv ( rojo );glColor3fv ( rojo );

glColor3f( 1.0, 1.0, 0.0 );glColor3f( 1.0, 1.0, 0.0 );

Page 26: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

7.2 Pa’l comienzo7.2 Pa’l comienzo

Page 27: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

7.3 Líneas7.3 LíneasglBegin( GL_LINES );glBegin( GL_LINES );

glVertex2i( 100, 100 );glVertex2i( 100, 100 );

glVertex2i( 100, 500 );glVertex2i( 100, 500 );

glVertex2i( 100, 100 );glVertex2i( 100, 100 );

glVertex2i( 500, 100 );glVertex2i( 500, 100 );

glEndglEnd

Otros tipos de líneas:Otros tipos de líneas:GL_LINE_STRIPGL_LINE_STRIPGL_LINE_LOOPGL_LINE_LOOP

Page 28: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

7.4 Polígonos 7.4 Polígonos rellenosrellenos

Estos son rellenadosEstos son rellenadosGL_POLYGONGL_POLYGON

GL_TRIANGLES (de 3 en 3 vértices)GL_TRIANGLES (de 3 en 3 vértices)

GL_TRIANGLE_STRIP (3 primeros, y luego GL_TRIANGLE_STRIP (3 primeros, y luego de 1 en 1)de 1 en 1)

GL_TRIANGLE_FAN (1 vértice central, y GL_TRIANGLE_FAN (1 vértice central, y luego de 1 en 1)luego de 1 en 1)

GL_QUADS (de 4 en 4)GL_QUADS (de 4 en 4)

GL_QUAD_STRIP (2 primeros, y luego de 2 GL_QUAD_STRIP (2 primeros, y luego de 2 en 2)en 2)

Page 29: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

8. 8. TransformacionesTransformacionesA ver, tíos, aquí la cosa se pone buena, A ver, tíos, aquí la cosa se pone buena,

pongan atenciónpongan atención

Page 30: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Transformaciones Transformaciones (cuidado!)(cuidado!)

Ocurren sobre una matriz de Ocurren sobre una matriz de transformacionestransformaciones

Siempre que se convierte algo de 2D a Siempre que se convierte algo de 2D a 2D y de 2D a 3D se requiere realizar 2D y de 2D a 3D se requiere realizar multiplicaciones de matricesmultiplicaciones de matrices

En OpenGL no se requiere programar En OpenGL no se requiere programar estas operaciones, pero se debe estas operaciones, pero se debe mantener un ojo en las mantener un ojo en las transformaciones realizadas (o se transformaciones realizadas (o se pierde uno)pierde uno)

Las transformaciones modifican las Las transformaciones modifican las matrices de transformacionesmatrices de transformaciones

Page 31: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

TransformacionesTransformacionesLa mejor manera de entenderlas es La mejor manera de entenderlas es imaginar que se está transformando a imaginar que se está transformando a un dibujanteun dibujante

Las transformaciones son acumulativasLas transformaciones son acumulativas

Para evitar acumulación (limpiar toda Para evitar acumulación (limpiar toda transformación), se usa transformación), se usa glLoadIdentity();glLoadIdentity();

Page 32: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

TraslaciónTraslaciónDespués de esta transformación, el Después de esta transformación, el origen para el dibujante se ha origen para el dibujante se ha desplazado.desplazado.

glTranslatef( 10.0, 5.0, 0.0 );glTranslatef( 10.0, 5.0, 0.0 );

Page 33: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

EscalamientoEscalamientoDespués de esta transformación, las Después de esta transformación, las dimensiones han cambiadodimensiones han cambiado

El dibujante se ha hecho más grande o El dibujante se ha hecho más grande o más pequeñomás pequeño

Este cambio puede ocurrir de manera Este cambio puede ocurrir de manera diferente en cada ejediferente en cada eje

El desplazamiento después del El desplazamiento después del escalamiento se verá afectado por la escalamiento se verá afectado por la nueva escalanueva escala

glScalef( 0.8, 1.2, 1.0 ); glScalef( 0.8, 1.2, 1.0 );

Page 34: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

RotaciónRotaciónDespués de esta transformación, la Después de esta transformación, la orientación ha cambiadoorientación ha cambiado

El dibujante ha girado en torno a uno o El dibujante ha girado en torno a uno o más ejesmás ejes

El desplazamiento después de la El desplazamiento después de la rotación se realizará de acuerdo a la rotación se realizará de acuerdo a la nueva orientaciónnueva orientación

glRotatef( 45.0, 0.0, 0.0, 1.0 );glRotatef( 45.0, 0.0, 0.0, 1.0 );

Page 35: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

9. Proyecciones9. ProyeccionesAdemás de movernos en la superficie o Además de movernos en la superficie o en el espacio, se necesita establecer en el espacio, se necesita establecer cómo mira la cámara (o el usuario) la cómo mira la cámara (o el usuario) la escena.escena.

Los elementos básicos ya los Los elementos básicos ya los mencionamos en el punto 6.mencionamos en el punto 6.

Las operaciones de proyección ocurren Las operaciones de proyección ocurren sobre la matriz de proyecciónsobre la matriz de proyección

Page 36: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

9.1 Resultado de 9.1 Resultado de la proyecciónla proyección

Es importante saber que el resultado de Es importante saber que el resultado de la proyección y las transformaciones es la proyección y las transformaciones es convertir coordenadas (2D y 3D) de convertir coordenadas (2D y 3D) de objetos, a coordenadas 2D de la objetos, a coordenadas 2D de la pantalla, pues ésta siempre es plana.pantalla, pues ésta siempre es plana.

Page 37: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

¡¡ Proyección ¡¡ Proyección 3D !!3D !!

Ya no es un simple lienzo para dibujar. Ya no es un simple lienzo para dibujar. Es necesario establecer:Es necesario establecer:

Modo de proyecciónModo de proyección

Ubicación del observadorUbicación del observador

Cada vértice es 3DCada vértice es 3D

Al colocar objetos en el espacio, es muy Al colocar objetos en el espacio, es muy fácil perderlos (que no aparezcan en la fácil perderlos (que no aparezcan en la ventana)ventana)

Page 38: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Proyección y Proyección y modelado 3Dmodelado 3D

Matriz de proyecciónMatriz de proyecciónglMatrixMode( GL_PROJECTION );glMatrixMode( GL_PROJECTION );gluPerspective( 90.0, (float)w/(float)h, 10.0, gluPerspective( 90.0, (float)w/(float)h, 10.0, 40.0 );40.0 );

Ángulo de apertura: 90ºÁngulo de apertura: 90ºRazón de aspecto: w/hRazón de aspecto: w/hLo más cercano visible: 10Lo más cercano visible: 10Lo más lejano visible: 40Lo más lejano visible: 40

ModeladoModeladoglMatrixMode( GL_MODELVIEW )glMatrixMode( GL_MODELVIEW )glTranslatef( 0.0, 0.0, -20.0 );glTranslatef( 0.0, 0.0, -20.0 );

Desplazo al dibujante hacia delante para que Desplazo al dibujante hacia delante para que yo vea lo que dibujayo vea lo que dibuja

Page 39: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Proyección 3DProyección 3D

Page 40: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

10. Búfer de 10. Búfer de profundidadprofundidad

En la vida real no vemos lo que se oculta.En la vida real no vemos lo que se oculta.

Page 41: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

10.1 Líneas y 10.1 Líneas y superficies superficies

ocultasocultasNormalmente, si no se considera la Normalmente, si no se considera la profundidad, lo último que se dibuja es lo profundidad, lo último que se dibuja es lo que se imponeque se impone

Es muy difícil organizar los objetos para Es muy difícil organizar los objetos para que se dibujen en orden inverso a la que se dibujen en orden inverso a la profundidadprofundidad

Se requiere guardar información sobre la Se requiere guardar información sobre la profundidad de cada pixel dibujado: búfer profundidad de cada pixel dibujado: búfer de profundidadde profundidad

Si un píxel nuevo es más profundo que otro Si un píxel nuevo es más profundo que otro anterior: no se poneanterior: no se pone

Si un píxel nuevo es más cercano que otro, Si un píxel nuevo es más cercano que otro, lo reemplaza (y se actualiza la profundidad)lo reemplaza (y se actualiza la profundidad)

Page 42: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

10.2 Búfer de 10.2 Búfer de profundidadprofundidad

Al inicializar el despliegue se debe indicar Al inicializar el despliegue se debe indicar la utilización del búfer:la utilización del búfer:

glutInitDisplayMode( GLUT_DEPTH | otros-glutInitDisplayMode( GLUT_DEPTH | otros-modos )modos )

Al borrar un lienzo, se debe borrar también Al borrar un lienzo, se debe borrar también el búfer de profundidad:el búfer de profundidad:

glClear( GL_COLOR_BUFFER_BIT | glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );GL_DEPTH_BUFFER_BIT );

Al dibujar, se debe habilitar la prueba de Al dibujar, se debe habilitar la prueba de profunidad:profunidad:

glDepthFunc(GL_LEQUAL);glDepthFunc(GL_LEQUAL);glEnable(GL_DEPTH_TEST);glEnable(GL_DEPTH_TEST);glClearDepth(1.0);glClearDepth(1.0);

Page 43: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Líneas y Líneas y superficies superficies

ocultasocultas

Page 44: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

11. Animación11. AnimaciónSi no se mueve, no parece vivoSi no se mueve, no parece vivo

Page 45: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

¡¡ Animación !!¡¡ Animación !!Requiere que el programa dibuje Requiere que el programa dibuje continuamente la escena, introduciendo continuamente la escena, introduciendo cambioscambios

Una función (idle) será invocada Una función (idle) será invocada continuamentecontinuamente

Esta función definirá los cambios e Esta función definirá los cambios e invocará el refresco de pantallainvocará el refresco de pantalla

main:main:gluIdleFunc( idle )gluIdleFunc( idle )

Page 46: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

AnimaciónAnimaciónSe deben usar variables globales para Se deben usar variables globales para mantener los estados de la animaciónmantener los estados de la animación

Se debe usar búfer doble:Se debe usar búfer doble:glutInitDisplayMode( GLUT_DOUBLE | glutInitDisplayMode( GLUT_DOUBLE | otros-modos );otros-modos );

Búfer doble: dibujar en un lienzo Búfer doble: dibujar en un lienzo mientras muestra el otromientras muestra el otro

Cambio de lienzo:Cambio de lienzo:glutSwapBuffers();glutSwapBuffers();

Page 47: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

12. Iluminación, 12. Iluminación, materiales y materiales y

vector normalvector normalQue se haga la luzQue se haga la luz

Page 48: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

IluminaciónIluminaciónSe debe establecer la ubicación de las Se debe establecer la ubicación de las fuentes de luzfuentes de luz

CoordenadasCoordenadas

Vector de dirección (distancia infinita)Vector de dirección (distancia infinita)

Cada píxel en cada línea o superficie Cada píxel en cada línea o superficie tiene un vector normal (perpendicular)tiene un vector normal (perpendicular)

El color de cada píxel se calcula de El color de cada píxel se calcula de acuerdo al color del material, la luz acuerdo al color del material, la luz ambiental y el ángulo de su normal con ambiental y el ángulo de su normal con respecto a cada fuente de luz.respecto a cada fuente de luz.

Page 49: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

IluminaciónIluminaciónHabilitar iluminación:Habilitar iluminación:

glEnable(GL_LIGHTING);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT0);

Establecer posición:Establecer posición:GLfloat light_position0[] = { 1.0, 1.0, 0.5, GLfloat light_position0[] = { 1.0, 1.0, 0.5, 0.0 };0.0 };glLightfv( GL_LIGHT0, GL_POSITION, glLightfv( GL_LIGHT0, GL_POSITION, light_position0 );light_position0 );

Establecer color de luzEstablecer color de luzglLightfv( GL_LIGHT0, GL_DIFFUSE, azul );glLightfv( GL_LIGHT0, GL_DIFFUSE, azul );glLightfv( GL_LIGHT0, GL_SPECULAR, azul glLightfv( GL_LIGHT0, GL_SPECULAR, azul ););

Page 50: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Tipos de fuentes Tipos de fuentes de luzde luz

Page 51: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

MaterialMaterialCada objeto dibujado está asociado a un Cada objeto dibujado está asociado a un material definido por sus modos de material definido por sus modos de iluminación:iluminación:

Color con luz ambientalColor con luz ambientalCuando no le incide la luz de alguna fuenteCuando no le incide la luz de alguna fuente

Color con luz difusaColor con luz difusaCuando le incide una luz de una fuenteCuando le incide una luz de una fuente

Color con luz especularColor con luz especularCuando el ángulo entre el observador y el Cuando el ángulo entre el observador y el píxel con el vector normal es el mismo que píxel con el vector normal es el mismo que entre el vector normal y la fuente, y están entre el vector normal y la fuente, y están en el mismo plano (¡como en espejo, en el mismo plano (¡como en espejo, vaya!)vaya!)

Page 52: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Material y luzMaterial y luz

Page 53: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

MaterialMaterialDefinir color de ambiente para objetoDefinir color de ambiente para objeto

glMaterialfv( GL_FRONT, GL_AMBIENT, glMaterialfv( GL_FRONT, GL_AMBIENT, gris1 );gris1 );

Definir color difuso de objetoDefinir color difuso de objetoglMaterialfv( GL_FRONT, GL_DIFFUSE, glMaterialfv( GL_FRONT, GL_DIFFUSE, gris1 );gris1 );

Definir brillo de objetoDefinir brillo de objetoglMaterialf( GL_FRONT, GL_SHININESS, glMaterialf( GL_FRONT, GL_SHININESS, 50.0 );50.0 );

Definir color especular de objetoDefinir color especular de objetoglMaterialfv( GL_FRONT, GL_SPECULAR, glMaterialfv( GL_FRONT, GL_SPECULAR, blanco );blanco );

Page 54: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Vector normalVector normalPara cada superficie o para cada vértice Para cada superficie o para cada vértice se debe especificar su vector normalse debe especificar su vector normal

Si es para un vértice, se especifica justo Si es para un vértice, se especifica justo antes.antes.

Si es para la superficie, se especifica Si es para la superficie, se especifica antes de los tres vértices que lo antes de los tres vértices que lo conforman.conforman.

Page 55: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Vector normalVector normalSi se usan primitivas de objetos 3D, los Si se usan primitivas de objetos 3D, los vectores normales ya están calculados.vectores normales ya están calculados.

Si uno traza polígonos, es necesario Si uno traza polígonos, es necesario definir el vector normal para cada definir el vector normal para cada superficie, o mejor aún: para cada superficie, o mejor aún: para cada vértice.vértice.

La magnitud del vector normal debe ser La magnitud del vector normal debe ser siempre 1.0.siempre 1.0.

Se puede habilitar la normalización Se puede habilitar la normalización automática, y así se garantiza que automática, y así se garantiza que siempre estarán normalizados.siempre estarán normalizados.

Page 56: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Vector normalVector normalSi se especifican diferentes normales Si se especifican diferentes normales para un polígono, el efecto de la luz se para un polígono, el efecto de la luz se interpola.interpola.

Page 57: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

13. Aplicaciones 13. Aplicaciones de textosde textos

Las imágenes son geniales, pero los Las imágenes son geniales, pero los textos también cuentantextos también cuentan

Page 58: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Técnicas para Técnicas para textostextos

Por vectoresPor vectoresEstán sujetos a las transformacionesEstán sujetos a las transformaciones

No se ven tan bienNo se ven tan bien

No maneja acentos, eñes ni otros No maneja acentos, eñes ni otros símbolossímbolos

Por mapa de bitsPor mapa de bitsSe ven mejorSe ven mejor

Tampoco aceptan caracteres latinosTampoco aceptan caracteres latinos

Page 59: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

14. Texturas14. TexturasSi lo pensamos bien, es como ponerle Si lo pensamos bien, es como ponerle

ropa a nuestras figurasropa a nuestras figuras

Page 60: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Texturas 2DTexturas 2DSe aplican imágenes sobre los objetos.Se aplican imágenes sobre los objetos.

Se debe establecer la correspondencia.Se debe establecer la correspondencia.

Page 61: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Texturas 3DTexturas 3DLa textura no es una imagen, sino La textura no es una imagen, sino imágenes por capasimágenes por capas

La figura 3D adopta la textura por La figura 3D adopta la textura por capas, de acuerdo al volumencapas, de acuerdo al volumen

Page 62: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

15. Técnicas 15. Técnicas avanzadas avanzadas

Para el que quiera, hay muchas más Para el que quiera, hay muchas más técnicastécnicas

Page 63: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

Qué técnicas Qué técnicas avanzadas hayavanzadas hay

Page 64: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

¿Qué sigue?¿Qué sigue?Se ha visto lo básico e incompletoSe ha visto lo básico e incompleto

Para continuar:Para continuar:Practicar lo ya vistoPracticar lo ya visto

Investigar qué más es básico y faltó por Investigar qué más es básico y faltó por cubrircubrir

Investigar técnicas más avanzadasInvestigar técnicas más avanzadas

Page 65: Curso de OpenGL Verano de 2012 40 hrs. de adrenalina 3D M.C. Luis A. Zarza López.

¡Gracias!¡Gracias!Luis Ansemo Zarza LópezLuis Ansemo Zarza López

[email protected]@mixteco.utm.mx

http://www.utm.mx/~zarzahttp://www.utm.mx/~zarza