Tema 1: Modelado poligonal

Anuncio
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
Descargar