Primeiramente
serão apresentados os fundamentos teóricos e o trabalho
original que serviu como base para a implementação
do método de splatting utilizado.
Em seguida será descrita a forma obtenção
da malha que forma o modelo a ser visualizado.
Será, então, apresentado como foi
implementada a renderização do modelo original utilizando
o próprio pipeline do OpenGL.
Posteriormente será demonstrado como foram
gerados os splats, para, em seguida, ser apresentada
a metodologia utilizada na técnica de splatting,
para a renderização baseada em pontos.
FUNDAMENTOS
Em 1985, Marc Levoy e T. Whitted. [1], sugeriram
uma abordagem para a visualização de modelos 3D
através de uma visão que se baseava em pontos como
sua primitiva universal, ao invés do uso de outras primitivas
geométricas comumente utilizadas.
Muitos trabalhos sobre o tema vieram posteriormente, incluindo
a contribuição de Zwicker et al, com a apresentação
do conceito de Surfels [2], elementos de superfície que
aproximam a superfície do objeto modelado, com atributos
próprios e sem necessidade de informação
topológica associada.
Posteriormente Zwicker, apresentou a técnica de Surface
Splatting [3], utilizando um filtro EWA (Elliptical Wighted Avarage),
proposto no técnica de reamostragem de textura de Heckbert
[4], para a reamostragem dos valores para pixels na tela.
No Surface Splatting, splats são definidos
como pontos do modelo, com uma normal e um raio associados, onde
é aplicada uma função base Gaussiana radialmente
simétrica, que quando projetada no plano na tela resulta
em uma elipse. O objetivo da aplicação da função
base Gaussiana é representar a influência do ponto
conhecido ao longo da extensão do disco que representa
um splat. É realizado, então, o produto
de convolução entre a elipse obtida e um filtro
Gaussiano de passa-baixas, gerando o filtro de reamostragem, cujas
contribuições são acumuladas no espaço
de tela. Este filtro de reamostragem permite que pontos originados
pela função base, sejam amostrados para espaço
da tela, baseando-se na fundamentação teórica
da reconstrução de sinais, respeitando a freqüencia
de Nyquist, para garantir a reamostragem mínima sem a ocorrência
de perda de informação para a imagem final.
Jussi Räsänen, em sua tese de mestrado [5], revisou
a abordagem apresentada por Zwicker, e implementou algumas alterações
e melhorias, como a introdução de uma abordagem
estocástica para a amostragem além da abordagem
analítica inicialmente proposta, visando reduzir o tempo
de processamento necessário neste passo, e tendo como contrapartida
uma redução na qualidade do resultado final. Foi
também introduzida uma alternativa para o problema do threshold
definido pelo usuário e introduzido o uso de shading
por splat, ao invés da técnica de
deferred shading proposta originalmente.
O presente trabalho visa implementar a visualização
de modelos baseados pontos, mostrando passos intermediários
do processo, com o objetivo de ilustrar o conceito básico
aplicado, no caso o uso da técnica de Surface Splatting
proposta por Zwicker e revisada por Jussi Räsänen. Este
trabalho implementa, entretanto, a abordagem analítica
inicialmente proposta, no lugar nova abordagem estocástica
introduzida por Jussi Räsänen.
Detalhes das técnicas utilizadas serão
apresentados mais adiante.
OBTENÇÃO DO MODELO 3D
O modelo a ser visualizado pelo sistema deve
estar em arquivos de extensão lwo (LightWave 3D Object),
formato proprietário do software LightWave 3D, utilizado
em jogos e aplicações 3D diversas.
Para ser compreendido pelo sistema o arquivo
deve conter apenas malhas de triângulos, para representar
a superfície do objeto em questão.
O sistema pode ser chamado passando como parâmetro
o arquivo lwo desejado, porém, sempre são oferecidas
as opções de visualização dos dois
modelos disponibilizados junto como o sistema, a saber:
| sphere.lwo |
Modelo de uma espera, formada por 5.120 triângulos. |
| venus.lwo |
Modelo da Vênus, com um total de 90.688 triângulos. |
Como default é sempre lido o
modelo sphere.lwo.
RENDERIZAÇÃO UTILIZANDO
O PIPELINE DO OPENGL
Uma vez carregado o modelo, podemos utilizar
seus triângulos lidos para a geração da renderização
com o pipeline convencional do OpenGL.
As etapas de visualização que utilizam
o pipeline do OpenGL, incluem a renderização
inicial da malha de triângulos, a renderização
dos pontos referentes às posições dos splats,
a renderização dos pontos com as respectivas normais
desenhadas, o desenho dos discos como representação
dos splats em tamanho reduzido e o desenho dos círculos,
representando os splats em seu tamanho final.
Para todas as etapas descritas acima, foi utilzada
uma fonte de iluminação, com componentes difusa
e ambiente iguais e posicionadas sempre à frente do objeto
apresentado.
A malha, na primeira renderizção,
foi desenhada com a primitiva GL_TRIANGLES, e após visualizada
pode ser rotacionada para direita e esquerda, bem como aproximada
ou afastada, utilizando para isso as quatro teclas de direção,
no teclado.
GERAÇÃO DOS SPLATS
Após lida do arquivo e visualizada a malha
refente ao modelo original, passo 1 no sistema, vamos então
para o passo 2, onde são gerados os splats para
a malha em questão, que servirão de base para o
método de splatting, examinado em outro tópico.
Apesar de a geração dos splats,
com todas as suas propriedades, ser realizada em um único
momento, o sistema visualiza este processo graficamente em 3 etapas,
descritas a seguir:
PASSO 2a: São definidas
como posições para os splats, as posições
originais dos vértices que formam a malha de entrada. Estas
posições são visualizadas como pontos na
tela.
PASSO 2b: São definidas
como as normais dos splats, as normais dos dos vértices
da malha, sendo estas visualizadas como segmentos de reta na tela,
partindo dos pontos originais calculados.
PASSO 2c: São definidos
os tamanhos dos splats, calculando-se para isso a distância
máxima entre cada splat e seus vizinhos. O sistema
apresenta este dado em duas passagens. Primeiro mostra os splats
como discos com o tamanho de 1/3 do tamanho efetivamente calculado
para cada splat visando apresentar os splats sem intersecções
e seu comportamento na superfície. Em seguida os splats
são mostrados como círculos em seu tamanho final,
permitindo a visualização das sobreposições
e seu papel na cobertura da superfície a ser apresentada.
RENDERIZAÇÃO UTILIZANDO
O MÉTODO DE SPLATTING
Na implementação do método
de splatting, primeiramente é aplicado o back-face
culling, utilizado para descartar os splats cujas
faces não estão direcionadas para o observador.
Em seguida, a etapa de transformação
gera os splats nas coordenadas do objeto e, então,
efetua a transformação para coordenadas da câmera.
A transformação é feita de forma análoga
a que o próprio OpenGL utiliza, e não será
apresentada neste resumo teórico.
Logo em seguida é efetuado um frustum
culling, onde os splats que estão situados
fora do campos de visão do frustum são
eliminados. Para isso, cada plano, se voltado para o observador,
é validado em relação aos seis planos que
compõem o frustum, utilizando um algoritmo de
intersecção entre planos e cônicas.
Após o frustum culling, realizamos
o splat setup, gerando a matriz de mapeamento inverso
da tela para o plano de splats, calculando a aproximação
afim do mapeamento projetivo da Gaussiana, construindo o filtro
de reamostragem e calculando a interpolação de profundidades.
O próximo passo é processo de iluminação.
Apesar de Zwicker utilizar originalmente deferred shading,
em seu trabalho, Jussi Räsänen propôs a utilização
de uma abordagem de iluminação por splat,
que é potencialmente mais rápido que o deferred
shading, embora resultado possa parecer borrado, caso os
splats estejam grandes na imagem. A iluminação
é, então, seguida pela rasterização,
encerrando a primeira passada no método de splatting
analítico implementado.
A segunda passada é composta pela reconstrução
da superfície. Zwicker utiliza em seu algoritmo a abordagem
z-threshold para a reconstrução de superfície,
onde dois fragmentos são considerados pertencendo a mesma
superfície se eles estão mais próximos um
do outro do que uma constante previamente especificada.
Jussi Räsänen propõem, por sua
vez, a utilização da abordagem de comparação
de z-ranges, que foi utilizada na implementação
do sistema, onde são combinados fragmentos que pertencem
a splats que se sobrepõem. Esta abordagem evita
parâmetros definidos pelo desenvolvedor ou usuário.
Com a recostrução da superfície
é encerrado o algoritmo analítico de splatting
implementado neste trabalho, que compõe a última
etapa da visualização no sistema.
Abaixo apresento a seqüência de passos
utilizados na implementação da técnica de
Surface Splatting no sistema, com links para
o trecho correspondente no código fonte:
- São criados os splats em coordenadas do objeto
(implementação).
- São definidos os referentes à câmera e
iluminação (implementação).
- São calculadas as matrizes de transformação
necessárias ao processo (tela para objeto, objeto para
tela, câmera para objeto e objeto para câmera) (implementação).
- São calculados os planos de corte, baseados no frustum
defindo (implementação).
- Para cada splat é feito o back face culling
da seguinte forma:
O splat está voltado para a câmera se:
, onde é a normal do splat, sua posição
e a posição do observador. Caso o splat não
esteja voltado para a câmera é ignorado no processo
(implementação).
- É calculada a matriz cônica (implementação).
- Os vetores tangentes e o centro dos splats são
transformados para coordenadas de tela (implementação).
- É feito o viewport culling utilizando os planos
de corte calculados e os splats transformados (implementação).
- É calculada a matriz de transformação
do plano da tela para o plano do splat. Se a matriz
é singular o splat é descartado (implementação).
- É calculada a aproximação afim do mapeamento
projetivo da Gaussiana (implementação).
- É calculado o filtro de reamostragem (implementação).
- Calcula o zmin, zmax e o gradiente de profundidade (implementação).
- Calcula a iluminação difusa e especular de
cada splat (implementação).
- É efetuada a rasterização, acumulando
em um abuffer as contribuições ponderadas para
cada fragmento (implementação).
- É gerado o frame buffer a partir do conteúdo
do abuffer (implementação).
- É criada uma textura a partir do buffer gerado
(implementação).
- É desenhado um retângulo na área de visualização
(a partir de um triangle fan) mapeando nele a textura
gerada pelo processo de Surface Splatting (implementação).
BIBLIOGRAFIA
[1] M. Levoy e T. Whitted. The Use of Points
as Display Primitives. Technical Report TR 85-022, The University
of North Carolina at Chapel Hill, Department of Computer Science,
1985.
[2] Hanspeter Pfister, Matthias Zwicker, Jeroen van Baar, e Markus
Gross. Surfels: Surface Elements as Rendering Primitives. Em Computer
Graphics, SIGGRAPH 2000 Proceedings, páginas 335–342.
Los Angeles, CA, 2000.
[3] Matthias Zwicker, Hanspeter Pfister, Jeroen van Baar, e Markus
Gross. Surface splatting. Em Proceedings of ACM SIGGRAPH 2001,
Computer Graphics Proceedings, Annual Conference Series, pages
371–378. ACM Press / ACM SIGGRAPH, August 2001.
[4] P. Heckbert. Fundamentals of Texture Mapping and Image Warping.
Tese de Mestrado, University of California at Berkeley, Department
of Electrical Engineering and Computer Science, 1989.
[5] Jussi Räsänen. Surface Splatting: Theory, Extensions
and Implementation. Tese de Mestrado, Helsinki University of Technology,
Department of Computer Science, 2002.
Próximo: [Resultados]
[topo]
|