Trabalho 2 - Traçado de Raios
O objetivo deste trabalho era implementar a renderização de uma cena utilizando algorítmo de Traçado de Raios. As cenas utilizadas estão descritas em arquivos no formato texto. A cena contém informações como: Objetos, suas posições, tamanho, tipo de material e luzes do ambiente.
Por problemas com o tempo, a implementação se restringiu ao elemento esfera e à luz ambiente com componentes difusa e especular.
Traçado de Raios - O algorítmo
A suposição natural é a de que os raios de luz partem de uma fonte, em direção aos nossos olhos. Mas como saber quais raios vêm para onde enxergamos? Tratar o problema por esta perspectiva exigiria um esforço incalculável. O algoritmo de traçado de raios consiste em projetar os raios na direção oposta do que seria o natural.
O algorítmo básico de RayTracing realiza o seguinte procedimento: Projeta um raio para cada pixel da cena; Para cada raio, é verificado quais objetos da cena o interseptam. Essa verificação é feita em cima da primitiva onde o objeto está definido, como caixa, esfera, plano, reta ou triângulo. Se o raio não intersectou nenhum objeto da cena, atribui-se ao pixel a cor de fundo. Se intersectar algun(s), verifica-se qual é o objeto mais próximo, definindo assim, que este é o visível. Levando em conta que os objetos da cena possuem coeficientes de reflexão, devemos adotar uma reflexão recursiva, chamando novamente o calculo da cor para o raio refletido.
O cálculo a cor de cada pixel é dado pelo modelo de reflexão de superfícies Lambertianas, onde a intensidade é proporcional ao cosseno do ângulo incidente com a normal do ponto na superfície. Com isso, as componentes da cor do pixel são dadas por:
A componente especular é proporcional ao cosseno do angulo entre o raio refletido e o raio da câmera.
Mais um detalhe a ser observado é que quando um objeto é atingido por um raio, neste ponto testamos um raio em direção à fonte de luz. Se houver algum outro objeto interseptando esse caminho de volta, temos que este ponto é sombra e não seguimos com o cáculo da cor do pixel.
Arquitetura
Além da MainWindow, a aplicação é composta pelas classes: TxtSceneFileLoader, que carrega o arquivo da cena; Vector3D, que implemeta um vetor na terceira dimensão, bem como os métodos de manipulação; Ray, para simular um raio e contém unicamente um Vector3D startPoint e um Vector3D direction; Object e Sphere, onde a segunda herda da primeira e implementa o método computeIntersection para calcular a sua interseção com um raio dado. E finalmente a classe Scene, que contém o método render e outros métodos internos, para realizar o algoritmo do RayTracing.