Pular para o conteúdo

Fundamentos do Ray Tracing & Modelo Phong (Raytracer3D.cs)

O Ray Tracing (Traçado de Raios) é o método de renderização que simula com maior fidelidade o comportamento físico da luz no mundo real.

O arquivo Raytracer3D.cs implementa um Whitted Ray Tracer recursivo.


1. Por que Traçamos Raios “da Câmera para o Mundo”?

Seção intitulada “1. Por que Traçamos Raios “da Câmera para o Mundo”?”

Na vida real, uma lâmpada emite bilhões de raios de luz em todas as direções, mas quase todos se perdem e não chegam nos seus olhos.

Se o computador simulasse a luz saindo da lâmpada, passaria 99.9% do tempo calculando raios invisíveis. Por isso, o Ray Tracer faz o caminho inverso: dispara uma linha de visão reta a partir do olho do observador através de cada pixel da tela:

graph LR
Camera["Camera e Olho"] -->|1. Raio Primario| Pixel["Pixel da Tela"]
Pixel --> HitPoint["Ponto de Impacto na Esfera"]
HitPoint -->|2. Raio de Sombra| Light["Fonte de Luz"]
HitPoint -->|3. Raio Refletido| Mirror["Espelho e Reflexo"]

Um raio é uma semirreta definida por uma Origem O⃗\vec{O} e uma Direção unitária D⃗\vec{D}:

r⃗(t)=O⃗+t⋅D⃗,t>0\vec{r}(t) = \vec{O} + t \cdot \vec{D}, \quad t > 0

Para saber se um ponto na superfície de uma esfera está iluminado ou na sombra:

  1. Disparamos um raio do ponto de impacto em direção à lâmpada.
  2. Se houver algum objeto no meio do caminho, o ponto está na sombra.
  3. Se o caminho estiver livre, somamos a luz direta.

Itotal=Iaka⏟Luz Ambiente+Idkd(N⃗⋅L⃗)⏟Reflexa˜o Difusa+Isks(R⃗⋅V⃗)α⏟Brilho EspecularI_{\text{total}} = \underbrace{I_a k_a}_{\text{Luz Ambiente}} + \underbrace{I_d k_d (\vec{N} \cdot \vec{L})}_{\text{Reflexão Difusa}} + \underbrace{I_s k_s (\vec{R} \cdot \vec{V})^\alpha}_{\text{Brilho Especular}}

Próximo Passo: Veja como calcular analiticamente a Interseção Raio-Esfera e Raio-Plano.