Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Tema 1: Modelado poligonal José Ribelles SIU020 Informática Gráfica y Animación Departamento de Lenguajes y Sistemas Informáticos, Universitat Jaume I Tema 1: Modelado poligonal 1 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL Introducción Tema 1: Modelado poligonal 2 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Introducción Modelado poligonal Se denomina modelo al conjunto de datos que describe a un objeto y que puede ser utilizado por un sistema gráfico para ser visualizado. Modelado poligonal es cuando se utilizan polı́gonos para describir la geometrı́a. El triángulo es la primitiva más utilizada. Introducción Tema 1: Modelado poligonal 3 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Introducción Ventajas Exactitud visual. Velocidad. Introducción Tema 1: Modelado poligonal 4 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Introducción Conceptos Teselado: proceso de división de un polı́gono en polı́gonos más pequeños. Triangulación: proceso de división de un polı́gono de n lados en triángulos (caso particular de teselado). Consolidación: conjunto de operaciones útiles para almacenamiento y dibujado del modelo. Optimización: proceso por el que se agrupan u ordenan los datos con el fin de dibujarse de manera más rápida. Simplificación: proceso por el que se elimina información que bajo algún criterio resulte innecesaria o insignificante. Introducción Tema 1: Modelado poligonal 5 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL Orı́genes de información poligonal Tema 1: Modelado poligonal 6 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Orı́genes de información poligonal Posibles fuentes Describir la geometrı́a a mano. Modelado procedural: programas que generan la geometrı́a. Transformar datos de modelos de superficies o volumétricos. Programas de modelado. Muestreo de un modelo real, digitalizador 3D. Fotogrametrı́a: reconstrucción 3D a partir de imágenes. Escaner 3D. Orı́genes de información poligonal Tema 1: Modelado poligonal 7 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación Caras independientes Vértices compartidos Tiras y abanicos de triángulos 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL Representación Tema 1: Modelado poligonal 8 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Mallas de triángulos Una malla representa una superficie donde vértices y aristas se comparten. La mayor parte de los modelos lo forman mallas de triángulos. Representación Tema 1: Modelado poligonal 9 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Mallas de triángulos Es importante representarlos de manera eficiente para: Reducir el espacio de almacenamiento. Reducir el consumo de ancho de banda. Reducir el tiempo de dibujado. Tipos de representación: Caras independientes. Vértices compartidos. Tiras y abanicos de triángulos. Representación Tema 1: Modelado poligonal 10 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Caras independientes (x3, y3, z3) Cada cara almacena sus vértices. { F3 F1 F0 struct triangulo (x0, y0, z0) (x5, y5, z5) (x4, y4, z4) F2 (x1, y1, z1) (x2, y2, z2) vector3 coordenadas [ 3 ] ; } Triangulos [ nTriangulos ] ; Triangulos[] = { { x0, y0, z0, x1, y1, z1, x3, y3, z3 }, { x1, y1, z1, x4, y4, z4, x3, y3, z3 }, { x1, y1, z1, x2, y2, z2, x4, y4, z4 }, { x2, y2, z2, x5, y5, z5, x4, y4, z4 } } Representación Tema 1: Modelado poligonal 11 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Vértices compartidos Cada cara almacena ı́ndices a una lista de vértices. (x3, y3, z3) F3 F1 F0 struct vertice (x5, y5, z5) (x4, y4, z4) F2 { f l o a t coordenadas [ 3 ] ; (x0, y0, z0) (x1, y1, z1) (x2, y2, z2) } Vertices [ nVertices ] ; struct triangulo { unsigned i n t i n d i c e s [ 3 ] ; } Triangulos [ nTriangulos ] ; Representación Vertices[] = { {x0, y0, z0}, {x1, y1, z1}, {x2, y2, z2}, {x3, y3, z3}, {x4, y4, z4}, {x5, y5, z5} } Tema 1: Modelado poligonal Triangulos[] = { { 0, 1, 3 }, { 1, 4, 3 }, { 1, 2, 4 }, { 2, 5, 4 } } 12 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Tiras y abanicos de triángulos Incremento de prestaciones al enviar grupos de triángulos que comparten vértices, ¿por qué se produce?, ¿se produce siempre?, ¿qué podemos concluir? v3 v3 v0 v0 v4 v1 v4 v1 v5 v2 TiraTriangulos[] = { 0, 3, 1, 4, 2, 5 } v5 v2 AbanicoTriangulos[] = { 1, 0, 3, 4, 5, 2 } Representación Tema 1: Modelado poligonal 13 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL La Normal Tema 1: Modelado poligonal 14 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL La Normal Es habitual que para cada vértice se almacenen atributos como el color, la normal o las coordenadas de textura. Estos atributos se interpolan a través de cada triángulo para definir una función continua sobre el total de la superficie de la malla. Y son necesarios para mejorar significativamente la calidad visual. La Normal Tema 1: Modelado poligonal 15 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL La Normal Uno de los atributos más importantes es la Normal. La normal es un vector perpendicular a la superficie en un punto, ¿cómo obtenerla? Ya que el producto vectorial no es commutativo, hay que establecer un orden y obtener todas las normales de manera consistente. La Normal Tema 1: Modelado poligonal 16 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL Consolidación Tema 1: Modelado poligonal 17 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Consolidación Operaciones habituales Merging: transformar polı́gonos que están almacenados como separados en una malla poligonal, ¿por qué? ¿cómo? Orientación: hacer que las caras estén todas definidas en el mismo sentido, ¿por qué? ¿cómo? Solidez: averiguar si solo un lado de la malla es visible, ¿por qué? ¿cómo? Normales: calcular las normales en cada vértice, ¿por qué? ¿cómo? ¿y qué ocurre en los pliegues? Consolidación Tema 1: Modelado poligonal 18 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Ejercicio Describe un modelo poligonal de un Cubo de lado 1 centrado en el origen de coordenadas. Dibújalo en papel. Obten la lista de vértices y la de triángulos. Ten cuidado y define todas sus caras en el mismo orden. ¿Cuántos vértices te salen? Añade ahora las normales para cada vértice. ¿Tienes el mismo número de vértices? Consolidación Tema 1: Modelado poligonal 19 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Hoy veremos... 1 Introducción 2 Orı́genes de información poligonal 3 Representación 4 La Normal 5 Consolidación 6 Polı́gonos y OpenGL Primitivas geométricas Modelado Visualización Polı́gonos y OpenGL Tema 1: Modelado poligonal 20 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Primitivas geométricas OpenGL no proporciona mecanismos para describir o modelar objetos geométricos complejos, sino que proporciona mecanismos para especificar cómo dichos objetos deben ser dibujados. El punto, el segmento de lı́nea y el triángulo. Cada primitiva se define especificando sus respectivos vértices. Dibujo de puntos: gl.POINTS Dibujo de lı́neas: Segmentos sueltos: gl.LINES Secuencia o tira de segmentos: gl.LINE STRIP Secuencia cerrada de segmentos: gl.LINE LOOP Triángulos Triángulos sueltos: gl.TRIANGLES Tira de triángulos: gl.TRIANGLE STRIP Abanico de triángulos: gl.TRIANGLE FAN Las primitivas geométricas se forman agrupando vértices, y estas se agrupan a su vez para definir objetos de mayor complejidad. Polı́gonos y OpenGL Tema 1: Modelado poligonal 21 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Modelado Solemos asociar el concepto de vértice con las coordenadas. El concepto de vértice es más general entendiéndose como una agrupación de datos llamados atributos. Los atributos más utilizados son la posición, la normal y el color. El programador puede incluir como atributo cualquier información. Como OpenGL requiere que la información que vaya a visualizarse se disponga en vectores... struct vertice { GLfloat coordenadas [ 3 ] ; GLfloat color [ 3 ] ; } Vertices [ nVertices ] ; struct triangulo { GLuint i n d i c e s [ 3 ] ; } Triangulos [ nTriangulos ] ; Polı́gonos y OpenGL Tema 1: Modelado poligonal 22 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Visualización Tres pasos previos: 1 2 3 Almacenar el modelo poligonal en buffer objects. Obtener los ı́ndices de las variables del Shader que representan los atributos de los vértices. Especificar para cada atributo dónde y cómo se encuentran almacenados ası́ como habilitar los vectores correspondientes. Dibujar indicando tipo de primitiva y número de elementos. Listado 1: Paso 1 idVerticesBuffer = gl . createBuffer () ; g l . b i n d B u f f e r ( g l . ARRAY BUFFER , i d V e r t i c e s B u f f e r ) ; g l . b u f f e r D a t a ( g l . ARRAY BUFFER , new F l o a t 3 2 A r r a y ( V e r t i c e s ) , g l . STATIC DRAW) ; idIndicesBuffer = gl . createBuffer () ; g l . b i n d B u f f e r ( g l . ELEMENT ARRAY BUFFER , i d I n d i c e s B u f f e r ) ; g l . b u f f e r D a t a ( g l . ELEMENT ARRAY BUFFER , new U i n t 1 6 A r r a y ( T r i a n g u l o s ) , g l . STATIC DRAW) ; Polı́gonos y OpenGL Tema 1: Modelado poligonal 23 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Visualización Listado 2: Paso 2 <s c r i p t i d=” v e r t e x S h a d e r S o u r c e ” t y p e=” x−s h a d e r / x−v e r t e x ”> attribute attribute vec3 p o s i c i o n ; vec3 c o l o r ; varying vec4 n ue v o Co l o r ; v o i d main ( ) { nuevoC ol o r = vec4 ( c o l o r , 1 . 0 ) ; g l P o s i t i o n = vec4 ( p o s i c i o n , 1 . 0 ) ; } </s c r i p t > <s c r i p t i d=” f r a g m e n t S h a d e r S o u r c e ” t y p e=” x−s h a d e r / x−f r a g m e n t ”> p r e c i s i o n mediump f l o a t ; varying vec4 nuevoColor ; v o i d main ( v o i d ) { gl FragColor = nuevoColor ; } </s c r i p t > . . . // c o m p i l a y e n l a z a e l S h a d e r v e r t e x P o s i t i o n A t t r i b u t e = g l . g e t A t t r i b L o c a t i o n ( program , ” p o s i c i o n ” ) ; vertexColorAttribute = g l . g e t A t t r i b L o c a t i o n ( program , ” c o l o r ” ) ; Polı́gonos y OpenGL Tema 1: Modelado poligonal 24 Introducción Orı́genes de información poligonal Representación La Normal Consolidación Polı́gonos y OpenGL Visualización Listado 3: Paso 3 y dibujado g l . b i n d B u f f e r ( g l . ARRAY BUFFER , i d V e r t i c e s B u f f e r ) ; g l . v e r t e x A t t r i b P o i n t e r ( v e r t e x P o s i t i o n A t t r i b u t e , 3 , g l . FLOAT , f a l s e , 2∗3∗4 , 0 ) ; gl . vertexAttribPointer ( vertexColorAttribute , 3 , g l . FLOAT , f a l s e , 2∗3∗4 , 3∗4) ; gl . enableVertexAttribArray ( vertexPositionAttribute ) ; gl . enableVertexAttribArray ( vertexColorAttribute ) ; g l . b i n d B u f f e r ( g l . ELEMENT ARRAY BUFFER , i d I n d i c e s B u f f e r ) ; g l . d r a w E l e m e n t s ( g l . TRIANGLES , n T r i a n g u l o s ∗3 , g l . UNSIGNED SHORT , 0 ) ; Polı́gonos y OpenGL Tema 1: Modelado poligonal 25