


introdução - descrição - algoritmo do ray trace - aceleração com grid - código fonte - exemplos
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.
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.

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.
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.

Luz realística
Reflexões e sombras são fáceis de simular
Relativamente simples de implementar
Performance
Não é fotorealístico
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.
}
}
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.

#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)


