Ray tracing com reflexão e aceleração do traçado de raios
usando grid e Bresenham's 3D
asdassdasdadasdasd
Trabalho do curso "Sistemas gráficos 3d"
aluno Alex Laier Bordignon
professor Luiz Velho
IMPA - 2007

introdução - descrição - algoritmo do ray trace - aceleração com grid - código fonte - exemplos

Introdução

Ray tracing é uma técnica de otica geométrica para modelar o caminho que a luz faz ao seguir raios de luz enquanto esses interagem com superfícies. Esse algoritmo é usado no desenvolvimento de sistemas oticos, como lentes de camera, microscópios, telescópios e binóculos. Mas o termo também é usado para descrever um algoritmo de desenho usado em computação gráfica, onde a modelagem matemática é usada para seguir o caminho que a luz faz ao atravessar um ambiente virtual. Esse método facilita o calculo de efeitos visuais avançados como simulação de reflexão e refração.

Descrição do algoritmo de ray tracing e de sua origem:

O que acontece na natureza:

Na natureza, uma fonte de luz emite um raio de luz que viaja e eventualmente é interrompido por uma superfície. É possível pensar nesse raio como uma seqüência de fótonsviajando por um mesmo caminho. No vácuo esse raio é uma linha reta, mas na realidade três coisas podem acontecer com esse raio: Absorção, reflexão e refração. Uma superfície pode refletir parte ou todo o raio em uma ou mais direções, pode ainda absorver parte do raio, resultando em perda de intensidade da luz refletida ou refratada. Se a superfície possui propriedades transparentes ou translucidas, e refrata uma porção da luz dentro de si numa diferente direção enquanto absorve alguma (ou toda) parte do espectro (possivelmente alterando a cor). Depois de refratadas, refletidas o raio continua seu trajeto e pode atingir novas superfícies que alteram as propriedades desse raio. Alguns desses raios podem viajar e atingir o nosso olho e permitindo-nos ver.

 Ray casting

O primeiro algoritmo de ray casting (contra rey tracing) usado para rendering foi apresentado por Arthur Appel em 1968. A idéia era lançar raios do olho, um por pixel , e encontrar o objeto mais próximo que bloqueia esse raio. Usando as propriedades do material do objeto é possível calcular a cor e uma intensidade luminosa.

O uso do ray casting na computação gráfica começou em Applications Group, Inc., (MAGI) of Elmsford, New York, New York. em 1966, e era usado para calcular testes de exposição de radiação para o departamento de defesa do USA. Alem do algoritmo de ray casting o MAGI era capaz de calcular refração. Com a direção do Dr. Philip Mittelman os cientistas desenvolveram o MAGI para ser capaz de calcular imagens.
Em 1972 o MAGI se tornou uma ferramenta commercial de animação. O MAGI foi intensamente utilizado para criar sequencias de animação para o filme TRON.

Ray tracing

Em 1979 Turner Whitted teve a idéia de continuar o traçado do raio, ou seja depois que o raio atinge uma superfície ele continua seu caminho que é desviado em seguida ele atinge outras superfícies e assim por diante. Raios refratados que viajam através de material transparente trabalham de forma similar. Também a adição de sombra ficou possível, pois toda vez a o raio atinge a superfície um “raio de sombra” é traçado para saber se aquele ponto da superfície é iluminado por alguma fonte de luz.

Vantagens do ray tracing

Luz realística
Reflexões e sombras são fáceis de simular
Relativamente simples de implementar

Desvantagens

Performance
Não é fotorealístico

Algoritmo geral do ray tracing

Para cada pixel na imagem {
  Crie um raio do ponto do olho passando pelo pixel
  Inicialize MAIS_PROXIMO para infinito e OBJETO_MAIS_PROXIMO para 0
  Para cada objeto na cena {
     Se o raio intersecta esse objeto {
        Se a distancia até essa interseção é menor que MAIS_PROXIMO {
            MAIS_PROXIMO <- distancia até essa interseção
           OBJETO_MAIS_PROXIMO <- identificador desse objeto         }      }
  }

  se OBJETO_MAIS_PROXIMO == 0 {
     Preencha esse pixel com a cor do fundo
  } Senão{
     Atire um raio para cada fonte de luz para checar por sombra           
     Se a superfície é reflectiva, gere o raio de reflexão: recursividade
     Se a superfície é transparente gere o raio refratado: recursividade
     Use OBJETO_MAIS_PROXIMO e MAIS_PROXIMO para calcular a função de o shading
     Preencha o pixel com a cor da função de o shading.
  }
}

Aceleração do calculo de interseção usando grid:

Nessa implementação foi usada uma tatica de grid para acelerar o calculo do traçado do raio. Cada objeto da cena possui um suporte, em preprocessamento fazemos a interseção do grid com cada objeto e marcamos nas celulas do grid ponteiro para os objetos. Para cada raio fazemos um Bresenham's 3D no grid e com isso eliminamos a maior parte dos objetos da cena.

 

Codigo fonte:

raytrace.h
raytrace.cpp

exempo de uso:

#include raytrace.h 
//iniciializa o raytrace
   raytrace myraytrace(100,100);
//adiciona algumas esferas 
   for (int i=0;i<40;++i) myraytrace.addsphere  (getrandom(0,10),
   getrandom(-60,60),getrandom(-60,60),getrandom(-60,60),
   getrandom(0,7));
//adiciona algums triangulos 
   for (int i=0;i<3140;++i) 
   { 
   float x=getrandom(-60,60);   float y=getrandom(-60,60);   float z=getrandom(-60,60);
   myraytrace.addtriangle(  x+getrandom(-5,5),y+getrandom(-5,5),z+getrandom(-5,5),
   x+getrandom(-5,5),y+getrandom(-5,5),z+getrandom(-5,5),
   x+getrandom(-5,5),y+getrandom(-5,5),z+getrandom(-5,5),
   getrandom(0,7) );
   }
   
//executa o tracado 
   myraytrace.calculateimage();}
   
//salva a imagem (não implementado)//
   save_to_file(myraytrace._data,100,100)
   }

Projeto completo (precisa de visual studio 8 e a biblioteca wxWidgets)

Alguns Resultados do algoritmo:

a

b