Ray tracing in one weekend折射公式

阅读需要 3 分钟

本文是对Ray Tracing in One Weekend中折射一节公式的推导

ray_tracing_refract

图中已知的变量已经用蓝色标出,分别是$\eta、\eta^{\prime}$,还有一个向量$R$已知,标为了绿色

图中一些向量为了方便观看用不同颜色标记了,其中$R_{\bot}^{\prime}$和$R_{\parallel}^{\prime}$是$R^{^{\prime}}$的分量,分别和法线$n$单位向量垂直和平行,$R$是入射光线与$R^{\prime}$出射光线两个向量都是单位向量,长度是1

首先要算出来的是$cos\theta$的值,因为$R$和$n$是单位向量,所以很容易得出

$$ \cos\theta = -R \cdot n$$

之后能看出$R$在y轴上的投影的长度为$R$的长度乘上$\cos\theta$,而$R$的长度和$n$的长度其实是一样的,所以也等于$n$的长度乘上$\cos\theta$,可以得出$R$在x轴上的分量为$R + n \cdot \cos\theta$,而这个分量的长度也容易通过图像得知是$\sin\theta$,所以x轴正方向的单位向量可以算出来是

$$\frac{R + n \cdot \cos\theta}{\sin\theta}$$

观察图像其实可以因为$R^{^{\prime}}$长度是1知道$R_{\bot}^{^{\prime}}$的长度是$\sin\theta^{^{\prime}}$

由于斯涅尔折射定律

$$ \sin\theta^{\prime} = \frac{\eta}{\eta^{\prime}} \cdot \sin\theta $$

可以得出

$$ R_{\bot}^{^{\prime}} = \sin\theta^{\prime} \cdot \frac{R + n \cdot \cos\theta}{\sin\theta} = \frac{\eta}{\eta^{\prime}} \cdot (R + n \cdot \cos\theta) = \frac{\eta}{\eta^{\prime}} \cdot (R + (-R \cdot n)n)$$

因为$R_{\parallel}^{\prime}$和$R_{\bot}^{\prime}$是垂直的,并且是同一个单位向量的分量,可以得出$R_{\parallel}^{\prime}$的长度为$ \sqrt{1 - |\mathbf{R^{\prime}}_{\bot}|^2}$,而$R_{\parallel}^{\prime}$的方向和$n$相反,所以

$$R_{\parallel}^{\prime} = -\sqrt{1 - |\mathbf{R}^{\prime}_{\bot}|^2} \cdot n$$

$R_{\parallel}^{\prime}$和$R_{\bot}^{\prime}$加起来就得到$R^{\prime}$了