ine 5341

Programa

OpenGL

Trabalhos 2001

Trabalhos 2002

Links

Bibliografia

Plano de Ensino

Parte II - Computação Gráfica Avançada

Visualização Realística em 3D, zbuffering e Raytracing

O que é Raytracing ?

zBuffering

Conversão de Varredura (Scan Conversion)

Modelando a Iluminação de um Objeto

Principais Raytracers

Exercícios com Raytracing

Exemplos de Raytracing


Principais Raytracers

Neste capítulo vamos analisar três raytracers dentre os mais conhecidos. Escolhemos dois por serem típicos, de domínio público ou gratuitos e muito utilizados e um terceiro por ser um exemplo de desenvolvimento de raytracer com características especiais para um domínio de aplicação específico que ilustra bastante bem como podemos usar a filosofia geral de raytracing para o desenvolvimento de aplicativos específicos para  um conjunto de necessidades específicas. Os raytracers são:

POV-Ray

RADIANCE

Heidelberg Raytracer

POV-Ray


Persistence of Vision Raytracer (POV-Ray) é uma ferramenta de software livre para a criação de gráficos tridimensionais impressionantes (opinião dos autores). Envontra-se à disposição em versões oficiais para Windows, Mac OS/Mac OS X e Linux i86. Todo o código fonte está disponível para aqueles desejosos de realizar suas próprias implementações de variações ou portarem para outras plataformas. POV-Ray é talvez o mais popular e mais largamente utilizado raytracer, razão pela qual o utilizaremos para muitos exemplos no correr deste texto. Na figura abaixo vemos uma cena urbana em um dia de nevoeiro renderizada com POV-Ray.

O que é POV-Ray?

O Persistence of Vision Ray-Tracer(tm) foi desenvolvido a partir da ferramenta DKBTrace 2.12, originalmente escrita por David K. Buck e Aaron A. Collins, por um grupo de pessoas autodenominado the POV-Team em seu tempo livre. O site do POV-Team é www.povray.org

O pacote POV-Ray inclui instruções detalhadas na utilização do raytracer e na criação de cenas com a linguagem de definição de cenas definida para POV-Ray. Muitas cenas prontas foram incluídas no pacote, de forma que o aprendiz pode iniciar tomando o código pronto de uma cena e modificando-o. 

Além disso, uma biblioteca bastante extensa de formas e materiais também é provida com o pacote. Estas formas e materiais podem ser utilizados em uma cena que você está construindo simplesmente através da inclusão da biblioteca no topo do arquivo de definição de cena e da subseqüente utilização do nome do objeto no corpo do arquivo de cena. 

Como Funciona POV-Ray ?

Cenas em POV-Ray são descritas em uma linguagem de definição de dados denominada scene description language. Você simplesmente vai digitando comandos de definição de objetos e POV-Ray os interpreta e constrói a cena. O processo de instalação e execução de POV-Ray, por sua vez, é diferente para cada plataforma em que foi implementado. Os autores sufgerem que o interessado inicie tomando alguns dos arquivos fornecidos junto com a instalação de POV-Ray e os renderize,m tentando entendê-los e modificando-os aos poucos, antes de tentar criar suas próprias cenas a partir do zero. A sintaxe da linguagem de definição de cena é bastante simples, mas há muitos objetos e muitas possibilidades. Alguns exemplos da sintaxe são dados abaixo. 

Descrevendo um Objeto

Tomando-se um arquivo de descrição de cena básico, contendo as definições padrão de iluminação, cores e posicionamento de câmera, como o abaixo:
#include "colors.inc"
camera {
   location  <0.0, 0.0, -10.0>
   direction <0.0, 0.0,  1.0>
   up        <0.0, 1.0,  0.0>
   right     <4/3, 0.0,  0.0>
}
light_source { <10.0, 40.0, -30.0> colour White }
podemos então fazer aparecer uma bola amarela incluindo as seguintes linhas de código: 
  sphere {
    <0, 1, 2>, 3
    texture {
      pigment { color Yellow }
    }
  }
