2011-07-19

Prawo załamania

Mając dany wektor promienia padający na granice dwóch ośrodków $\mathbf{\vec i}$, współczynniki załamania obu ośrodków $\mathbf{n_1}$ i $\mathbf{n_2}$, normalną w punkcie padania $\mathbf{\vec N}$ wyznaczymy wektor załamany $\mathbf{\vec t}$.

Zakładmy, że wektor normalny $\mathbf{\vec N}$, padający $\mathbf{\vec i}$ jak i załamany $\mathbf{\vec t}$ są znormalizowane.


  
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
  
  
  
    
      
        image/svg+xml
        
        
      
    
  
  
    
    
    
    
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
      
      
    
    
    α
    β
    
    
    
      
        t
        1
      
      
    
    
      t
      
    
    
      i
      1
      
    
    
      
        N
      
      
    
    
      
        t
        2
      
      
    
    
      2
      
        i
        
      
    
    
      i
      
    
    
      n
      1
    
    
      n
      2
    
  


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}$:

$\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{i_1} = -\vec N \cos \alpha \qquad\qquad
\vec{t_1} = -\vec N \cos \beta$
Z prawa Snelliusa:

$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 \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}}$:

$\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}}$:

$\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.

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