Zakładmy, że wektor normalny $\mathbf{\vec N}$, padający $\mathbf{\vec i}$ jak i załamany $\mathbf{\vec t}$ są znormalizowane.
Ponieważ wektory $\mathbf{\vec i}$ i $\mathbf{\vec t}$ są znormalizowane to:
$\left | \vec{i_2} \right | = \sin \alpha \qquad\qquad
\left | \vec{i_1} \right | = \cos \alpha \qquad\qquad
\left | \vec{t_2} \right | = \sin \beta \qquad\qquad
\left | \vec{t_1} \right | = \cos \beta$
Z rzutów wektorów $\mathbf{\vec i}$ i $\mathbf{\vec t}$ na $\mathbf{\vec N}$:\left | \vec{i_1} \right | = \cos \alpha \qquad\qquad
\left | \vec{t_2} \right | = \sin \beta \qquad\qquad
\left | \vec{t_1} \right | = \cos \beta$
$\vec i \vec N = -\cos \alpha \qquad\qquad
\vec t \vec N = -\cos \beta$
Znając długości wektorów $\mathbf{\left | \vec{i_1} \right |}$ i $\mathbf{\left | \vec{t_1} \right |}$ i ich zwrot możemy zapisać:\vec t \vec N = -\cos \beta$
$\vec{i_1} = -\vec N \cos \alpha \qquad\qquad
\vec{t_1} = -\vec N \cos \beta$
Z prawa Snelliusa:\vec{t_1} = -\vec N \cos \beta$
$n_1 \sin \alpha = n_2 \sin \beta$
$n_1 \left | \vec{i_2} \right |= n_2 \left | \vec{t_2} \right |$
Ponieważ wektory $\mathbf{\vec{i_2}}$ i $\mathbf{\vec{t_2}}$ mają zgodny zwrot i kierunek:$n_1 \left | \vec{i_2} \right |= n_2 \left | \vec{t_2} \right |$
$n_1 \vec{i_2} = n_2 \vec{t_2}$
$n_1 ( \vec i - \vec i_1 ) = n_2 \vec{t_2}$
$n_1 ( \vec i + \vec N \cos \alpha ) = n_2 \vec{t_2}$
$\vec{t_2} = \displaystyle\frac{n_1}{n_2}(\vec i + \vec N \cos \alpha)$
Teraz wyznaczmy $\mathbf{\vec{t_1}}$:$n_1 ( \vec i - \vec i_1 ) = n_2 \vec{t_2}$
$n_1 ( \vec i + \vec N \cos \alpha ) = n_2 \vec{t_2}$
$\vec{t_2} = \displaystyle\frac{n_1}{n_2}(\vec i + \vec N \cos \alpha)$
$\begin{split}\vec{t_1} &= -\vec N \cos \beta \\
&= -\vec N \left | \vec t_1 \right | \\
&= -\vec N \sqrt{1-\left | \vec t_2 \right |^2} \\
&= -\vec N \sqrt{1-\sin^2 \beta} \\
&= -\vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 \sin^2 \alpha} \\
&= -\vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )}
\end{split}$
Mając $\mathbf{\vec{t_1}}$ i $\mathbf{\vec{t_2}}$:&= -\vec N \left | \vec t_1 \right | \\
&= -\vec N \sqrt{1-\left | \vec t_2 \right |^2} \\
&= -\vec N \sqrt{1-\sin^2 \beta} \\
&= -\vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 \sin^2 \alpha} \\
&= -\vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )}
\end{split}$
$\begin{split}\vec t &= \vec{t_1} + \vec{t_2} \\
&= \displaystyle\frac{n_1}{n_2}(\vec i + \vec N \cos \alpha) - \vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )} \\
&= \displaystyle\frac{n_1}{n_2}\vec i + \vec N ( \displaystyle\frac{n_1}{n_2} \cos \alpha - \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )})
\end{split}$
Otrzymany wektor $\mathbf{\vec{t}}$ jest znormalizowany. &= \displaystyle\frac{n_1}{n_2}(\vec i + \vec N \cos \alpha) - \vec N \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )} \\
&= \displaystyle\frac{n_1}{n_2}\vec i + \vec N ( \displaystyle\frac{n_1}{n_2} \cos \alpha - \sqrt{1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha )})
\end{split}$
Promień padający po w kierunku normalnej nie zostanie załamany.
Jeśli $\mathbf{n_1 < n_2}$ wraz ze zwiększaniem kąta $\mathbf{\alpha}$ kąt $\mathbf{\beta}$ będzie się zwiekszał, ale wolniej. Jak $\mathbf{\alpha}$ będzie dążył do $90^\circ$ to $\mathbf{\beta}$ będzie dążył do $arcsin\frac{n_1}{n_2}$, kąta mniejszego od $90^\circ$. Jeśli $\mathbf{n_2 < n_1}$ wraz ze zwiększaniem kąta $\mathbf{\alpha}$ kąt $\mathbf{\beta}$ będzie się zwiększał, ale szybciej. Kąt $\mathbf{\beta}$ zmienia się zgodnie z $arcsin(\frac{n_1}{n_2}\sin\alpha$). Dla pewnego granicznego kąta $\mathbf{\alpha}$ wartość z której liczymy arcsin będzie większa niż jeden. Nastąpi to dla kąta granicznego $arcsin\frac{n_2}{n_1}$. Po przekroczeniu tego kąta promień załamany zanika i następuje całkowite wewnętrzne odbicie.
W naszym równaniu na wektor promienia załamanego zjawisko całkowitego wewnętrznego odbicia następuje jeśli:
$1- \displaystyle\frac{n_1}{n_2}^2 ( 1 - \cos^2 \alpha ) < 0$
W odniesieniu do raytracing'u należy jeszcze uwzględnić jak zmienia się energia promienia odbitego i załamanego. Po pierwsze zakładamy, że istnieje współczynnik pochłaniania energii promienia odbitego i załamanego. Samo podział energii (a także polaryzacji) dla dielektryków definiuje równanie Fresnel'a. Sam promień przechodząc przez medium powinien tracić energię (Prawo Beer'a albo współczynniki pochłaniania liniowego i wykładniczego).
W niektórych mediach współczynnik załamania może się zmieniać w sposób nieliniowy w danym materiale i tak też będzie poruszać się promień światła w materiale.
Przykład implementacji w C#:
public Ray RefractedRay { get { Debug.Assert(Exists); if (m_refracted_ray == null) { double n = RefractionIndiceN1 / RefractionIndiceN2; double cos_alpha = -SourceRay.Dir * ShadeNormal; double cos_beta_2 = 1 - n * n * (1 - cos_alpha * cos_alpha); if (cos_beta_2 > 0) { Scene.Statistics.RaysRefracted++; Scene.Statistics.RaysCreated++; m_refracted_ray = new Ray() { Dir = n * SourceRay.Dir + (n * cos_alpha - Math.Sqrt(cos_beta_2)) * ShadeNormal, SourceIntersection = this, Start = Pos, Depth = SourceRay.Depth + 1, }; } else { Scene.Statistics.TotalInternalReflections++; } } return m_refracted_ray; } }
Brak komentarzy:
Prześlij komentarz