O primeiro vetor descreve a posição do centro da esfera, sendo que neste exemplo a coordenada x é zero, significando que a imagem estará centrada na imagem, y é 1, significando que estará levemente acima do centro e z é 2, significando que estará a duas unidades a frente de câmera, que está na posição z=-10. Após as coordenadas do centro se encontra uma vírgula e um valor escalar que indica o raio da esfera, que neste caso é 3.  A figura abaixo mostra a interface interativa do POV-Ray na versão Windows:



E, por fim, este código gera a imagem abaixo:

Uma cena bastante mais complexa, com um grande conjunto de texturas projetadas sobre esferas, pode ser vista no exemplo abaixo, também gerado com o POV-Ray. Observe a qualidade especular de algumas superfícies:

Mais exemplos de renderização de cenas realmente complexas com POV-Ray podem ser vistos na página de exemplos de renderização.



RADIANCE

RADIANCE é um sistema de software de raytracing altamente preciso para computadores UNIX. RADIANCE não é software livre, mas é licenciado gratuitamente para uso de pesquisa e não comerial. Para uso comercial é necessária a aquisição de uma licença. RADIANCE foi desenvolvido com suporte financeirto do Departamento de Energia dos Estados Unidos e do Governo Federal da Suíça. A propriedade intelectual do software encontra-se em mãos do Conselho Curador da Universidade da Califórnia. 

1. Descrição

RADIANCE  objetiva suportar iluminadores e arquitetos na predição dos níveis de iluminação e aparência de um espaço anteriormente à construção. O pacote inclui programas para a modelagem e compilação da geometria de uma cena, dados de luminárias e propriedades de materiais, todos entradas necessárias à simulação do ambiente. A simulção de iluminação em si utiliza técnicas de raytracing para o cálculo de valores de radiância, ou seja, da quantidade de luz passando por um determinado ponto em uma determinada direção, que são tipicamente arranjados para formar uma imagem de qualidade fotográfica. A imagem resultante pode ser analisada, visualizada, manipulada e exportada em vários formatos. 

A figura abaixo mostra a mesma simulação da sala de aula mostrada anteriormente mostrando as curvas de isoluminância, que indicam que áreas do ambiente possuem os mesmos níveis de iluminação.

2. Metodologia

A parte mais importante do pacote é o engine de simulação de iluminação, que calcula os níveis de luminosidade e renderiza as imagens. A entrada para esta simulação é uma descrição da geometria tridimensional das superfícies do ambiente, seus materiais e das fontes de luz da cena.  A renderização de uma cena adicionalmente exige que se informe o ponto de visada e a direção de projeção. 

Uma vez que uma geometria de uma cena foi definida, ela é compilada em uma Octree, a qual atua como uma estrutura de dados eficiente para o processo de traçado de raios, permitindo que se determine quais superfícies um raio intercepta. 

A simulação de ilumiação utiliza uma combinação de de métodos de Monte Carlo e raytracing determinístico para adquirir um resultado razoável em um tempo razoável. O método parte de um ponto de medição, usualmente o ponto de visada ou centro de projeção e traça os raios de volta às fontes de luz. O cálculo é dividido em três componentes: a componente direta, a componente especular indireta e a componente difusa indireta. 

A componente direta consiste da luz incidente sobre uma superfície diretamente da fonte de luz ou através da tranferência de uma ou mais superfícies perfeitamente especulares. Uma lista de emissores de luz é utilizada e ordenada com base na sua contribuição  potencial para minimizar o número de raios gerados para teste de visibilidade. Amostragem de Monte Carlo é combinada com a subdivisão de fontes de luz extensas para um cálculo apurado de áreas de penumbra. Transferências de luz especulares são manipuladas de forma eficiente transfomrando-se estas áreas refletoras em fontes de luz virtuais. 

