Silhuetas e curvas características
IMPA - Instituto Nacional de Matemática Pura e Aplicada
Disciplina: Sistemas Gráficos 3D
Autor: Eric Jardim {ericjardim@gmail.com}
Professor: Luiz Velho
slides código-fonte
Introdução
A representação de figuras por linhas é um recurso comum utilizado
por artistas e ilustradores.
Com a escolha certa das linhas e suas características, é possível
representar praticamente qualquer figura, negligenciando alguns
aspectos secundários ao que se deseja expressar (textura,
iluminação, sombras, etc.)
Neste contexto, curvas de contorno e outras curvas características
representam um importante papel, sendo um ponto de encontro entre
técnicas de expressão e a geometria do que está sendo
representado.
Motivação
A compreensão destas curvas através da interpretação geométrica e o
estudo das técnicas para extração e utilização tem sido muito
pesquisado, em particular na área de Non-photorealistic Rendering
[2], [3]
Podemos dividir as aplicações em dois grupos, citando alguns
exemplos Artístico: estilos de linha, cartoon, animação
Ilustrativo: peças, plantas, mapas, ilustrações médicas
Definições
Silhueta: definição artística
A silhueta, na definição artística, é geralmente representada pelo
contorno de um objeto [2]. É comum encontrá-las como ilustrações em
preto e branco [a]
Também existem silhuetas em fotografia causadas por iluminação.
Este efeito é conseguido colocando o objeto entre uma forte fonte
de luz e o campo de visão.
Silhueta: definição matemática
Intuitivamente a silhueta é uma curva que delimita as partes
frontais das partes traseiras dum objeto. Na definição matemática,
a silhueta é caraterizada pelos pontos de uma superfície projetados
na imagem, onde o vetor de visão é paralelo ao plano tangente da
superfície. Para tal, assumimos que a superfície é localmente
diferenciável.
Notemos que esta definição é coerente com a artística, se
imaginarmos que no contorno dos objetos, qualquer caminho que cruze
uma silhueta, inverte o seu sentido frontal em relação ao
observador. Porém, esta definição abrange silhuetas interiores, não
visíveis no caso artístico.
Dado um ponto de uma superfície , para determinar um ponto de silhueta basta
calcular o ângulo formado pelo vetor de visão com o vetor normal . Lembremos que .
Curvas características
As silhuetas são muito importantes pois dão uma noção mínima de
contorno. Porém, há outros tipos de curvas características que pode
ser utilizadas para expressar a forma do objeto.
Bordos
São as extremidades dos objetos. Topologicamente, são regiões
localmente homeomorfas a semiplanos fechados.
Vincos
São pontos de mudança brusca na curvatura. Topologicamente, podem
ser consideradas as descontinuidades do tipo .
Outras
Linhas isoparamétricas, linhas de curvatura [3], contornos
sugestivos [4].
Métodos de extração de silhueta
Os métodos de extração de silhuetas podem ser classificados das
seguintes formas
Representação da superfície
Malha poligonal [1], [2], [3], Paramétrica (NURBS) [6] e Implícita
[5]
Detecção
Espaço da imagem [1], [7], Espaço do objeto [1], [2], [3], Híbrido
[8], [9]
Detecção no espaço da imagem
Pipeline
- Rasterização de mapas
- Aplicação de filtros
Mapas
- Depth map [12], [1]
- Normal map [12], [1]
- Derivadas de primeira e segunda ordem [7]
Filtros
- Sobel [7], [12]
- Variações [1]
Implementação
Mapa de profundidade: codificação da coordenada (monocromática)
Mapa de normais: codificação das coordenadas do vetor normal
O mapa de profundidade pode ser facilmente obtido via OpenGL. Para
obter o mapa de normais, utiliza-se luzes monocromáticas R, G, B
(intensidades positivas e negativas) nos eixos X, Y, Z (objeto
branco). É necesário mais de uma passada [1] para desenhar o fundo
branco e as silhuetas.
Resultados: espaço da imagem
Discussão: extração no espaço da imagem
- Mais rápidos (hardware dependant)
- Pixel-level (pode gerar artefatos)
- Mais fáceis de implementar
- Menos flexíveis
- Extrai apenas silhuetas visíveis
- Não permite estilização por curvas
- Propício para animação (baixo/nenhum pré-calculo)
Detecção no espaço do objeto
Curvas no universo de representação
As Silhuetas são dependentes do ponto de vista. Os Bordos e vincos
podem ser precalculados. A caracterização pode ser útil para a
estilização. Linhas diferentes podem ser traçada com estilos
diferentes.
Determinação das silhuetas
Podemos fazer algumas classificações
Abordagens
Força-bruta, Estruturas de dados (Edge buffer) [2], Agrupamento
(Anchored cones)[10], Dualidade [3], Teste probabilístico
(real-time) [11]
Detecção baseada
nas faces[1] ou nas arestas [2], [3], [10], [11]
Tipo de detecção
- Silhuetas detectada nas arestas contém erros de aproximação da
malha
- Silhuetas estimada nas faces podem aparecer em faces não
visíveis
Ambos os métodos podem ser melhorados com subdivisão [3], [2]
Implementação
Contrução da malha e pre-cálculos
- Malha poligonal:
- arestas
- normais (nas faces e nos vértices)
- adjacência: vértice-face, aresta-face
- limites
- Subdivisão espacial: kd-tree
- Segmentação das silhuetas: modificação do sweep-line
- Visibilidade:
- elege alguns segmentos dos pedaços para ray test
- busca na kd-tree
Estimando os pedaços de silhueta
Sejam as posições e dos vértices de um triângulo e e os vetores normais nos respectivos vértices. E
seja
o produto interno normalizado, com , então os triângulos onde existem
com sinais trocados, contém parte da uma curva
de silhueta. Supondo e , estimamos os pontos e sobre as arestas e respectivamente por
e ligamos estes pontos, formando uma curva de silhueta com as
outras faces adjacentes que contenham pedaços de silhuetas.
Subdivisão espacial: kd-tree
Subdivisão binária (BSP) paralela aos eixos
O recorte das faces (triângulos) é necessário pois em geral elas
não ficam inteiramente contidas em alguma célula.
Segmentação das silhuetas
A silhuetas mudam de visibilidade em pontos de auto-interseção ou
interseção com outras silhuetas.
Assim, é suficiente testar um segmento de uma parte conexas de
segmentos sem interseções. Para detectar as interseções, utilizamos
uma variação do algoritmo sweep-line. Outras propostas utilizando
subdivisão são possíveis como grades e quad-trees.
Ray tests e visibilidade
Busca na kd-tree
O teste de visibilidade deve considerar as faces adjacentes, pois a
face da que a silhuete pertence pode não ser visível.
A método utilizado nesta implementação, é verificar se o segmento
está contido em alguma face adjacente (inclusive a que foi atingida
pelo raio)
Resultados: extração no espaço do objeto
Discussão: espaço do objeto
- Mais flexíveis
- Vertex-level
- Mais difíceis e caros de implementar
- Excesso de pre-cálculo pode inviabilizar aplicações
- Extrai silhuetas não visíveis
- Permite estilização por curvas
Próximos passos
- Estruturar o código fonte como biblioteca
- Aprimorar o uso das técnicas (ex: melhor subdivisão)
- Utilizar mais hardware, mas de forma flexível
- Incluir o cálculo de outras curvas características (bordos,
vincos, direções principais, contornos sugestivos, novos tipos de
curvas)
- Estudar técnicas de ilustração (ex: hatching)
- Técnicas de shading não foto-realistas
Referências
[0] A. Gooch, B. Gooch, "Non-Photorealistic Rendering", 2001
[1] A. Hertzmann, "Introduction to 3D Non-Photorealistic Rendering:
Silhouettes and Outlines", Non-Photorealistic Rendering (SIGGRAPH
'99 course notes) http://www.dgp.toronto.edu/~hertzman/
[2] M. Sousa, K. Fostes, F. Samavati, B. Wyvill, "Polygonal
Silhouette Error Correction: A Reverse Subdivision Approach"
[3] A. Hertzmann, D. Zorin, "Illustrating smooth surfaces",
2000
[4] D. DeCarlo, A. Finkelstein, S. Rusinkiewicz, A. Santella,
"Suggestive Contours for Conveying Shape
[5] D. J. Bremer, J. F. Hughes, "Rapid Approximate Silhouette
Rendering of implicit surfaces"
[6] A. Gooch, "Interactive Non-photorealistic Technical
Illustration", Master Thesis, 1998
[7] T. Saito, T. Takahashi, "Comprehensible Rendering of 3-D
Shapes"
[8] T. Isenberg, N. Halper, T. Strothotte, Stylizing Silhouettes at
Interactive Rates: From Silhouette Edges to Silhouette
Strokes"
[9] J.D. Northrup, L. Markosian, "Artistic Silhouettes: A Hybrid
Approach (2000)"
[12] P. Decaudin, "Cartoon-Looking Rendering of 3D Scenes",
1996
[10] P. Sander, X. Gu, S. J. Gortler, H. Hoppe, J. Snyder,
"Silhouette Clipping"
[11] L. Markosian, M. A. Kowalski, S. J. Trychin, L. D. Bourdev, D.
Goldstein, J. F. Hughes, "Real-Time Nonphotorealistic
Rendering"
[12] G. Elber, E. Cohen, "Probabilistic Silhouette Based Importance
Toward Line-Art Non-Photorealistic Rendering"
[13] T. Foley, J. Sugerman, "KD-Tree Acceleration Structures for a
GPU Raytracer"
[14] D. Sunday, "The intersections for a set of 2D segments, and
testing simple polygons"
[a] http://www.petiteprints.com/images/Silhouette5x7.jpg
[b] Python: http://www.python.org
[c] Numpy e SciPy: http://www.scipy.org