Zakładamy, że wektor →N jest znormalizowany.
Rzut wektora →RIN na →N:
→RN=−(→RIN⋅→N)∗→N(1)
Wektor →d możemy wyliczyć na dwa sposoby:
→d=→RN+→RIN
→d=→ROUT−→RN
→d=→ROUT−→RN
Z porównania:
→RN+→RIN=→ROUT−→RN
Stąd:
→ROUT=2∗→RN+→RIN
Podstawiając →RN z (1) otrzymujemy:
→ROUT=−2∗(→RIN⋅→N)∗→N+→RIN
Jeśli dodatkowo wektor →RIN jest znormalizowany to wtedy wektor →ROUT też jest znormalizowany:
|→ROUT|2=|→RN|2+|→d|2=|→RIN|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ń