A componente especular indireta consiste de luz incidindo sobre uma superfície a partir de outras superfícies sendo refletida de forma direcional. Transferências perfeitamente especulares são manipuladas através da redireção simples do raio refletido na direção adequada. Transferências especulares grosseiras são modeladas através da amostragem de Monte Carlo da direção transmitida ou refletida. 

A componente difusa indireta consiste de luz incidindo em uma superfície e sendo refletida ou retransmitida sem nenhuma preferência direcional. A natureza desta componente exige que centenas de direções sejam examinadas para que se possa realizar uma estimativa de Monte Carlo razoável. Por sorte, a componente difusa sofre muito poucas alterações ao longo de uma superfície, permitindo que se faça algumas amostragens a intervalos relativamente grandes e se interpole o restante. Esta é a premissa básica do método de "radiosidade". O método utilizado em RADIANCE utiliza restrições adicionais de gradiente para melhorar esta interpolação, exigindo porém que se utilize geometrias simples.

Além deste método de simulação básico descrito acima, fontes de luz secundárias como janelas, claraboias e outros podem ser levadas também em consideração. A distribuição da influência destas fontes é calculada em uma etapa de preprocessamento, o que grandemente incrementa a eficiência do processo como um todo. 
I
Nas figuras abaixo vemos mais duas cenas, a primeiar do cálculo de ilumiação para um ambiente provido de janela e outra mostrando a foto deste ambiente:



Heidelberg Raytracer

 
German Cancer Research Center Heidelberg
Department of Medical and Biological Informatics

H.P. Meinzer, A. Mayer, K. Meetz, U.Engelmann, M. Schäfer
 

Visualização de Volumes utilizando o Heidelberg Raytracing Model

O Modelo de Raytracing de  Heidelberg (HRM) é um método de visualização 3D que modela a interação da luz com objetos em conjuntos de dados médicos. É especialmente estruturado para as necessidades de visualização médica e é o único método de sua categoria que incorpora sombras, o que é crucial para a percepção de profundidade adequada das reconstruções resultantes. O HRM foi desenvolvido em meados da década de 1990 no Centro Alemão de Pesquisas do Câncer - DKFZ em conjunto com o Departamento de Informática Médica da Universidade de Heidelberg. 

O volume de imagem considerado é um volume de cortes tomográficos ou de ressonância magnética, onde cada pixel de um corte é tratado como um voxel deste volume, e pode ser observado por um observador a partir de diferentes ângulos. Os raios de luz são traçados através do volume e o resultado é projetado. Para tanto considera-se os voxels como possuindo diferentes graus de transparência, sendo a transparência daad pela densidade radiológica de um determinado voxel. A densidade radiológica, medida em unidades de Hounsfield (HU), é expressa na imagem por um tom de cinza, que quanto mais claro, maior é seu valor e portanto menor a sua transparência. Para realizar o efeito tridimensional, utiliza-se duas fontes de luz diferentes, as quais geram sombras e a impressão tridimensional. 

A Figura 2 ilustra o princípio do HRM. Com base em uma imagem de gradientes são detereminadas as bordas aproximadas dos objetos e um mapa de transparências é construído. Luz de duas fontes diferentes, a 0 e a  45 graus do observador é traçada sobre o plano de projeção levando em consideração tanto absorção como reflexão. 

Imagens codificadas a cores como a seqüência de teste da figura 3 podem ser geradas através da atribuição de valores de pseudocores a mapeamentos de densidade radiológica em imagens segmentadas. Isto pode ser relevante para ressaltar determinadas estruturas em medicina. 

O HRM e uma gama variada de algoritmos de segmentação foram paralelizados utilizando-se pacotes de paralelização padrão como PVM, MPI e Posix 1003.c pthreads. Isto garante a portabilidade do pacote para várias arquiteturas paralelas, sejam de memória compartilhada ou de memória distribuída. 

Alguns Exemplos do HRM