三维空间的法向量推导

1 min read

纹理参数空间和世界空间

在游戏里面求任意几何表面点的法向量,实际上就是对一个被嵌进三维欧几里得空间 $(x, y, z) \in \mathbb{R}^3 $ 的二维流形(它的坐标对应的就是纹理参数空间下的 $(u, v)$ )分别对 $(u, v)$ 求偏导数。

求偏导数实际上就构造了一个切空间(Tangent Space)。简易起见,直接设参数空间 $(x, y) \in \mathbb{R}^2$ ,则给定一个有序数对 $(x, y)$ 可返回一个世界空间坐标(点 $\mathbf{r}$ ),即: $ \ \mathbf{r}(x,y)= \begin{pmatrix} x \\ y \\ f(x,y) \end{pmatrix} \ $ 。

分别对 $x, y$ 求偏导:

$$ \ \frac{\partial \mathbf r}{\partial x} = \begin{pmatrix} 1 \\ 0 \\ f_x(x,y) \end{pmatrix}, \qquad \frac{\partial \mathbf r}{\partial y} = \begin{pmatrix} 0 \\ 1 \\ f_y(x,y) \end{pmatrix} \ $$
$$ \ f_x = \frac{\partial f}{\partial x}, \qquad f_y = \frac{\partial f}{\partial y} \ $$

再次注意偏导数是一个向量,因为我们实际上是在对一个向量场 $\mathbf{r} : \mathbb{R}^2 \to \mathbb{R}^3$ 求偏导。得到偏导数之后,实际上我们就得到了分别沿着 $x$ 和 $y$ 的切向量,只需要把偏导数叉乘就可以得到垂直于它们的向量:

$$ \ \mathbf n = \frac{\partial \mathbf r}{\partial x} \times \frac{\partial \mathbf r}{\partial y} = \begin{vmatrix} \mathbf i & \mathbf j & \mathbf k \\ 1 & 0 & f_x \\ 0 & 1 & f_y \end{vmatrix} \ $$

进一步:

$$ \ \mathbf n(x,y) = \begin{pmatrix} - f_x(x,y) \\ - f_y(x,y) \\ 1 \end{pmatrix} \ $$
我们就得到了点 $q$ 处的法向量,其归一化形式是 $ \ \hat{\mathbf n} = \frac{(-f_x,\,-f_y,\,1)} {\sqrt{f_x^2+f_y^2+1}} \ $ 。