Modelagem Geométrica
Leandro Tonietto
Computação Gráfica
Desenvolvimento Jogos e Entretenimento Digital
[email protected]
http://professor.unisinos.br/ltonietto/jed/cgr/modelGeom.pdf
ago-11
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
Sumário
Introdução
Modelagem
Representação
Polígonos
Exercício
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
2
Introdução
Modelagem:
Descrição de objetos do mundo real
Representação de objetos através de modelos:
Descreve propriedades e implementa regras que representam
um objeto real.
Por exemplo, podemos descrever objetos com atributos, como:
altura, volume, largura, tipo de superfície, ... ou com pontos
que dão a sua forma.
Faz uso de métodos matemáticos para descrição e
representação.
Objetos não reais também podem ser modelados. A
realidade do modelo pode ser fictícia.
Modelar = descrever
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
3
Introdução
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
Como devo modelar? Descrever um objeto com
todas propriedades e detalhes mínimos? Ou usar
uma representação mais simples e funcional?
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Objeto pode ser descrito de diversas formas.
Como devo modelar? Descrever um objeto com
todas propriedades e detalhes mínimos? Ou usar
uma representação mais simples e funcional?
O que e como depende de cada situação.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
4
Introdução
Aspectos a serem considerados quando da escolha
da descrição de um modelo:
Facilidade: para transformar a forma em polígonos.
Não se pode descrever matematicamente qualquer forma
como uma primitiva, mas podemos simplificá-la para um
conjunto de polígonos bem “comportados”.
Tamanho: o bastante para reproduzir o modelo.
Complexidade: gerado manualmente ou
proceduralmente
Interação: permitir alterações e animação
Matemática: representação e uso de ferramentas
matemáticas
Precisão: o quão preciso um modelo deve ser.
Lembre-se: o ótimo é inimigo do bom!!
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
5
Introdução
Aplicações X nível de detalhe:
CAD: precisão matemática
Jogos: precisão visual
Representação em níveis de detalhamento.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
6
Introdução
gCAD3D
Medal Of Honor
Neverwinter Nights
Modelo do Fiat 500
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
7
Introdução
Superfícies X volume
Interessa apenas a superfícies dos objetos
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
8
Introdução
Superfícies X volume
Informações sobre o interior dos objetos
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
9
Modelagem
Como se modela:
Representação poligonal
Curvas e superfícies
Sólidos
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
10
Curvas
Pontos de controle e comprimento
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
11
Superfícies
Área
Apenas uma casca,
ocas
Abertas ou fechadas
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
12
Sólidos
Além das propriedades da casca, o interior
também interessa
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
13
Representação
Formas de representação de objetos:
Funções paramétricas
Pode gerar todos os pontos de um objeto
(sin Ø cos Θ, sin Θ sin Ø, cos Ø)
Definição implícita
Determina se um ponto pertence ou não a um
objeto
x2 + y2 + z2 - 1 = 0
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
14
Representação
É possível ter mais de um tipo de representação
para um objeto:
Exemplo: círculo centrado na origem com raio=1
x2 + y2 = 1 (implícita)
x(Θ)=cos(Θ) e y(Θ)=sin(Θ)(paramétrica)
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
15
Representação
Outra forma de representação dos objetos é
através de pontos (vértices) e faces (um
arranjo de vértices).
Não precisão matemática das representações
paramétrica e implícita, mas tem a facilidade
da modelagem “manual”.
Apenas uma aproximação do modelo real.
Consome mais memória, mas exige menos
processamento para renderização de objetos.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
16
Polígonos
Uso de polígonos para modelar objetos do mundo
real:
Tudo pode ser transformado num polígono (ou quase
tudo)
Podemos renderizar polígonos rapidamente
Várias operações são fáceis de fazer em polígonos
Memória e disco são relativamente baratos
Polígonos são simples
Uma malha de polígonos
representa a superfície de
um objeto.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
17
Polígonos
Desvantagens ou problemas
São apenas aproximações das superfícies
Mas podem ser tão detalhados quanto necessário
Normais são apenas aproximadas dentro da face.
Ao transformarmos em polígonos perdemos informação e não
há meios de reconstruir a informações original depois
amostrados os polígonos.
A maioria das superfícies reais são curvas (especialmente
estruturas naturais), o que torna a representação aproximada
mais difícil e dispendiciosa.
Falta de estruturação
Alguns cálculos geométricos podem ser altamente
complexos. Exemplo: cálculo de intersecção.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
18
Polígonos
Malha Convexa/Côncava
Se convexo, várias operações são mais simples: Clipping,
preenchimento, intersecção, detecção de colisão, rendering,
cálculo do volume, etc.
Fechada/Aberta
Malhas fechadas são chamadas de “watertight”
Simples
Faces se encontram apenas nas arestas e vértices
Lados se encontram apenas nos vértices
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
19
Polígonos
Estrutura de dados:
Três componentes
Vértices
Conectividade – quais vértices fazem quais faces
Dados associados: normais, texturas, equação do
plano, etc.
Associados ou ao vértice ou à face, podemos ter
informações nos dois níveis inclusive.
Normalmente, a informação a nível de face é um valor
médio dos seus vértices.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
20
Polígonos
Vários modelos são apenas lista de polígonos
struct Vertex {
float coords[3];
}
struct Triangle {
struct Vertex verts[3];
}
struct Triangle mesh[n];
glBegin(GL_TRIANGLES)
for ( i = 0 ; i < n ; i++ ){
glVertex3fv(mesh[i].verts[0]);
glVertex3fv(mesh[i].verts[1]);
glVertex3fv(mesh[i].verts[2]);
}
glEnd();
Atenção: Em OpenGL a ordem
dos vértices é importante. O
default é na direção contrária
aos ponteiros do relógio. No
quê isto pode impactar?
Triângulos são compostos por
3 vértices e malha é composta
por n triângulos. Acesso direto
aos vértices dentro do
triângulo.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
21
Polígonos
Lista de polígonos:
Vantagens:
Simples de ler, gravar, transmitir, desenhar e etc.
Saída comum dos CADs
Formato similar ao desenho na OpenGL
Desvantagens (informação):
Não faz referência aos vizinhos
Não indica se o objeto é aberto/fechado
Sem informações sobre polígono degenerados.
Custo de memória, devido a duplicação de vértices e
informações relativas a estes.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
22
Polígonos
Acesso indireto:
Não gerar vértices novos para cada polígono, porque:
Wastes memory - each vertex repeated many times
Difícil de encontrar polígonos vizinhos
Difícil de verificar se os polígonos se interseccionam
Solução: acesso indireto
Colocar todos os vértices em uma lista
Cada face armazena os índices dos seus vértices
v0
v4
v1
v2
faces
vértices
v0
0
0
2
1
v1
1
v2 v3
4
1
2
v4
3
1
3
v3
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
23
4
Polígonos
Vantagem:
Fácil de obter informação de conectividade da
superfície
Economiza em armazenamento
O índice pode ter apenas 4 bytes; um vértice 3D tem, em
geral, 12 bytes.
Cada vértice é usado pelo menos 3 vezes (e, em média 4-6
vezes), mas é armazenado apenas uma vez
Normais, coordenadas de textura, cores, etc., podem
ser armazenados da mesma forma
Desvantagens:
Conectividade não é explícita
Acesso ao cache não é otimizado
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
24
Polígonos
OpenGL e Acesso indireto:
struct Vertex {
float coords[3];
}
struct Triangle {
GLuint verts[3];
}
struct Mesh {
struct Vertex vertices[m];
struct Triangle triangles[n];
}
Triângulos são compostos por
3 ponteiros para vértices e
malha é composta por m
vértices e n triângulos. Acesso
indireto aos vértices dentro do
triângulo.
glBegin(GL_TRIANGLES)
for para todos os triangulos
for para todos os vertices
int vi = mesh.triangles[i].verts[j]
glVertex3v(mesh.vertecies[vi]);
glEnd();
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
25
Polígonos
OpenGL e acesso indireto (v1):
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex),
mesh.vertices);
glBegin(GL_TRIANGLES)
for (int i = 0 ; i < n ; i++ ) {
glArrayElement(mesh.triangles[i].verts[0]);
glArrayElement(mesh.triangles[i].verts[1]);
glArrayElement(mesh.triangles[i].verts[2]);
}
glEnd();
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
26
Polígonos
OpenGL e acesso indireto (v2):
glEnableClientState(GL_VERTEX_ARRAY)
glVertexPointer(3, GL_FLOAT, sizeof(struct Vertex),
mesh.vertices);
for (int i = 0 ; i < n ; i++ )
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT,
mesh.triangles[i].verts);
Porém, exige correspondência
entre vértices, normais e
mapeamento de texturas.
Menos chamadas de funções
Em geral é mais rápido
Another variant restricts the range of indices that can be used –
even faster because vertices may be cached
Can even interleave arrays to pack more data in
a smaller space
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
27
Conectividade
Informação de polígonos vizinhos é importante
para vários algoritmos
Cada face armazena ponteiros para seus vizinhos
Ou pode-se gerar uma lista de conectividades,
mapeando cada aresta com os seus polígonos.
Conectividade ajuda em:
Detecção de Colisão
Simplificação de malhas
Subdivisão de superfícies
Recortar e extrair partes do modelo
Etc.
A informação pode ser extraída e armazenada
para futuro uso
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
28
Normais
Normais indicam o formato da superfície
Normais por face:
Uma normal por face
“Flat shading”, toda a face tem a mesma cor de
preenchimento, portanto, sem considerar as variações de
iluminação por região da face.
Normais por vértice:
Uma normal por vértice
“smooth shading”, pontos intermediários são interpolados
pelos pontos dos vértices.
Podemos armazenar vetores de normais (similar a vetores de
vértices)
Índices de vértices e normais podem ser armazenados
separadamente.
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
29
Exemplo de objeto – Cubo
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
30
Calculando os Vetores Normais
Vários modelos não tem normais
Ex.: laser scan
Normais por face são fáceis de calcular:
Produto vetorial de dois vetores normalizados
posicionados nas arestas
Normais por vértice:
Calcular normais das faces
Calcular a médias das faces que cada vértice compõe
(um exemplo de uso da informação de conectividade)
Podemos calcular uma média ponderada considerando a área
dos polígonos
Podemos definir ângulo máximo para considerar a face na
média – evitando suavizar cantos
Não considerar a normal da face na média se o ângulo
entre duas faces é maior do que um ângulo
pré-definido (threshold).
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
31
Definindo a estrutura de dados
Cores, coordenadas de texturas, weights,
etc., podem ser tratados como vértices ou
normais
Coeficientes de iluminação podem ser
definidos por face ou por objeto (raramente
por vértice)
A Idéia é definir subestruturas:
Faces são partes de grupos/objetos
Vértices são parte de faces
...
Slide da apresentação do prof. Christian Hofsetz
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
32
Definindo a estrutura de dados
Diagrama:
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
33
Exercício prático
Implementar as classes do modelo conforme
especificado no slide anterior.
Implementar um programa que renderize objetos a
partir de sua malha poligonal. Esta malha foi
preenchida (vértices, grupos e faces) manualmente,
portanto, o aluno deve especificar dentro do programa
a composição da malha. Não deve carregar de arquivo.
Exemplos de objetos para serem modelados e
desenhados:
Paralelepípedo
Esfera
Toróide
Pirâmide
Ou qualquer objeto aproximado por polígonos.
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
34
Tarefa de programação
Implementar um leitor de arquivo no
formato OBJ (que tem a descrição de
objetos como uma malha poligonal com
vértices, normais, textura e faces).
Copiar arquivos OBJ de exemplo com o
professor.
Armazenar as informações lidas em
estruturas de dados conforme vimos
durante a aula.
Plotar polígonos no OpenGL
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
35
Referências bibliográficas
AGOSTON, Max K. Computer Graphics and Geometric
Modeling: Implementation and Algorithms. Springer.
2005.
WRIGHT Jr., Richard S.; LIPCHAK, Benjamin; HAEMEL,
Nicholas. OpenGL Superbible: Comprehensive Tutorial
and Reference. 4ed.: Addison-Wesley. 2007.
Stephen Chenney: http://www.cs.wisc.edu/~schenney/
courses/cs559-s2002/
Slides sobre CG dos professores: Christian Hofsetz,
Cristiano Franco, Marcelo Walter e Soraia Musse.
Especificação do formato Wavefront OBJ:
http://www.martinreddy.net/gfx/3d/OBJ.spec
02-Mar-11
quarta-feira, 8 de agosto de 12
Leandro Tonietto
36
Download

Modelagem geométrica