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

Mapas

Filtros



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



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


 

Ambos os métodos podem ser melhorados com subdivisão [3], [2]

Implementação

Contrução da malha e pre-cálculos

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



Próximos passos



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