Zakładamy, że wektor $\mathbf{\vec{N}}$ jest znormalizowany.
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}$
$\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.
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ń