光线折射公式推导:Snell’s Law
设 入射光 i \mathbf{i} i 和 折射光 t \mathbf{t} t 均为单位向量,由Snell’s law可知 η i sin θ i = η t sin θ t \eta_i \sin \theta_i = \eta_t \sin \theta_t ηisinθi=ηtsinθt 。
其中 η i , η t \eta_i,\eta_t ηi,ηt 为反射系数(typically air = 1.0, glass = 1.3–1.7, diamond = 2.4)。
因为
sin
θ
i
=
∣
i
∥
∣
∣
i
∣
,
sin
θ
t
=
∣
t
∥
∣
∣
t
∣
\sin\theta_i=\cfrac{|\mathbf{i}_{\parallel}|}{|\mathbf{i}|},\ \sin\theta_t=\cfrac{|\mathbf{t}_{\parallel}|}{|\mathbf{t}|}
sinθi=∣i∣∣i∥∣, sinθt=∣t∣∣t∥∣ ,故:
η
i
∣
i
∥
∣
∣
i
∣
=
η
t
∣
t
∥
∣
∣
t
∣
η
i
∣
i
∥
∣
=
η
t
∣
t
∥
∣
\begin{matrix} \eta_i \cfrac{|\mathbf{i}_{\parallel}|}{|\mathbf{i}|} = \eta_t \cfrac{|\mathbf{t}_{\parallel}|}{|\mathbf{t}|} \\ \eta_i |\mathbf{i}_{\parallel}| = \eta_t |\mathbf{t}_{\parallel}| \\ \end{matrix}
ηi∣i∣∣i∥∣=ηt∣t∣∣t∥∣ηi∣i∥∣=ηt∣t∥∣
又因
i
\mathbf{i}
i 和
t
\mathbf{t}
t 平行且方向相同:
η
i
⋅
i
∥
=
η
t
⋅
t
∥
t
∥
=
η
i
η
t
⋅
i
∥
=
η
i
η
t
(
i
+
cos
θ
i
⋅
n
)
\begin{matrix} \eta_i \cdot \mathbf{i}_{\parallel} &=& \eta_t \cdot \mathbf{t}_{\parallel}& \\ \mathbf{t}_{\parallel} &=& \cfrac{\eta_i}{\eta_t} \cdot \mathbf{i}_{\parallel} \\ &=& \cfrac{\eta_i}{\eta_t} (\mathbf{i}+\cos \theta_i\cdot \mathbf{n} ) \end{matrix}
ηi⋅i∥t∥===ηt⋅t∥ηtηi⋅i∥ηtηi(i+cosθi⋅n)
其中
i
∥
=
i
⋅
n
∣
i
∣
∣
n
∣
n
=
cos
θ
i
⋅
n
\mathbf{i}_{\parallel}=\cfrac{\mathbf{i}\cdot \mathbf{n}}{|\mathbf{i}| |\mathbf{n}|}\mathbf{n}=\cos \theta_i \cdot \mathbf{n}
i∥=∣i∣∣n∣i⋅nn=cosθi⋅n.
又因
t
=
t
⊥
+
t
∥
\mathbf{t}=\mathbf{t}_{\perp}+\mathbf{t}_{\parallel}
t=t⊥+t∥ 且
∣
t
∣
2
=
∣
t
⊥
∣
2
+
∣
t
∥
∣
2
|\mathbf{t}|^2=|\mathbf{t}_{\perp}|^2 + |\mathbf{t}_{\parallel}|^2
∣t∣2=∣t⊥∣2+∣t∥∣2 :
∣
t
⊥
∣
2
=
∣
t
∣
2
−
∣
t
∥
∣
2
∣
t
⊥
∣
=
1
−
∣
t
∥
∣
2
t
⊥
=
−
1
−
∣
t
∥
∣
2
⋅
n
\begin{matrix} |\mathbf{t}_{\perp}|^2 &=& |\mathbf{t}|^2-|\mathbf{t}_{\parallel}|^2 \\ |\mathbf{t}_{\perp}| &=& \sqrt {1-|\mathbf{t}_{\parallel}|^2} \\ \mathbf{t}_{\perp} &=& -\sqrt {1-|\mathbf{t}_{\parallel}|^2}\cdot \mathbf{n} \\ \end{matrix}
∣t⊥∣2∣t⊥∣t⊥===∣t∣2−∣t∥∣21−∣t∥∣2−1−∣t∥∣2⋅n
从而:
t
=
t
∥
+
t
⊥
\mathbf{t}=\mathbf{t}_{\parallel}+\mathbf{t}_{\perp}
t=t∥+t⊥
// r_in 为射入物体的光线
vec3 refract(const vec3& r_in, const vec3& outward_normal, double etai_over_etat) {
double cos_thetai = dot(-r_in, outward_normal);
vec3 r_out_parallel = etai_over_etat * (r_in + cos_thetai * outward_normal);
vec3 r_out_perp = -sqrt(1.0 - r_out_parallel.length_squared()) * outward_normal;
return r_out_perp + r_out_parallel;
}
也可进一步化简:
t
=
t
∥
+
t
⊥
=
η
i
η
t
⋅
(
i
+
cos
θ
i
⋅
n
)
−
1
−
∣
i
∥
∣
2
⋅
n
=
η
i
η
t
⋅
(
i
+
cos
θ
i
⋅
n
)
−
1
−
sin
2
θ
t
⋅
n
=
η
i
η
t
⋅
i
+
(
η
i
η
t
cos
θ
i
−
1
−
sin
2
θ
t
)
⋅
n
\begin{matrix} \mathbf{t} &=&\mathbf{t}_{\parallel}+\mathbf{t}_{\perp} \\ &=&\cfrac{\eta_i}{\eta_t} \cdot (\mathbf{i}+\cos \theta_i\cdot \mathbf{n}) -\sqrt {1-|\mathbf{i}_{\parallel}|^2}\cdot \mathbf{n} \\ &=&\cfrac{\eta_i}{\eta_t} \cdot (\mathbf{i}+\cos \theta_i\cdot \mathbf{n}) -\sqrt {1-\sin ^2\theta_t}\cdot \mathbf{n} \\ &=&\cfrac{\eta_i}{\eta_t} \cdot \mathbf{i}+\left (\cfrac{\eta_i}{\eta_t} \cos \theta_i -\sqrt {1-\sin ^2\theta_t} \right) \cdot \mathbf{n} \end{matrix}
t====t∥+t⊥ηtηi⋅(i+cosθi⋅n)−1−∣i∥∣2⋅nηtηi⋅(i+cosθi⋅n)−1−sin2θt⋅nηtηi⋅i+(ηtηicosθi−1−sin2θt)⋅n
由Snell’s law公式可得
sin
θ
t
=
η
i
η
t
⋅
sin
θ
i
\sin \theta_t=\cfrac{\eta_i}{\eta_t} \cdot \sin \theta_i
sinθt=ηtηi⋅sinθi,
t
=
η
i
η
t
⋅
i
+
(
η
i
η
t
cos
θ
i
−
1
−
(
η
i
η
t
)
2
sin
2
θ
i
)
⋅
n
=
η
i
η
t
⋅
i
+
(
η
i
η
t
cos
θ
i
−
1
−
(
η
i
η
t
)
2
(
1
−
cos
2
θ
i
)
)
⋅
n
\begin{matrix} \mathbf{t} &=&\cfrac{\eta_i}{\eta_t} \cdot \mathbf{i}+ \left ( \cfrac{\eta_i}{\eta_t} \cos \theta_i -\sqrt {1-(\cfrac{\eta_i}{\eta_t})^2\sin^2 \theta_i}\ \right ) \cdot \mathbf{n} \\ &=&\cfrac{\eta_i}{\eta_t} \cdot \mathbf{i}+ \left (\cfrac{\eta_i}{\eta_t} \cos \theta_i -\sqrt {1-(\cfrac{\eta_i}{\eta_t})^2(1-\cos^2 \theta_i)}\right ) \cdot \mathbf{n} \\ \end{matrix}
t==ηtηi⋅i+⎝⎛ηtηicosθi−1−(ηtηi)2sin2θi ⎠⎞⋅nηtηi⋅i+⎝⎛ηtηicosθi−1−(ηtηi)2(1−cos2θi)⎠⎞⋅n
其中
cos
θ
i
=
i
⋅
n
∣
i
∣
∣
n
∣
=
i
⋅
n
\cos\theta_i=\cfrac{\mathbf{i}\cdot \mathbf{n}}{|\mathbf{i}| |\mathbf{n}|}=\mathbf{i}\cdot \mathbf{n}
cosθi=∣i∣∣n∣i⋅n=i⋅n 。
全反射现象 Total internal reflection
对于Snell’s law 的公式 sin θ t = η i η t ⋅ sin θ i \sin \theta_t=\cfrac{\eta_i}{\eta_t} \cdot \sin \theta_i sinθt=ηtηi⋅sinθi ,当空气中的反射率大于物体内的反射率的时候,有可能会出现 η i η t ⋅ sin θ i > 1 \cfrac{\eta_i}{\eta_t} \cdot \sin \theta_i>1 ηtηi⋅sinθi>1 的情况。
但是 sin θ t \sin\theta_t sinθt 的值一定是小于1的,故等式不可能成立。这个时候光线应该被反射,而不是折射。