Loading [MathJax]/jax/output/HTML-CSS/jax.js

2011-07-04

Prawo odbicia

Promień światła o kierunku RIN pada na powierzchnię w punkcie o normalnej N odbija się w kierunku ROUT. Kąt padania względem N jest równy kątowi odbicia względem N.

Zakładamy, że wektor N jest znormalizowany.
image/svg+xml Master slide R R d d R N N OUT IN
Rzut wektora RIN na N:

RN=(RINN)N(1)

Wektor d możemy wyliczyć na dwa sposoby:

d=RN+RIN
d=ROUTRN

Z porównania:

RN+RIN=ROUTRN

Stąd:

ROUT=2RN+RIN

Podstawiając RN z (1) otrzymujemy:

ROUT=2(RINN)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.

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ń