2011-07-04

Prawo odbicia

Promień światła o kierunku $\mathbf{\vec{R}_{IN}}$ pada na powierzchnię w punkcie o normalnej $\mathbf{\vec{N}}$ odbija się w kierunku $\mathbf{\vec{R}_{OUT}}$. Kąt padania względem $\mathbf{\vec{N}}$ jest równy kątowi odbicia względem $\mathbf{\vec{N}}$.

Zakładamy, że wektor $\mathbf{\vec{N}}$ jest znormalizowany.
image/svg+xml Master slide R R d d R N N OUT IN
Rzut wektora $\mathbf{\vec{R}_{IN}}$ na $\mathbf{\vec{N}}$:

$\vec{R}_{N}=-(\vec{R}_{IN}\cdot\vec{N})*\vec{N}$(1)

Wektor $\mathbf{\vec{d}}$ możemy wyliczyć na dwa sposoby:

$\vec{d}=\vec{R}_{N}+\vec{R}_{IN}$
$\vec{d}=\vec{R}_{OUT}-\vec{R}_{N}$

Z porównania:

$\vec{R}_{N}+\vec{R}_{IN}=\vec{R}_{OUT}-\vec{R}_{N}$

Stąd:

$\vec{R}_{OUT}=2*\vec{R}_{N}+\vec{R}_{IN}$

Podstawiając $\mathbf{\vec{R}_{N}}$ z (1) otrzymujemy:

$\vec{R}_{OUT}=-2*(\vec{R}_{IN}\cdot\vec{N})*\vec{N}+\vec{R}_{IN}$

Jeśli dodatkowo wektor $\mathbf{\vec{R}_{IN}}$ jest znormalizowany to wtedy wektor $\mathbf{\vec{R}_{OUT}}$ też jest znormalizowany:

$\left|\vec{R}_{OUT}\right|^2=\left|\vec{R}_{N}\right|^2+\left|\vec{d}\right|^2=\left|\vec{R}_{IN}\right|^2=1$

Przykład:

Vector3 reflected_dir = 
    Ray.Dir - ShadeNormal * (2 * ShadeNormal * Ray.Dir);

Wektory ShadeNormal i Ray.Dir sa znormalizowane.

1 komentarz:

  1. Witam, czy ta implementacja Ci działa? Ja mam dokładnie taką samą i niestety wychodzą błędne wyniki np. przy zmianie położenia ShadeNormal. Dobre wyniki otrzymuje jedynie przy pionowym ułożeniu powierzchni.

    OdpowiedzUsuń