纹理参数空间和世界空间
在游戏里面求任意几何表面点的法向量,实际上就是对一个被嵌进三维欧几里得空间 $(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}}
\ $ 。