© 2015-2020 Jacob Ström, Kalle Åström, and Tomas Akenine-Möller

正在加载并构建本章……

第 3 章:点积





3.1 引言


本章介绍一个强大的工具——点积。它是计算机图形学中最基本的构建模块之一。在交互图 3.1 中,有一个称为光线追踪器的计算机图形学程序。光线追踪器的目的是生成一组几何体(下面的例子中只有球体)的图像。这些几何体由若干位于三维空间中的光源照亮。用户还需要设置一个虚拟相机,即相机位置、视野和相机方向(即它朝哪里看)。光线追踪器然后从相机位置沿相机方向,穿过相机成像平面上的一组像素发射光线。程序找到最近的几何体,并判断是否有光从光源直接到达该点(否则该点处于阴影中)。还可以追踪反射光线以创建反光物体(如交互图 3.1 中间的球体)。按下插图下方的开始按钮来试用光线追踪程序。
交互图 3.1: 光线追踪程序可以创建如上图所示的图像。注意首先会进行“粗略渲染”,快速生成较低质量的图像,以保持交互性。用户可以在点击/按住的同时移动鼠标/手指(左/右),从另一个视角重新渲染场景。粗略渲染之后,会进行“精细渲染”,以更高的质量重新渲染像素。这将消除球体轮廓上的锯齿(常称为 jaggies)等。在该模式下,有一个白色像素指示当前的渲染进度(从顶部开始,自左向右、从上到下推进)。
交互图 3.1: 光线追踪程序可以创建如上图所示的图像。注意首先会进行“粗略渲染”,快速生成较低质量的图像,以保持交互性。用户可以在点击/按住的同时移动鼠标/手指(左/右),从另一个视角重新渲染场景。粗略渲染之后,会进行“精细渲染”,以更高的质量重新渲染像素。这将消除球体轮廓上的锯齿(常称为 jaggies)等。在该模式下,有一个白色像素指示当前的渲染进度(从顶部开始,自左向右、从上到下推进)。
在上面的光线追踪程序中,点积用于计算光线与球体的交点,点积还用于测量到交点的长度(length)。此外,用于计算反射物体的反射定律也是通过点积实现的。这两个主题将在 3.7 节中,即读者了解点积原理之后再次讲解。

总的来说,点积实际上与度量有关,即如何测量向量的角度和长度。接下来先有两个关于角度和长度的简短章节,然后是本章的主要部分——定义和阐释点积,其中还包括 3.2.3 节点积的运算法则与性质。3.3 节引入标准正交基的概念,3.4 节介绍一组常用的不等式。3.5 节展示点积的一些应用实例。之后是关于直线平面的章节,最后是光线追踪的后续内容。
3.2 定义与应用


一个向量 $\vc{u}$ 与另一个向量 $\vc{v}$ 之间的最小角记作 $[\vc{u},\vc{v}]$。右图中,向量对之间的最小角用绿色弧线表示,有一种情况用绿色正方形表示。后者的角度为 $90^\circ$ 即 $\pi/2$ 弧度,即 $[\vc{u},\vc{v}]=\pi/2$。这也记作 $\vc{u} \perp \vc{v}$,表明向量是正交(orthogonal)的,即相互垂直。注意左下角的角度为 $0$,底行中间为 $\pi$ 弧度。在这两种情况下,可以说向量是共线的,因为它们在同一条直线上,而且实际上也是平行的。左下角的向量平行且方向相同,而底行中间的向量平行但方向相反。当两个向量平行时,记作 $\vc{u}\, || \,\vc{v}$。还要注意,如果 $\vc{u}$ 和 $\vc{v}$ 平行,则必有 $\vc{v} = k \vc{u}$ 对某个 $k$ 值成立。

现在我们可以给出点积本身的定义了:

定义 3.1: 点积
两个向量 $\vc{u}$ 和 $\vc{v}$ 的点积记作 $\vc{u}\cdot \vc{v}$,定义为标量值
\begin{equation} \vc{u}\cdot \vc{v} = \left\{ \begin{array}{ll} \ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}], & \text{if } \vc{u}\neq \vc{0} \text{ and } \vc{v}\neq \vc{0},\\ 0, & \text{if } \vc{u}=\vc{0} \text{ or } \vc{v}=\vc{0}. \end{array} \right. \end{equation} (3.1)
回顾第 2 章,$||\vc{v}||$ 表示向量 $\vc{v}$ 的长度。由于向量的长度始终为正,因此点积为正当且仅当 $\cos[\vc{u},\vc{v}]$ 为正。由此我们可以推导出以下关于点积的规则
\begin{align} \vc{u} \cdot \vc{v}>0 \ \ \ &\Longleftrightarrow\ \ \ \ 0 < [\vc{u},\vc{v}] < \pi/2,\\ \vc{u} \cdot \vc{v}<0 \ \ \ &\Longleftrightarrow\ \ \ \ \pi/2 < [\vc{u},\vc{v}] \leq \pi, \\ \vc{u} \cdot \vc{v}=0 \ \ \ &\Longleftrightarrow\ \ \ \vc{u} \perp \vc{v}, \mathrm{\ i.e.,\ } [\vc{u},\vc{v}]=\pi/2 \mathrm{\ or\ } \vc{u} = 0 \mathrm{\ or\ } \vc{v} = 0. \\ \end{align} (3.2)
最后一条尤为重要:如果两个向量 $\vc{u}$ 和 $\vc{v}$ 相互正交(垂直),则 $\vc{u}\cdot \vc{v} = 0$。正如我们将在本章后面看到的,正交性是一个有用的特性,通常能简化计算。

注意点积产生的是一个标量值,因此有时也称为标量积

例 3.1: 简单的点积示例
假设有两个向量 $\vc{u}$ 和 $\vc{v}$。$\vc{u}$ 的长度为 $4$,$\vc{v}$ 的长度为 $3$。它们之间的夹角为 $\frac{\pi}{4}$。计算点积 $\vc{u} \cdot \vc{v}$。两个向量的长度都不为零。根据定义 3.1,$\vc{u}$ 和 $\vc{v}$ 的标量积
\begin{align} \vc{u} \cdot \vc{v} &= \ln{\vc{u}} \ln{\vc{v}} \cos[\vc{u},\vc{v}]\\ &= 4 \cdot 3 \cos\Big(\frac{\pi}{4}\Big) \\ &= 12 \frac{1}{\sqrt{2}} \\ &= 6 \sqrt{2}. \end{align} (3.3)

3.2.1 单位向量与归一化



单位向量(unit vector)是长度为 1 的向量,即如果 $\ln{\vc{v}}=1$ 则 $\vc{v}$ 是单位向量。从任意非零向量 $\vc{v}$ 都可以创建一个单位向量,这称为归一化(normalize)该向量,该过程称为归一化(normalization)。归一化向量 $\vc{n}$ 由 $\vc{v}$ 通过将 $\vc{v}$ 除以其长度 $\ln{\vc{v}}$ 得到,即
\begin{equation} \vc{n} = \frac{1}{\ln{\vc{v}}}\vc{v}. \end{equation} (3.4)
接下来,我们需要证明 $\vc{n}$ 确实是单位向量,即 $\ln{\vc{n}}=1$。设 $l=1/\ln{\vc{v}}$,将 $\vc{n}$ 的长度表达式化简为 $\ln{\vc{n}} = \ln{l\vc{v}} = \abs{l}\,\ln{\vc{v}}=\frac{1}{\ln{\vc{v}}}\ln{\vc{v}}=1$。

注意,如果两个向量都已归一化,即 $\ln{\vc{u}}=\ln{\vc{v}}=1$,则点积简化为 $\vc{u} \cdot \vc{v} = \cos[\vc{u},\vc{v}]$。这一事实在计算机图形学的着色计算中非常有用,因为经常需要两个向量夹角的余弦值。事实上,交互图 3.1 中的光线追踪和着色就大量使用了归一化向量。

3.2.2 投影



由三角学可知,在直角三角形中,一个锐角的余弦与斜边和一条较短边的长度有关。
$a$
$c$
$\theta$
更准确地说,表达式为
\begin{equation} \cos \theta= \frac{a}{c}, \end{equation} (3.5)
其中 $c$ 是斜边的长度,$a$ 是与斜边成角 $\theta$ 的较短边的长度。这也在右图中进行了说明。因此在这些特定情况下,若已知两个长度 $a$ 和 $c$,就可以计算角度。反过来,若已知角度和另一条边的长度,也可以计算某一边的长度

$\vc{u}$
$\vc{v}$
$\vc{w}$
$[\vc{u},\vc{v}]$
假设要将向量 $\vc{u}$ 正交投影到另一个向量 $\vc{v}$ 上,以产生新向量 $\vc{w}$。这在右图中进行了说明。由于 $\vc{u}$ 和 $\vc{w}$ 构成一个含直角的三角形,因此必有 $\cos [\vc{u},\vc{v}] = \ln{\vc{w}} / \ln{\vc{u}}$,这只是上面式 (3.5) 的应用。这意味着 $\vc{w}$ 的长度为 $\ln{\vc{w}} = \ln{\vc{u}}\cos [\vc{u},\vc{v}]$。如果 $\vc{v}$ 的长度为 1,即 $\ln{\vc{v}}=1$,则投影向量可以计算为
\begin{equation} \vc{w} = \ln{\vc{w}}\ \vc{v} = \ln{\vc{u}} \cos [\vc{u},\vc{v}]\ \vc{v}. \end{equation} (3.6)
要验证 $\ln{\vc{w}}\vc{v}$ 确实等于 $\vc{w}$,注意它既有正确的方向(即 $\vc{v}$ 的方向,因为 $\ln{\vc{w}}$ 只是标量),又有正确的长度(即 $\ln{\vc{w}}$,因为 $\vc{v}$ 的长度为 1)。然而,我们也希望能处理 $\vc{v}$ 的长度不为 1 的情况。这可以通过归一化向量 $\vc{v}$ 来实现,即将其乘以 $\frac{1}{\ln{\vc{v}}}$ 使其长度变为 1。如果在上面的式 (3.6) 中将 $\vc{v}$ 替换为 $\frac{1}{\ln{\vc{v}}}\vc{v}$,可得
\begin{equation} \vc{w} = \frac{\ln{\vc{u}} \cos [\vc{u},\vc{v}]}{\ln{\vc{v}}} \vc{v}. \end{equation} (3.7)
这里利用了归一化不改变方向的事实,因此可以继续使用 $\cos[\vc{u},\vc{v}]$ 代替 $\cos[\vc{u}, \frac{\vc{v}}{\ln{v}}]$。接下来,将分子和分母同时乘以 $\ln{\vc{v}}$,即可得到一般的正交投影(orthogonal projection)公式
\begin{equation} \vc{w} = \frac{\ln{\vc{u}}\ \ln{\vc{v}} \cos [\vc{u},\vc{v}] }{ \ln{\vc{v}}^2 } \vc{v}. \end{equation} (3.8)
最后这一步的原因在于,分子 $\ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}]$ 恰好等于点积的定义。因此可以将公式写得更简洁
\begin{equation} \vc{w} = \frac{\vc{u} \cdot \vc{v} }{ \ln{\vc{v}}^2 } \vc{v}. \end{equation} (3.9)
至此我们证明了以下公式:

定义 3.2: 正交投影
若 $\vc{v}$ 是非零向量,则 $\vc{u}$ 在 $\vc{v}$ 上的正交投影记作 $\proj{\vc{v}}{\vc{u}}$,定义为
\begin{equation} \proj{\vc{v}}{\vc{u}} = \frac{\vc{u} \cdot \vc{v}}{ \ln{\vc{v}}^2 } \vc{v}. \end{equation} (3.10)
注意,如果 $\ln{\vc{v}}=1$,即 $\vc{v}$ 是归一化的,那么投影的表达式会更简单:$\proj{\vc{v}}{\vc{u}} = (\vc{u} \cdot \vc{v})\vc{v}$。

3.2.3 运算法则与性质



借助定义和投影公式,可以推导出以下法则:

定理 3.1: 点积运算法则
以下是使用点积时的一组常用法则。
\begin{align} \begin{array}{llr} (i) & \vc{u} \cdot \vc{v} = \vc{v} \cdot \vc{u} & \spc\text{(commutativity)} \\ (ii) & k(\vc{u} \cdot \vc{v}) = (k\vc{u}) \cdot \vc{v} & \spc\text{(associativity)} \\ (iii) & \vc{v} \cdot (\vc{u} +\vc{w}) = \vc{v} \cdot \vc{u} + \vc{v} \cdot \vc{w} & \spc\text{(distributivity)} \\ (iv) & \vc{v} \cdot \vc{v} = \ln{\vc{v}}^2 \geq 0, \mathrm{with\ equality\ only\ when\ } \vc{v}=\vc{0}. & \spc\text{(squared length)} \\ \end{array} \end{align} (3.11)

$(i)$ 由定义 3.1 可知 $\vc{u} \cdot \vc{v} = \ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}]$,而 $\vc{v} \cdot \vc{u} = \ln{\vc{v}}\ \ln{\vc{u}} \cos[\vc{v},\vc{u}]$,二者相等是因为 $[\vc{u},\vc{v}]$ 和 $[\vc{v},\vc{u}]$ 都表示 $\vc{u}$ 与 $\vc{v}$ 之间的最小夹角。
$(ii)$ 同样由定义 3.1,等号左边为 $k(\vc{u} \cdot \vc{v}) =$ $k\ln{\vc{u}}\,\ln{\vc{v}} \cos[\vc{u},\vc{v}]$,而等号右边为 $(k\vc{u}) \cdot \vc{v} =$ $\ln{k\vc{u}}\,\ln{\vc{v}} \cos[k\vc{u},\vc{v}]$。若 $k>0$ 则 $\cos[k\vc{u},\vc{v}]=$ $\cos[\vc{u},\vc{v}]$,且 $\ln{k\vc{u}}=k\ln{\vc{u}}$,这证明了 $k>0$ 情况下的等式。对于 $k<0$,等号左边可以改写为 $k\ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}] = - \abs{k}\,\ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}]$。等号右边可以改写为 $\ln{k\vc{u}}\,\ln{\vc{v}} \cos[k\vc{u},\vc{v}] = \abs{k}\ln{\vc{u}}\,\ln{\vc{v}} \cos(\pi-[\abs{k}\vc{u},\vc{v}])$,其中最后一步利用了当 $k$ 为负时 $[k\vc{u},\vc{v}]=[-\vc{u},\vc{v}]=\pi-[\vc{u},\vc{v}]$ 这一事实。由三角恒等式可知 $\cos (\pi-[\vc{u},\vc{v}]) = -\cos [\vc{u},\vc{v}]$,因此等号右边变为 $-\abs{k}\,\ln{\vc{u}}\ \ln{\vc{v}} \cos[\vc{u},\vc{v}]$,证明了 $k<0$ 情况下的法则。最后,对于 $k=0$,等号两边显然都为零。
$(iii)$
$\vc{u}$
$\vc{v}$
$\vc{w}$
$\proj{\vc{v}}{\vc{u}}$
$\proj{\vc{v}}{\vc{w}}$
$\vc{v}$
$\vc{u}+\vc{w}$
$\proj{\vc{v}}{(\vc{u}+\vc{w})}$
首先假设 $\vc{v}\neq \vc{0}$(若 $\vc{v}=\vc{0}$,该法则显然成立)。这里使用几何证明,利用投影之和等于和的投影这一性质。这可以表示为
\begin{equation} \proj{\vc{v}}{\vc{u}} + \proj{\vc{v}}{\vc{w}} = \proj{\vc{v}}{(\vc{u}+\vc{w})}. \end{equation} (3.12)
等号左边的表达式如图 3.5 上半部分所示(注意图中的 $\vc{u}$ 和 $\vc{w}$ 向量可以移动),等号右边的表达式在同一图的下半部分中可视化。利用定义 3.2,可以将其改写为
\begin{gather} \frac{\vc{u} \cdot \vc{v}}{ \ln{\vc{v}}^2 } \vc{v} + \frac{\vc{w} \cdot \vc{v}}{ \ln{\vc{v}}^2 } \vc{v} = \frac{(\vc{u}+\vc{w}) \cdot \vc{v}}{ \ln{\vc{v}}^2 } \vc{v} \\ \Longleftrightarrow \\ (\underbrace{\vc{u} \cdot \vc{v}}_{\text{scalar}}) \vc{v} + (\underbrace{\vc{w} \cdot \vc{v}}_{\text{scalar}})\vc{v} = \bigl(\underbrace{(\vc{u}+\vc{w}) \cdot \vc{v}}_{\text{scalar}}\bigr)\vc{v}. \\ \end{gather} (3.13)
注意最后一步中有三个标量,它们都乘以 $\vc{v}$。因此可以去掉向量 $\vc{v}$,只保留标量,得到:$\vc{u}\cdot\vc{v} + \vc{w}\cdot\vc{v} =$ $(\vc{u}+\vc{w})\cdot\vc{v}$。这又可以利用法则 $(i)$ 改写为 $\vc{v}\cdot\vc{u} + \vc{v}\cdot\vc{w} =$ $\vc{v}\cdot(\vc{u}+\vc{w})$,从而证明了法则 $(iii)$。
$(iv)$ 由定义 3.1,$\vc{v}\cdot\vc{v}=\ln{\vc{v}}\,\ln{\vc{v}}\cos[\vc{v},\vc{v}]=\ln{\vc{v}}^2$,因为 $\cos[\vc{v},\vc{v}]=\cos 0 = 1$。
证毕。
$\square$


定理 3.1 中的法则是直观的,因为它们与标量加法和标量乘法的法则相同。在 3.5 节中,将通过若干实例展示如何使用这些法则。

例 3.2: 余弦定理
$a$
$b$
$c$
$\theta$
$\vc{u}$
$\vc{v}$
$\vc{w}=\vc{u}-\vc{v}$
$[\vc{u},\vc{v}]$
余弦定理有时不太容易记住,但借助点积推导其公式实际上非常简单。如右侧图 3.6 所示的几何情形中,两个向量 $\vc{u}$ 和 $\vc{v}$ 从同一点出发,差向量 $\vc{u} - \vc{v}$ 是从 $\vc{v}$ 的终点指向 $\vc{u}$ 的终点的向量,即 $\vc{w} = \vc{u} - \vc{v}$。只需记住余弦定理从 $\vc{w}$ 的长度的平方开始,然后用点积的运算法则展开表达式,首先使用法则 $(iv)$ 得到
\begin{equation} \ln{\vc{w}}^2 = \vc{w} \cdot \vc{w}. \end{equation} (3.14)
由于 $\vc{w} = (\vc{u} - \vc{v})$,可以改写为
\begin{equation} \ln{\vc{w}}^2 = (\vc{u} - \vc{v}) \cdot (\vc{u} - \vc{v}). \end{equation} (3.15)
利用上述法则 $(i)$ 和 $(iii)$ 展开该表达式,得到
\begin{equation} \ln{\vc{w}}^2 = \vc{u} \cdot \vc{u} - \vc{u} \cdot \vc{v} - \vc{v} \cdot \vc{u} + \vc{v} \cdot \vc{v}. \end{equation} (3.16)
然而,法则 $(i)$ 表明 $\vc{u} \cdot \vc{v} = \vc{v} \cdot \vc{u}$,法则 $(iv)$ 表明 $\vc{u} \cdot \vc{u} = \ln{\vc{u}}^2$,从而得到
\begin{equation} \ln{\vc{w}}^2 = \ln{\vc{u}}^2 + \ln{\vc{v}}^2 - 2\vc{u} \cdot \vc{v}. \end{equation} (3.17)
最后,应用点积的定义,得到最终表达式
\begin{equation} \ln{\vc{w}}^2 = \ln{\vc{u}}^2 + \ln{\vc{v}}^2 - 2\ \ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u},\vc{v}]. \end{equation} (3.18)
使用图上半部分中更常见的记号,可以清楚地看出
\begin{equation} c^2 = a^2 + b^2 - 2ab \cos \theta, \end{equation} (3.19)
这就是余弦定理,与式 (1.5) 中的形式类似。
3.3 标准正交基


本节将介绍一种计算点积的简便方法。假设我们有两个三维向量 $\vc{u} = (u_1, u_2, u_3)$ 和 $\vc{v} = (v_1, v_2, v_3)$,在同一下表示为
\begin{align} \vc{u} & = u_1 \vc{e}_1 + u_2 \vc{e}_2 + u_3 \vc{e}_3,\\ \vc{v} & = v_1 \vc{e}_1 + v_2 \vc{e}_2 + v_3 \vc{e}_3. \end{align} (3.20)
点积 $\vc{u} \cdot \vc{v}$ 现在可以写为
\begin{align} \vc{u} \cdot \vc{v} & = (u_1 \vc{e}_1 + u_2 \vc{e}_2 + u_3 \vc{e}_3) \cdot (v_1 \vc{e}_1 + v_2 \vc{e}_2 + v_3 \vc{e}_3),\\ \end{align} (3.21)
展开后得到
\begin{align} \vc{u} \cdot \vc{v} & = u_1 v_1 \vc{e}_1 \cdot \vc{e}_1 + u_1 v_2 \vc{e}_1 \cdot \vc{e}_2 + u_1 v_3 \vc{e}_1 \cdot \vc{e}_3 \\ & + u_2 v_1 \vc{e}_2 \cdot \vc{e}_1 + u_2 v_2 \vc{e}_2 \cdot \vc{e}_2 + u_2 v_3 \vc{e}_2 \cdot \vc{e}_3 \\ & + u_3 v_1 \vc{e}_3 \cdot \vc{e}_1 + u_3 v_2 \vc{e}_3 \cdot \vc{e}_2 + u_3 v_3 \vc{e}_3 \cdot \vc{e}_3. \end{align} (3.22)
这看起来很长且复杂。然而,假设当 $i \neq j$ 时 $\vc{e}_i \cdot \vc{e}_j$ 为 $0$。这等价于每条轴都与其他所有正交。这样,除三项外的所有项都会消失。再进一步假设对所有 $i$ 有 $\vc{e}_i \cdot \vc{e}_i = 1$。这等价于每个向量的长度为 1。剩余各项也可以进一步化简,得到
\begin{equation} \vc{u} \cdot \vc{v} = u_1 v_1 + u_2 v_2 + u_3 v_3. \end{equation} (3.23)
现在我们可以在任意维度上定义标准正交基了。

定义 3.3: 标准正交基
对于由向量集 $\{\vc{e}_1, \dots, \vc{e}_n\}$ 构成的 $n$ 维标准正交基,以下关系成立
\begin{equation} \vc{e}_i \cdot \vc{e}_j = \begin{cases} 1 & \text{if } i=j, \\ 0 & \text{if } i\neq j. \\ \end{cases} \end{equation} (3.24)
这意味着向量具有单位长度,即它们是归一化的,并且它们两两正交
我们还将简化的点积推广到任意维度的向量:

定义 3.4: 标准正交基中的点积计算
在任意标准正交基中,两个 $n$ 维向量 $\vc{u}$ 和 $\vc{v}$ 的点积可以按如下方式计算
\begin{equation} \vc{u}\cdot\vc{v} = \sum_{i=1}^{n} u_i v_i, \end{equation} (3.25)
即对应分量乘积之和。二维和三维点积的计算方式为
\begin{align} \mathrm{two\ dimensions\ } &:\ \ \vc{u}\cdot\vc{v} = u_xv_x + u_yv_y, \\ \mathrm{three\ dimensions\ } &:\ \ \vc{u}\cdot\vc{v} = u_xv_x + u_yv_y +u_zv_z. \\ \end{align} (3.26)
注意上面使用了两种不同的向量分量索引方式,例如,回忆 $\vc{v}=(v_1, v_2, v_3) = (v_x, v_y, v_z)$。

对于 $\R^1$、$\R^2$ 和 $\R^3$ 中的向量,角度有自然的几何含义。我们用这一概念,按照(定义 3.1)来定义标量积。如果标准正交的,便可得到上述计算标量积的简化公式 $\vc{u} \cdot \vc{v} = u_1 v_1 + u_2 v_2 + u_3 v_3 $。对于高维空间中的向量,角度不存在自然的定义。在标准正交基的情况下,解决方法是利用定义 3.4标量积的简化公式,从标量积反推角度的概念。这样,两个非零向量 $\vc{u}$ 和 $\vc{v}$ 之间的角度定义如下。

定义 3.5: 高维空间中的角度
在 $\R^n$ 中,两个非零向量 $\vc{u} = (u_1, u_2, \ldots, u_n)$ 和 $\vc{v} = (v_1, v_2, \ldots, v_n)$ 之间的角度 $[\vc{u}, \vc{v}]$ 定义为
\begin{equation} [\vc{u}, \vc{v}] = \arccos \frac{\vc{u} \cdot \vc{v}}{\ln{\vc{u}}\ \ln{\vc{v}}} \end{equation} (3.27)
现在用一个简单的例子来说明点积的简化计算方式(定义 3.4)是如何运作的:

例 3.3: 简单计算
在下图所示的标准正交基中,$\vc{u} = (1,2)$ 且 $\vc{v} = (3,1.5)$。任务是计算 $\ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u}, \vc{v}]$。

我们注意到 $\ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u}, \vc{v}]$ 等于点积 $\vc{u} \cdot \vc{v}$。我们还利用标准正交的这一事实,因此可以使用简化公式(定义 3.4)来计算 $\vc{u} \cdot \vc{v}$,即
\begin{align} \ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u}, \vc{v}] & = \vc{u} \cdot \vc{v}\\ & = u_1 v_1 + u_2 v_2 \\ & = 1 \cdot 3 + 2 \cdot 1.5 \\ & =3 + 3 = 6. \end{align} (3.28)
$\vc{u}$
$\vc{v}$
$\vc{e}_1$
$\vc{e}_2$
交互图 3.7: 由于 $\vc{e}_1$ 和 $\vc{e}_2$ 正交且长度都为 1,我们可以使用简化公式计算 $\vc{u} \cdot \vc{v}$。注意这个图实际上不是交互式的
交互图 3.7: 由于 $\hid{\vc{e}_1}$ 和 $\hid{\vc{e}_2}$ 正交且长度都为 1,我们可以使用简化公式计算 $\hid{\vc{u} \cdot \vc{v}}$。注意这个图实际上不是交互式的

例 3.4: 角度计算
标准正交基中,$\vc{u} = (1,2)$ 且 $\vc{v} = (3,1)$。求 $\vc{u}$ 和 $\vc{v}$ 之间的最小夹角。

最小夹角 $[\vc{u}, \vc{v}]$ 包含在点积 $\ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u}, \vc{v}]$ 中。因此,如果我们计算点积并除以 $\vc{u}$ 和 $\vc{v}$ 的长度,就可以得到 $\vc{u}$ 和 $\vc{v}$ 之间最小夹角的余弦值。由于标准正交的,可以用简便方法计算所需的各个点积
\begin{align} \ln{\vc{u}}\ \ln{\vc{v}}\cos[\vc{u}, \vc{v}] &= \vc{u} \cdot \vc{v} = u_1 v_1 + u_2 v_2 = 1 \cdot 3 + 2 \cdot 1 = 3 + 2 = 5,\\ \ln{\vc{u}}^2 & = \vc{u} \cdot \vc{u} = u_1 u_1 + u_2 u_2 = 1^2 + 2^2 = 5, \\ \ln{\vc{v}}^2 & = \vc{v} \cdot \vc{v} = v_1 v_1 + v_2 v_2 = 3^2 + 1^2 = 10.\\ \end{align} (3.29)
由此得到 $\ln{\vc{u}} = \sqrt{5}$ 和 $\ln{\vc{v}} = \sqrt{10} = \sqrt{5}\sqrt{2}$,可以写出
\begin{equation} \cos [\vc{u}, \vc{v}] =\frac{\vc{u} \cdot \vc{v}}{\ln{\vc{u}}\ \ln{\vc{v}}} =\frac{5}{\sqrt{5}\sqrt{5}\sqrt{2}} = \frac{1}{\sqrt{2}}, \end{equation} (3.30)
最终所求角度为
\begin{equation} [\vc{u}, \vc{v}] = \arccos\Big(\frac{1}{\sqrt{2}}\Big) = \frac{\pi}{4}. \end{equation} (3.31)
为了对点积有更直观的感受,建议读者尝试操作下方的交互图 3.8
$\vc{u}$
$\vc{v}$
$\ln{\vc{u}}$
$\ln{\vc{v}}$
$\cos [\vc{u},\vc{v}]$
$\vc{u} \cdot \vc{v}$
交互图 3.8: 这里展示了标准基中两个向量(读者可以拖动)$\vc{u}$ 和 $\vc{v}$ 的点积以及各项。回忆 $\vc{u}\cdot\vc{v} = \ln{\vc{u}}\,\ln{\vc{v}} \cos [\vc{u},\vc{v}]$。注意当 $\vc{u}$ 和 $\vc{v}$ 之间的夹角从小于 $\pi/2$ 变为大于 $\pi/2$ 时,点积的符号和 $\cos [\vc{u},\vc{v}]$ 的变化。还要注意当 $\vc{u}$ 和 $\vc{v}$ 是单位向量(即 $\ln{\vc{u}}=\ln{\vc{v}}=1$)时,$\vc{u}\cdot\vc{v} = \cos [\vc{u},\vc{v}]$。当移动一个向量使得 $\vc{u}=\vc{v}$ 时也可以获得新的理解。
交互图 3.8: 这里展示了标准基中两个向量(读者可以拖动)$\hid{\vc{u}}$ 和 $\hid{\vc{v}}$ 的点积以及各项。回忆 $\hid{\vc{u}\cdot\vc{v} = \ln{\vc{u}}\,\ln{\vc{v}} \cos [\vc{u},\vc{v}]}$。注意当 $\hid{\vc{u}}$ 和 $\hid{\vc{v}}$ 之间的夹角从小于 $\hid{\pi/2}$ 变为大于 $\hid{\pi/2}$ 时,点积的符号和 $\hid{\cos [\vc{u},\vc{v}]}$ 的变化。还要注意当 $\hid{\vc{u}}$ 和 $\hid{\vc{v}}$ 是单位向量(即 $\hid{\ln{\vc{u}}=\ln{\vc{v}}=1}$)时,$\hid{\vc{u}\cdot\vc{v} = \cos [\vc{u},\vc{v}]}$。当移动一个向量使得 $\hid{\vc{u}=\vc{v}}$ 时也可以获得新的理解。

3.3.1 标准正交基中的向量长度



正如我们已经看到的,在标准正交基中表示向量可以简化点积的计算。在本节中,我们将看到它同样简化了向量长度(记作 $\ln{\vc{v}}$)的计算。长度也称为和范数。
$a$
$b$
$c$
$v_x$
$v_y$
$\vc{v}$
$\ln{\vc{v}}$


回忆定理 3.1 中的法则 $(iv)$,即 $\vc{v}\cdot\vc{v} = \ln{\vc{v}}^2$。如果向量在标准正交基中的坐标为 $(v_x, v_y)$,我们可以使用简化公式(定义 3.4)计算点积,得到 $\ln{\vc{v}}^2 = v_x^2 + v_y^2$。在右边的上图中,我们画出了向量 $\vc{v}$。由于 $v_x$ 和 $v_y$ 是 $\vc{v}$ 的坐标,它们也等于虚线线段的长度。注意这个图与下方的三角形类似,其中 $c = \ln{\vc{v}}$、$a = v_x$ 且 $b = v_y$。因此表达式 $\ln{\vc{v}}^2 = v_x^2 + v_y^2$ 就是勾股定理的一个证明,该定理说的是 $c^2 = a^2 + b^2$。

因此,标准正交基中向量的长度可以按如下方式计算
\begin{equation} \ln{\vc{v}} = \sqrt{v_x^2 + v_y^2}. \end{equation} (3.32)
类似地,对于标准正交基中的三维向量 $\vc{v} = (v_x, v_y, v_z)$,点积 $\vc{v} \cdot \vc{v} = \ln{\vc{v}}^2$ 可以计算为 $v_x^2 + v_y^2 + v_z^2$,因此向量长度的计算方式为
\begin{equation} \ln{\vc{v}} = \sqrt{v_x^2 + v_y^2 + v_z^2}. \end{equation} (3.33)
在这种情况下同样可以利用勾股定理从几何上解释该公式为何正确,如交互图 3.10 所示。
$(v_x, v_y, v_z)$
$(v_x, v_y, 0)$
$\sqrt{v_x^2 + v_y^2}$
$v_x$
$v_y$
$x$
$y$
$z$
$|v_z|$
$||\vc{v}||$
交互图 3.10: 我们想要计算向量 $\vc{v}$ 的长度。首先将其尾部放在原点,这意味着其头部将在坐标 $(v_x, v_y, v_z)$ 处。
交互图 3.10: 两个红色箭头和红色虚线也构成一个直角三角形,在下一步中可能更容易看出。如上一步所发现的,顶部的短边长度为 $\hid{\sqrt{v_x^2 + v_y^2}}$。另一条短边是向量 $\hid{(0, 0, v_z)}$,其长度显然为 $\hid{|v_z|}$。斜边就是向量 $\hid{\vc{v}}$ 本身,因此根据勾股定理,其长度的平方必为 $\hid{||\vc{v}||^2 = (\sqrt{v_x^2 + v_y^2})^2 + v_z^2}$,从而 $\hid{||\vc{v}||}$ 必为 $\hid{\sqrt{v_x^2 + v_y^2 + v_z^2}}$。
注意,了解向量被缩放因子 $k$ 缩放时其长度如何变化通常很有用。利用点积的定义,我们得到
\begin{equation} (k\vc{v})\cdot(k\vc{v}) = \ln{k\vc{v}}\,\ln{k\vc{v}}\cos[k\vc{v},k\vc{v}] = \ln{k\vc{v}}^2. \end{equation} (3.34)
也可以两次使用法则 $(ii)$ 来得到
\begin{equation} (k\vc{v})\cdot(k\vc{v}) = k ( \vc{v}\cdot(k\vc{v})) = k(k(\vc{v}\cdot\vc{v})) = k^2 \ln{\vc{v}}^2. \end{equation} (3.35)
因此,我们有
\begin{equation} \ln{k\vc{v}}^2 = k^2 \ln{\vc{v}}^2, \end{equation} (3.36)
由此得到
\begin{equation} \ln{k\vc{v}} = \abs{k}\, \ln{\vc{v}}. \end{equation} (3.37)


注意只有零向量长度为零,即 $\ln{\vc{0}} = 0$,且当 $\vc{v}\neq\vc{0}$ 时 $\ln{\vc{v}}>0$。

3.4 不等式


以下是数学中一些非常有用的不等式。它们被放在点积一章中,因为利用点积的定义很容易证明它们。

定理 3.2: 柯西–施瓦茨不等式(Cauchy–Schwarz inequality)
若 $\vc{u}$ 和 $\vc{v}$ 是 $\R^n$ 中的向量,则以下关系成立
\begin{equation} (\vc{u} \cdot \vc{v})^2 \leq \ln{\vc{u}}^2\,\ln{\vc{v}}^2, \end{equation} (3.38)
也可以表示为
\begin{equation} \abs{\vc{u} \cdot \vc{v}} \leq \ln{\vc{u}}\,\ln{\vc{v}}. \end{equation} (3.39)

对于几何向量,点积的绝对值(定义 3.1)给出 $\abs{\vc{u} \cdot \vc{v}} = \ln{\vc{u}}\ \ln{\vc{v}}\, \abs{\cos[\vc{u},\vc{v}]}$,由于 $\abs{\cos[\vc{u},\vc{v}]} \leq 1$,定理得证。对于高维空间中的向量,标准正交基点积的定义为 $\vc{u}\cdot \vc{v} = \sum_i u_i v_i$(定义 3.4)。要在这种情况下证明柯西–施瓦茨不等式,需要证明
\begin{equation} ( \sum_{i=1}^n u_i v_i )^2 \leq ( \sum_{i=1}^n u_i^2 )( \sum_{i=1}^n v_i^2 ) . \end{equation} (3.40)
这里从以下多项式开始
\begin{equation} p(z) = \sum_{i=1}^n (u_i z + v_i )^2 , \end{equation} (3.41)
对于每个 $z$,它显然大于或等于零,因为它是平方和。我们知道多项式 $p(z) = az^2 + bz + c$ 有两个解
\begin{equation} z = \frac{-b \pm \sqrt{b^2-4ac}}{2a} . \end{equation} (3.42)
如果所谓的判别式 $b^2-4ac$ 为正,则存在两个不同的实根,多项式既取正值也取负值。由于 $p(z)$ 非负,必有 $b^2-4ac \leq 0$。现在
\begin{equation} p(z) = \sum_{i=1}^n (u_i z + v_i )^2 = \sum_{i=1}^n u_i^2 z^2 + 2u_i v_i z + v_i^2 = (\sum_{i=1}^n u_i^2) z^2 + 2 (\sum_{i=1}^n u_i v_i) z + \sum_{i=1}^n (v_i^2 ) \end{equation} (3.43)
因此我们有
\begin{equation} \begin{cases} \begin{array}{ll} a &= \sum_{i=1}^n u_i^2 \\ b &= 2 \sum_{i=1}^n u_i v_i \\ c &= \sum_{i=1}^n v_i^2 \end{array} \end{cases}, \end{equation} (3.44)
由于 $b^2/4-ac \leq 0$,我们得到 $b^2/4 \leq ac$,即
\begin{equation} (\sum_{i=1}^n u_i v_i)^2 \leq (\sum_{i=1}^n u_i^2) \sum_{i=1}^n (v_i^2 ) \end{equation} (3.45)
\begin{equation} (\vc{u} \cdot \vc{v})^2 \leq \ln{\vc{u}}^2\,\ln{\vc{v}}^2. \end{equation} (3.46)
$\square$


另一个相关的不等式是下面的三角不等式(triangle inequality)。

定理 3.3: 三角不等式
若 $\vc{u}$ 和 $\vc{v}$ 是 $\R^3$ 中的向量,则以下关系成立
\begin{equation} \ln{\vc{u} + \vc{v}} \leq \ln{\vc{u}} + \ln{\vc{v}}. \end{equation} (3.47)

对两边取平方并展开表达式,左边变为 $\ln{\vc{u} + \vc{v}}^2 = $ $(\vc{u} + \vc{v})\cdot (\vc{u} + \vc{v}) = $ $\vc{u} \cdot \vc{u} + \vc{v} \cdot \vc{v} + 2\vc{u}\cdot \vc{v} = $ $\ln{\vc{u}}^2 + \ln{\vc{v}}^2 + 2\ln{\vc{u}}\,\ln{\vc{v}} \cos [\vc{u},\vc{v}]$。 平方后的右边变为 $(\ln{\vc{u}} + \ln{\vc{v}})^2 = $ $\ln{\vc{u}}^2 + \ln{\vc{v}}^2 +2 \ln{\vc{u}}\,\ln{\vc{v}}$, 由于 $\cos [\vc{u},\vc{v}] \leq 1$,定理得证。
$\square$


$\ln{\vc{u}}$
$\ln{\vc{v}}$
$\ln{\vc{u} + \vc{v}}$
$\ln{\vc{u}}$
$\ln{\vc{v}}$
$\ln{\vc{u} + \vc{v}}$
$\ln{\vc{u}} + \ln{\vc{v}}$
注意三角不等式从几何上很容易理解,如右图所示。从图中可以清楚地看出 $\vc{u}$ 和 $\vc{v}$ 的长度之和必须大于或等于 $\vc{u}+\vc{v}$ 的长度。事实上,等号仅在 $\vc{u}$ 和 $\vc{v}$ 平行且方向相同时成立。建议读者移动 $\vc{u}$ 向量使其出现这种情况。

3.5 一些例子


在本节中,我们将展示一些有用的例子,并指出得到结果时使用了哪些法则。法则标注在等号上方,例如
\begin{equation} \vc{a} \cdot (\vc{a}+\vc{b}) \overset{(iii)}{=} \vc{a} \cdot \vc{a} + \vc{a} \cdot \vc{b}, \end{equation} (3.48)
表示使用了法则 $(iii)$(定理 3.1)来得到等号右边的结果。接下来是一个推导平行四边形定律的例子。

例 3.5: 平行四边形定律
$\vc{u}$
$\vc{v}$
$\vc{u} + \vc{v}$
$\vc{u} - \vc{v}$
假设有两个从同一点出发的向量 $\vc{u}$ 和 $\vc{v}$。在进行向量加法2.2 节)时,我们已经看到可以构造一个平行四边形来完成向量加法。这个平行四边形的两条对角线分别是 $\vc{u}-\vc{v}$ 和 $\vc{u}+\vc{v}$,如右边图 3.12 所示。现在,对角线长度的平方和为
\begin{align} \ln{ \vc{u} + \vc{v} }^2 + \ln{ \vc{u} - \vc{v} }^2 \overset{(iv)}{=}& (\vc{u} + \vc{v})\cdot (\vc{u} + \vc{v}) + (\vc{u} - \vc{v})\cdot (\vc{u} - \vc{v})\\ \overset{(iii)}{=}& (\vc{u} + \vc{v})\cdot\vc{u} +(\vc{u} + \vc{v})\cdot\vc{v} +\\ & (\vc{u} - \vc{v})\cdot \vc{u} -(\vc{u} - \vc{v})\cdot \vc{v} \\ \overset{(i)}{=}& \vc{u}\cdot(\vc{u} + \vc{v}) + \vc{v}\cdot(\vc{u} + \vc{v}) +\\ & \vc{u}\cdot(\vc{u} - \vc{v}) - \vc{v}\cdot(\vc{u} - \vc{v}) \\ \overset{(iii)}{=}& \vc{u} \cdot \vc{u} + \vc{u} \cdot \vc{v} + \vc{v} \cdot \vc{u} +\vc{v} \cdot \vc{v}+ \\ &\vc{u} \cdot \vc{u} - \vc{u} \cdot \vc{v} - \vc{v} \cdot \vc{u} +\vc{v} \cdot \vc{v} \\ =& 2\vc{u} \cdot \vc{u} + 2\vc{v} \cdot \vc{v} \\ \overset{(iv)}{=}& 2\ln{\vc{u}}^2 + 2\ln{\vc{v}}^2. \end{align} (3.49)
这是一个相当惊人的结果。

例 3.6: 极化恒等式
以下内容与例 3.5 密切相关。在那个例子中,我们展示了所有步骤和对应的法则,但点积法则的方便之处在于它们的行为符合预期。因此,在本例中我们会更简略。注意与例 3.5 起始方程的唯一区别是加号变成了减号,即
\begin{align} \ln{ \vc{u} + \vc{v} }^2 - \ln{ \vc{u} - \vc{v} }^2 &= (\vc{u} + \vc{v}) \cdot (\vc{u} + \vc{v}) - (\vc{u} - \vc{v}) \cdot (\vc{u} - \vc{v}) \\ &= \vc{u}\cdot \vc{u} + 2\vc{u}\cdot \vc{v} +\vc{v}\cdot \vc{v} - \bigl( \vc{u}\cdot \vc{u} - 2\vc{u}\cdot \vc{v} +\vc{v}\cdot \vc{v} \bigr) \\ &= 4\vc{u}\cdot \vc{v}, \end{align} (3.50)
即 $\vc{u}\cdot \vc{v} = \frac{1}{4}\bigl( \ln{ \vc{u} + \vc{v} }^2 - \ln{ \vc{u} - \vc{v} }^2 \bigr)$。这同样是一个相当惊人的结果。

例 3.7: 用点积求三角形面积
$A$
$B$
$C$
$\vc{u}$
$\vc{v}$
$h$
$[\vc{u},\vc{v}]$
本例将推导由三个点 $A$、$B$ 和 $C$ 所确定的三角形的面积,如右图所示。最终的面积公式将用点积来表示。在下面的推导中,我们使用边向量 $\vc{u} = B-A$ 和 $\vc{v} = C-A$。回忆三角形面积通常按 $bh/2$ 计算,其中 $b$ 是底边的长度,$h$ 是三角形的高。在右图中,$b=\ln{\vc{u}}$,由三角学可知高必为
\begin{equation} h = \ln{\vc{v}} \sin [\vc{u},\vc{v}]. \end{equation} (3.51)
三角形面积 a 为
\begin{equation} a = \frac{bh}{2} =\frac{1}{2} \underbrace{\ln{\vc{u}}}_{b} \,\underbrace{\ln{\vc{v}} \sin [\vc{u},\vc{v}]}_{h}. \end{equation} (3.52)
由于三角形面积总是正的,我们将其平方,并利用三角恒等式($\sin^2 \phi + \cos^2 \phi =1$)将表达式展开为用点积表示的形式
\begin{align} a^2 &= \frac{1}{4} \ln{\vc{u}}^2 \, \ln{\vc{v}}^2 \sin^2 [\vc{u},\vc{v}] \\ &= \frac{1}{4} \ln{\vc{u}}^2 \, \ln{\vc{v}}^2 (1-\cos^2 [\vc{u},\vc{v}]) \\ &= \frac{1}{4} \bigl(\ln{\vc{u}}^2 \, \ln{\vc{v}}^2 - \ln{\vc{u}}^2 \, \ln{\vc{v}}^2 \cos^2 [\vc{u},\vc{v}]\bigr) \\ &= \frac{1}{4} \bigl( (\vc{u} \cdot \vc{u})(\vc{v} \cdot \vc{v}) - (\vc{u} \cdot \vc{v})^2 \bigr), \\ \end{align} (3.53)
其中最后一步使用了定理 3.1 中的法则 $(iv)$。因此,三角形面积的向量形式为
\begin{equation} a = \frac{1}{2} \sqrt{\bigl( (\vc{u} \cdot \vc{u})(\vc{v} \cdot \vc{v}) - (\vc{u} \cdot \vc{v})^2 \bigr)}. \end{equation} (3.54)
3.6 直线和平面


直线平面是非常常见和重要的几何实体,在许多场景中都很有用,例如判断从虚拟眼睛穿过像素中心发出的射线(即一条直线)是否与几何物体(如球体)相交。更广泛地说,直线平面常用于计算几何、计算机视觉、计算机图形学、计算机辅助设计(CAD)等领域。

3.6.1 直线



本书主要使用线,因此通常简称为线。一条直线可以由一个起点 $S$ 和一个方向 $\vc{d}$ 来描述,如右图所示。为了描述一条直线,有一种能找到线上所有点的表示法会很方便。首先,从右边的点 $P$ 开始,创建一个从 $S$ 到 $P$ 的向量,即 $\overrightarrow{SP}$。如果 $P$ 位于由 $S$ 和 $\vc{d}$ 描述的直线上,则 $\overrightarrow{SP}$ 必须平行于 $\vc{d}$。事实上,必须存在一个标量 $t_1$ 使得 $t_1\vc{d}$ 与 $\overrightarrow{SP}$ 具有完全相同的长度,表示为
\begin{equation} \overrightarrow{SP} = t_1 \vc{d}. \end{equation} (3.55)
由于 $P$ 位于 $\vc{d}$ 的方向上,我们也知道 $t_1>0$。对于同样在直线上的 $Q$,存在另一个标量 $t_2$ 满足:$\overrightarrow{SQ} = t_2 \vc{d}$。由于 $Q$ 位于 $\vc{d}$ 的反方向,显然 $t_2<0$。而对于 $R$,则不存在标量 $t_3$ 满足类似的关系。即对于所有 $t_3$ 的值,$\overrightarrow{SR} \neq t_3 \vc{d}$。$P$ 和 $Q$ 的唯一区别在于它们使用不同的标量 $t_1$ 和 $t_2$。因此,直线上的任意一点都可以用一个特定的标量 $t$ 来描述。因此,我们用 $P(t)$ 表示一个关于标量 $t$ 的函数,它返回一个点 $P$。也就是说,不同的 $t$ 值会生成不同的点 $P$。这个表达式可以改写为
\begin{gather} \overrightarrow{SP(t)} = t\vc{d} \\ \Longleftrightarrow \\ P(t) - S = t\vc{d} \\ \Longleftrightarrow \\ P(t) = S + t\vc{d}. \end{gather} (3.56)
注意直线上的每个点 $P(t)$ 都可由从 $S$ 出发并加上缩放后的方向向量 $t\vc{d}$ 得到 $P(t)$。例如:$P(0) = S$、$P(1) = S + \vc{d}$ 和 $P(-2.5) = S -2.5\vc{d}$。这种参数化直线总结在以下定义中。

定义 3.6: 参数化直线
以 $t\in \R$ 为参数的直线可以由一个起点 $S$ 和一个方向向量 $\vc{d}$ 来描述。直线上的所有点 $P(t)$ 可以表示为
\begin{equation} P(t) = S + t\vc{d}. \end{equation} (3.57)
注意 $\vc{d}\neq \vc{0}$,否则只会生成一个点 $S$(即不构成直线)。
通常说上面的直线是显式形式,这意味着直线上的点 $P(t)$ 可以直接从表达式生成。一维、二维和三维的显式直线可以在下方的交互图 3.15 中找到。
$S$
$P(t)$
$\vc{d}$
$S$
$P(t)$
$\vc{d}$
$S$
$P(t)$
$\vc{d}$
$t$
$P(t) = S + t \vc{d}$
$P(t) = S + t \vc{d}$
交互图 3.15: 该交互图展示了形如 $P(t) = S + t\vc{d}$ 的直线。注意可以拖动滑块来改变 $t$ 的值,从而改变点 $P(t)$ 的位置。首先展示的是一维直线,这里假设为 $x$ 轴。直线的起点 $S$ 可以移动,方向向量 $\vc{d}$ 的长度也可以改变。注意当 $\vc{d}$ 的长度改变并拖动滑块时,点 $P$ 的移动速度会发生什么变化。点击前进查看二维直线。
交互图 3.15: 该交互图展示了形如 $\hid{P(t) = S + t\vc{d}}$ 的直线。注意可以拖动滑块来改变 $\hid{t}$ 的值,从而改变点 $\hid{P(t)}$ 的位置。首先展示的是一维直线,这里假设为 $\hid{x}$ 轴。直线的起点 $\hid{S}$ 可以移动,方向向量 $\hid{\vc{d}}$ 的长度也可以改变。注意当 $\hid{\vc{d}}$ 的长度改变并拖动滑块时,点 $\hid{P}$ 的移动速度会发生什么变化。点击前进查看二维直线。
注意对直线方程 $P(t)-S = t\vc{d}$ 的两边取长度,得到 $\ln{P(t)-S} = \ln{t\vc{d}}$。当直线方向是归一化的,即 $\ln{\vc{d}}=1$ 时,$\abs{t} = \ln{P(t)-S}$。这在计算交点时非常有用,例如直线与球体的交点,详见 3.7 节

回忆二维点 $S$ 有两个标量分量 $(s_x, s_y)$,类似地,二维向量 $\vc{d}$ 有两个标量分量 $(d_x,d_y)$。现在注意,二维直线 $P(t)=S + t\vc{d}$ 可以用向量和点的标量分量表示为
\begin{equation} P(t) = S + t\vc{d} \ \ \ \Longleftrightarrow \begin{cases} p_x(t) = s_x + td_x,\\ p_y(t) = s_y + td_y. \end{cases} \end{equation} (3.58)
下面预览一下第 5 章关于高斯消元法(Gaussian elimination)的内容。将上面一行乘以 $d_y$,下面一行乘以 $d_x$。为清晰起见,$p_x$ 和 $p_y$ 中的参数 $t$ 被省略,得到
\begin{equation} \begin{cases} p_x d_y = s_x d_y + d_x d_y t,\\ p_y d_x = s_y d_x + d_x d_y t. \end{cases} \end{equation} (3.59)
由代数知识可知,只要在等式两边同时减去相同的项就是合法的。因此,可以从上面一行减去下面一行,得到
\begin{equation} p_x d_y - p_y d_x = s_x d_y - s_y d_x + d_x d_y t - d_x d_y t = s_x d_y - s_y d_x \\ \Longleftrightarrow \\ d_yp_x - d_x p_y + s_y d_x - s_x d_y =0, \end{equation} (3.60)
可以看到,$t$ 项已从表达式中消失。这可以进一步改写为
\begin{equation} d_y p_x - d_x p_y + s_y d_x - s_x d_y =0 \\ \Longleftrightarrow \\ a p_x + b p_y + c = 0, \end{equation} (3.61)
其中 $a=d_y$、$b=-d_x$ 且 $c=s_y d_x - s_x d_y$。这个方程可能对一些读者来说很熟悉,特别是当我们令 $x=p_x$ 且 $y=p_y$ 时,得到
\begin{equation} a x + b y + c = 0. \end{equation} (3.62)
当 $b\neq 0$ 时,可以进一步将上述表达式改写为 $y =(-ax -c)/b=$ $kx+m$,其中 $k=-a/b$ 且 $m=-c/b$。这种直线表达式对大多数人来说一定很熟悉,其中 $k$ 描述当 $x$ 增加 1 时 $y$ 的变化量,$m$ 是 $x=0$ 处的 $y$ 值。然而要注意,$a x + b y + c = 0$ 是二维直线更一般的描述,因为它也能描述竖直直线,而 $y=kx+m$ 则做不到。

重要的是注意直线的隐式形式 $a p_x + b p_y + c = 0$ 和直线的显式形式 $P(t) = S + t\vc{d}$ 描述的是完全相同的直线,因为前者是从后者推导出来的。接下来我们将说明,如果标准正交的,显式形式可以用点积来改写。为此,我们引入 $\vc{n} = (n_x,n_y) = (a,b) = (d_y,-d_x)$,得到
\begin{equation} d_y p_x - d_x p_y + s_y d_x - s_x d_y =0 \\ \Longleftrightarrow \\ \vc{n} \cdot (P - S) = 0, \end{equation} (3.63)
其中 $P=(p_x, p_y)$ 且 $S=(s_x, s_y)$。这里利用了在标准正交基中描述向量时 $(d_y, -d_x) \cdot (p_x, p_y) = d_y p_x + (-d_x) p_y$ 这一事实,如定理 3.4 所述。可以看到,如果我们取从 $S$ 到直线上任意一点 $P$ 的向量,则其与 $\vc{n}$ 的点积必须为零,$P$ 才在直线上。有趣的是,我们看到 $\vc{n}\cdot\vc{d} =$ $(d_y,-d_x)\cdot (d_x,d_y) = $ $d_y d_x - d_x d_y = $ $0$,即 $\vc{n}$ 与直线方向 $\vc{d}$ 正交。因此,$\vc{n}$ 通常称为直线法向量(normal)。还要注意,$\vc{n} \cdot (P - S) = 0$ 被称为隐式形式,因为它不能直接生成直线上的点。但它可以直接检验一个点 $P$ 是否在直线上。

这引出了以下二维直线隐式形式的定义。

定义 3.7: 二维隐式直线
直线可以用一个起点 $S$ 和一个法向量 $\vc{n}$ 表示为隐式形式。直线上的所有点 $P$ 可以由下式描述
\begin{equation} \vc{n} \cdot (P - S) = 0. \end{equation} (3.64)
注意 $\vc{n}\neq \vc{0}$,否则所有点 $P$ 都在直线上。
需要注意,定义 3.7 在非正交的情况下仍然成立。也就是说,直线仍可写为 $\vc{n} \cdot (P-S) = 0$,其中 $\vc{n}$ 是直线法向量。然而,计算 $\vc{n}$ 的坐标不再简单,因为一般情况下它不再等于 $\vc{n} = (d_y, -d_x)$。

如上所述,二维直线有两种不同的数学表示。一维或三维直线则不能这样同时写成显式和隐式形式。然而,如 3.6.2 节所示,三维平面方程也有类似的两种表示——隐式和显式。

回到形如 $\vc{n} \cdot (P - S) = 0$ 的二维直线,它表明直线上的所有点 $P$(由 $S$ 和 $\vc{d}$ 表示)都满足上述表达式,即点积等于零。如果 $P$ 不在直线上会怎样?当然点积不会为零,但能否从结果中读出更多信息?事实证明,这个结果可能非常有用。为此,定义一个关于 $P$ 的标量函数 $e$ 为
\begin{equation} e(P) = \vc{n} \cdot (P - S). \end{equation} (3.65)
这个函数有时称为边方程(在计算机图形学中)或有符号距离函数(本节稍后解释)。由于 $e(P)$ 使用点积定义,由 3.4 节可知当夹角满足 $[\vc{n}, P-S] < \pi/2$ 时 $e(P)$ 为正,当 $[\vc{n}, P-S] > \pi/2$ 时 $e(P)$ 为负,仅当 $[\vc{n}, P-S] = \pi/2$ 时 $e(P)=0$。然而 $e(P)=0$ 也意味着 $P$ 在由 $S$ 和 $\vc{d}$ 定义的直线上。因此,当 $e(P)>0$ 时,我们说 $P$ 在直线的正半空间内;当 $e(P)<0$ 时,$P$ 在负半空间内。也就是说,直线将整个二维平面分为两个半空间。如交互图 3.16 所示。
$S$
$P$
$\vc{n}$
$e(P)$
交互图 3.16: 这里可视化了边方程 $e(P) = \vc{n} \cdot (P - S)$。回忆直线由一个起点 $S$ 和一个法向量 $\vc{n}$ 表示,读者可以点击/触摸并拖动来移动它们。注意 $e(P)=0$ 处的直线在图中以虚线表示。带正号和负号的圆圈表示直线哪一侧是正半空间和负半空间。特别建议读者将点 $P$ 移到虚线上,同时留意左下角 $e(P)$ 的计算值。此外,读者应将 $P$ 移到直线的正半空间和负半空间中。最后一个练习:可以对 $\vc{n}$ 进行归一化,即根据点积的定义确保 $\ln{\vc{n}}=1$,并使 $P-S$ 与 $\vc{n}$ 重合。一旦 $\ln{\vc{n}}=1$,$e(P)$ 将显示从虚线到 $P$ 的正交有符号距离。
交互图 3.16: 这里可视化了边方程 $\hid{e(P) = \vc{n} \cdot (P - S)}$。回忆直线由一个起点 $\hid{S}$ 和一个法向量 $\hid{\vc{n}}$ 表示,读者可以点击/触摸并拖动来移动它们。注意 $\hid{e(P)=0}$ 处的直线在图中以虚线表示。带正号和负号的圆圈表示直线哪一侧是正半空间和负半空间。特别建议读者将点 $\hid{P}$ 移到虚线上,同时留意左下角 $\hid{e(P)}$ 的计算值。此外,读者应将 $\hid{P}$ 移到直线的正半空间和负半空间中。最后一个练习:可以归一化 $\hid{\vc{n}}$,即确保 $\hid{\ln{\vc{n}}=1}$,回忆点积的定义,并确保 $\hid{P-S}$ 与 $\hid{\vc{n}}$ 重合。一旦 $\hid{\ln{\vc{n}}=1}$,$\hid{e(P)}$ 将显示从虚线到 $\hid{P}$ 的正交有符号距离。
借助定义 3.1点积),式 (3.65) 可以改写为
\begin{equation} e(P) = \vc{n} \cdot (P - S) = \ln{\vc{n}}\, \ln{P - S} \cos [\vc{n}, P-S]. \end{equation} (3.66)
注意 $\ln{P - S} \cos [\vc{n}, P-S]$ 实际上是 $P$ 到直线正交距离,但需要注意这个“距离”是有符号的。这意味着如果 $P$ 在正半空间内,则有符号距离为正;如果 $P$ 在负半空间内,则有符号距离为负。还要注意,如果 $\vc{n}$ 是归一化的,则 $e(P)$ 恰好是有符号正交投影距离函数,即 $e(P) = \ln{P - S} \cos [\vc{n}, P-S]$。

例 3.8:
研究过点 $S = (2,1)$ 且法向量为 $\vc{n} = (3,4)$ 的直线。点 $P=(x,y)$ 到该直线的距离是多少?$P = (1,1)$ 到该直线的距离是多少?

在前一段中我们看到距离可以用有符号距离函数 $e(P) = \vc{n} \cdot (P - S)$ 来计算。在讨论中我们还看到有符号距离函数可以写成所谓的仿射形式
\begin{equation} e(P) = \vc{n} \cdot (P - S) = ax + by + c . \end{equation} (3.67)
\begin{equation} d = | \frac{\vc{n}}{|\vc{n}|} \cdot (P - S) | \end{equation} (3.68)
在这个具体的例子中我们得到
\begin{equation} d = | \frac{\vc{n}}{|\vc{n}|} \cdot (P - S) | = |(3/5, 4/5) \cdot (x-2,y-1) |= | \frac{3(x-2)+4 (y-1)}{5} |= | \frac{3}{5}x+\frac{4}{5}y-2 | . \end{equation} (3.69)


例 3.9: 游戏渲染
玩电脑游戏时,通常有一个绘制所有图形的图形处理器,该处理器对绘制三角形进行了高度优化。三角形内每个像素的颜色可以用一段简短的程序(称为着色器)来计算。这使得视觉体验非常丰富,如图 3.17 所示。图形处理器中测试像素是否在三角形内部的硬件使用边方程。由于三角形由三条边(或其所在直线)组成,因此创建三个边方程 $e_i(P)$、$i\in\{1,2,3\}$。如果 $e_1(P) \geq 0$ 且 $e_2(P) \geq 0$ 且 $e_3(P) \geq 0$,则中心位置在 $P$ 的像素被认为在三角形内部。图形处理器的硬件设计者和游戏开发者在日常工作中大量使用线性代数。
交互图 3.17: 这是 DICE 开发的电脑游戏 Mirror's Edge Catalyst 的截图。注意图中渲染的每个物体都由一组三角形组成,三角形内每个像素的颜色都由游戏开发者编写的短程序计算得出。为了判断一个像素是否在三角形内,图形处理器通常使用三个边方程(每条边一个)。
(Copyright 2015 Electronic Arts Inc.)
交互图 3.17: 这是 DICE 开发的电脑游戏 Mirror's Edge Catalyst 的截图。注意图中渲染的每个物体都由一组三角形组成,三角形内每个像素的颜色都由游戏开发者编写的短程序计算得出。为了判断一个像素是否在三角形内,图形处理器通常使用三个边方程(每条边一个)。
(Copyright 2015 Electronic Arts Inc.)

3.6.2 平面



三维(及更高维)中的平面类似于二维中的直线,都将其所在空间分为两个半空间。在 3.6.1 节中,我们看到二维直线将 $xy$ 平面分为正半空间和负半空间。与二维直线类似,平面也有两种表示(隐式和显式)。

要以显式形式定义平面(即类似于直线的 $P(t) = S + t\vc{d}$),需要一个起点 $S$ 和两个方向向量 $\vc{d}_1$ 和 $\vc{d}_2$。方向向量不能共线,即对所有 $k$ 的值均有 $\vc{d}_1 \neq k \vc{d}_2$。换句话说,方向向量不能平行,即使方向相反也不行。两个方向向量都在平面内。因此,如果一个点 $P$ 要在平面上,必须满足
\begin{equation} \overrightarrow{SP} = t_1 \vc{d}_1 + t_2\vc{d}_2, \end{equation} (3.70)
$S$
$P$
$\vc{d}_1$
$\vc{d}_2$
对于某些标量 $t_1$ 和 $t_2$ 的值。与直线类似,这个表达式可以改写为如下形式,其中两个标量 $t_1$ 和 $t_2$ 被设为 $P$ 的参数,即
\begin{gather} \overrightarrow{SP(t_1,t_2)} = t_1 \vc{d}_1 + t_2\vc{d}_2 \\ \Longleftrightarrow \\ P(t_1, t_2) - S = t_1 \vc{d}_1 + t_2\vc{d}_2 \\ \Longleftrightarrow \\ P(t_1, t_2) = S + t_1 \vc{d}_1 + t_2\vc{d}_2. \\ \end{gather} (3.71)
这种形式也在右图中展示。可以看到,这与向量加法非常相似。方向向量 $\vc{d}_1$ 和 $\vc{d}_2$ 分别被 $t_1$ 和 $t_2$ 缩放。所得向量与起点 $S$ 相加。这引出了以下定义。

定义 3.8: 参数化平面
以 $t_1\in\R$ 和 $t_2\in\R$ 为参数的平面可以由一个起点 $S$ 和两个方向向量 $\vc{d}_1$ 和 $\vc{d}_2$ 来描述。平面上的所有点 $P(t_1,t_2)$ 可以表示为
\begin{equation} P(t_1, t_2) = S + t_1 \vc{d}_1 + t_2\vc{d}_2. \end{equation} (3.72)
如果 $\vc{d}_1$ 或 $\vc{d}_2$ 中有一个为 $\vc{0}$,或者 $\vc{d}_1$ 和 $\vc{d}_2$ 平行(无论是同向还是反向),则退化为参数化直线方程。
有趣的是,平面方程也有隐式形式。首先将平面方程按分量形式写出,如下所示,其中 $d_{1,y}$ 表示 $\vc{d}_1$ 的 $y$ 分量,依此类推。
\begin{equation} P(t_1, t_2) = S + t_1 \vc{d}_1 + t_2\vc{d}_2 \ \ \ \Longleftrightarrow \ \ \ \begin{cases} p_x(t_1,t_2) = s_x + t_1 d_{1,x} + t_2 d_{2,x},\\ p_y(t_1,t_2) = s_y + t_1 d_{1,y} + t_2 d_{2,y},\\ p_z(t_1,t_2) = s_z + t_1 d_{1,z} + t_2 d_{2,z}. \end{cases} \end{equation} (3.73)
回忆对于二维直线,参数化直线 $P(t)=S+t\vc{d}$ 可以通过消去 $t$ 变换为隐式形式的直线 $\vc{n}\cdot (P-S)$。同样的方法可以应用于上面的式 (3.73),其中 $t_1$ 和 $t_2$ 都可以被消去。这可以用高斯消元法来实现,第 5 章中有一个相关的例子。这里我们直接说明上面的式 (3.73) 可以变换为
\begin{equation} \vc{n} \cdot (P - S) = 0, \end{equation} (3.74)
关于 $t_1$ 和 $t_2$ 的消去过程,请参阅第 5 章了解更多细节。注意 $\vc{n}$ 是平面法向量,即它垂直于平面内的任意向量。$\vc{n}$ 与 $\vc{d}_1$ 和 $\vc{d}_2$ 之间也存在一种关系。这就是叉积(cross product),它是第 4 章的主题。

定义 3.9: 隐式平面方程
平面可以用一个起点 $S$ 和一个法向量 $\vc{n}$ 表示为隐式形式。平面上的所有点 $P$ 可以由下式描述
\begin{equation} \vc{n} \cdot (P - S) = 0. \end{equation} (3.75)
注意 $\vc{d}\neq \vc{0}$,否则该表达式恒为零。
直线的情况完全一样,我们也可以创建有符号距离函数
\begin{equation} e(P) = \vc{n} \cdot (P - S), \end{equation} (3.76)
其中当 $P$ 位于平面上时 $e(P)=0$。此外,当 $P$ 与点 $S+\vc{n}$ 位于平面的同侧时 $e(P)>0$,该侧称为正半空间。类似地,若 $e(P)<0$,则 $P$ 与点 $S-\vc{n}$ 位于平面的同侧。空间的另一部分称为负半空间。

例 3.10: 点到平面的正交投影
在本例中,我们将展示如何将一个点 $P$ 正交投影到由法向量 $\vc{n}$ 和起点 $S$ 定义的平面上。首先,该过程在交互图 3.19 中展示。
$P$
$S$
$\vc{n}$
$\vc{v}$
$\proj{\vc{n}}{\vc{v}}$
$-\proj{\vc{n}}{\vc{v}}$
$Q$
交互图 3.19: 本图将展示如何将一个点 $P$(灰色圆圈)正交投影到由法向量 $\vc{n}$ 和起点 $S$ 定义的平面上。该点可以在图中拖动。点击/触摸下一步开始演示。
交互图 3.19: 本图将展示如何将一个点 $\hid{P}$(灰色圆圈)正交投影到由法向量 $\hid{\vc{n}}$ 和起点 $\hid{S}$ 定义的平面上。该点可以在图中拖动。点击/触摸下一步开始演示。
投影点 $Q$ 的表达式就是
\begin{equation} Q = P - \proj{\vc{n}}{\vc{v}}, \end{equation} (3.77)
其中 $\vc{v}=P-S$。由于投影公式为 $\proj{\vc{n}}{\vc{v}} = \bigl( (\vc{v} \cdot \vc{n})/(\ln{\vc{n}}^2) \bigr)\vc{n}$,即一个标量乘以 $\vc{n}$,我们知道 $\vc{n}$ 是构造 $Q$ 时用到的唯一向量(参与标量值计算的向量除外)。因此,$Q$ 将沿与平面正交的方向投影。事实上,由于 $\vc{v}$ 在 $\vc{n}$ 上的投影被用来移动点 $P$,因此点 $Q$ 也必然位于平面上。不过,我们也可以将 $Q$ 代入平面方程来证明这一点,即验证 $\vc{n} \cdot (Q-S)=0$ 是否成立。推导如下。
\begin{align} \vc{n} \cdot (Q-S) =& \vc{n} \cdot (P - \proj{\vc{n}}{\vc{v}} - S) \\ =& \vc{n} \cdot (\underbrace{P-S}_{\vc{v}} - \proj{\vc{n}}{\vc{v}}) \\ =& \vc{n} \cdot (\vc{v} - \proj{\vc{n}}{\vc{v}}) \\ =& \vc{n} \cdot \vc{v} - \vc{n} \cdot \underbrace{ \Biggl(\frac{\vc{v} \cdot \vc{n}}{\ln{\vc{n}}^2}\vc{n}\Biggr) }_{ \proj{\vc{n}}{\vc{v}} }\\ =& \vc{n} \cdot \vc{v} - \vc{n} \cdot \Biggl(\frac{\vc{v} \cdot \vc{n}}{\ln{\vc{n}}^2}\vc{n}\Biggr)\\ =& \vc{n} \cdot \vc{v} - \frac{\vc{v} \cdot \vc{n}}{\ln{\vc{n}}^2} (\vc{n} \cdot \vc{n})\\ =& \vc{n} \cdot \vc{v} - \frac{\vc{n} \cdot \vc{v}}{\ln{\vc{n}}^2} \ln{\vc{n}}^2 = 0\\ \end{align} (3.78)
注意,将一个点(或向量)投影到平面上的过程也与计算反射向量相似,后者是下文例 3.13 的主题。
接下来是一个同时使用直线方程和平面方程的例子。

例 3.11: 平面上的阴影投影
在本例中,我们假设有一个位于 $L$ 的光源,以及一个具有三个顶点 $V_i$、$i\in \{1,2,3\}$ 的三角形。该三角形将在一个平面上投下阴影,该平面由起点 $S$ 和法向量 $\vc{n}$ 定义,即平面方程为:对所有位于平面上的点 $P$,$\vc{n} \cdot (P-S)=0$。整个过程在交互图 3.20 中展示,读者探索完毕后将给出数学推导。
$L$
$V_1$
$V_2$
$V_3$
$S$
$\vc{n}$
$\vc{d}_1$
$\vc{d}_2$
$\vc{d}_3$
交互图 3.20: 本图展示如何计算投射到平面上的阴影。初始状态下有一个光源(位于 $L$),以黄色圆圈表示,一个具有三个顶点 $V_i$ 的三角形,以及一个地面平面。该平面描述为:$\vc{n}\cdot(P-S)=0$。点击/触摸下一步开始演示。
交互图 3.20: 最终,显示出阴影三角形。注意,光源位置可以在本图中拖动。不过要注意,在某些情况下会出现不可预测的图示。尽管如此,将光源移到三角形下方也是很有趣的。当前的计算仍然会产生阴影(有时称为反阴影),尽管这在物理上并不正确。
为了计算阴影在平面上的“落点”,我们需要为每个顶点创建一条光线。所有三条光线都从光源位置 $L$ 出发,每个顶点对应的方向为:$\vc{d}_i = V_i - L$,即光线方向由 $L$ 和 $V_i$ 之间的线段形成。因此,光线的直线方程为
\begin{equation} R_i(t) = L + t \vc{d}_i, \text{ where } \vc{d}_i = V_i - L, \text{ for } i\in \{1,2,3\}. \end{equation} (3.79)
现在,我们真正要找的是这些光线何时“击中”平面,即需要建立一个同时使用直线方程 $R_i(t)$ 和平面方程 $\vc{n}\cdot(P-S)=0$ 的表达式。由于位于平面上的点 $P$ 满足 $\vc{n}\cdot(P-S)=0$,并且我们还要求这些点 $P$ 也满足直线方程,因此只需在平面方程中将 $P$ 替换为 $R_i(t)$ 并化简即可。推导如下。
\begin{equation} \begin{array}{c} \left. \begin{array}{l} R_i(t) = L + t \vc{d}_i \\ \vc{n}\cdot(P-S)=0 \end{array} \right\} \Longrightarrow \vc{n}\cdot(R_i(t)-S) =0 \\ \Longleftrightarrow \\ \vc{n}\cdot(L + t \vc{d}_i-S) = 0 \\ \Longleftrightarrow \\ \vc{n}\cdot (L-S) + t (\vc{n}\cdot\vc{d}_i) = 0 \end{array} \end{equation} (3.80)
可以看到,这是关于 $t$ 的一次多项式,其解如下(我们现在给 $t$ 添加了下标 $i$,以清楚地表明每个三角形顶点对应一个解),即
\begin{equation} t_i = \frac{-\vc{n}\cdot (L-S)}{\vc{n}\cdot\vc{d}_i} = \frac{\vc{n}\cdot (S-L)}{\vc{n}\cdot\vc{d}_i}. \end{equation} (3.81)
必须避免除以零,因此让我们仔细看看分母 $\vc{n}\cdot\vc{d}_i$,它仅当 $\vc{n} \perp \vc{d}_i$ 时为零。这是合理的,因为如果光线方向平行于平面,光线根本不可能击中平面。或者,光线可能恰好位于平面内,此时有无穷多个解。但这意味着光源和三角形顶点都位于(地面)平面上,这种情况不太可能发生(至少在现实中如此)。

总之,交点计算为 $R_i(t_i) = L + t_i\vc{d}_i$。阴影三角形由 $R_1$、$R_2$ 和 $R_3$ 构成,这正是交互图 3.20 中所做的。
3.7 光线追踪后续


在本章引言(3.1 节)中,交互图 3.1 展示了一个称为光线追踪器的图形程序。一旦掌握了线性代数的相关知识,编写这样一个程序就相当简单。光线追踪器的核心是一个可见性函数,用于确定光线能“看到”哪个物体。
右边展示了一个例子。在光线追踪器中,创建一个具有位置和朝向的虚拟观察者。光线追踪器从该位置沿该方向计算图像。右侧蓝色光线的起点就是观察位置。然后生成一组光线。在最简单的情况下,图像平面中每个像素创建一条光线。接下来由光线追踪程序检查场景中的相关物体,计算穿过像素的光线是否击中物体,并找到最近的物体。对于图 3.21 中的光线,可以看到它击中了三个圆中的两个。但由于黄色圆更近,该像素被着色为黄色。而上方像素对应的光线穿过该像素后会击中绿色圆,因此该像素被着色为绿色。为了生成带有阴影、反射和折射的图像,可以从黄色圆与光线的第一个交点发射更多光线。

本节将展示两个与光线追踪相关的例子。第一个展示如何计算三维光线与三维球体之间的交点。第二个例子展示如何在已知法线的表面上反射一个向量。这两个例子都将点积作为主要工具。

例 3.12: 光线与球体的交点
一个球体可以由半径 $r$ 和球心 $C$ 来定义。球面上的所有点 $P$ 到球心 $C$ 的距离等于半径 $r$。这可以表示为
\begin{equation} \ln{P - C} = r. \end{equation} (3.82)
3.6.1 节所述,三维直线(在这里也称为光线)通常以参数 $t$ 表示,具有一个原点或起点 $S$ 和一个方向 $\vc{d}$。光线的显式形式为(参见定义 3.6
\begin{equation} R(t) = S + t\vc{d}. \end{equation} (3.83)
现在,如果 $R(t)$ 和 $P$ 相同,则光线在该点与球体相交。因此,我们将 $P$ 替换为光线方程 $R(t)$,化简得到
\begin{gather} \ln{P - C} = r \\ \Longleftrightarrow \\ \ln{S + t\vc{d} - C} = r \\ \Longleftrightarrow \\ (S + t\vc{d} - C) \cdot (S + t\vc{d} - C)= r^2 \\ \Longleftrightarrow \\ t^2(\vc{d}\cdot\vc{d}) + 2t(\vc{d}\cdot(S-C)) + (S-C)\cdot(S-C)-r^2 = 0 \\ \Longleftrightarrow \\ at^2 + 2bt +c =0, \end{gather} (3.84)
其中 $a=\vc{d}\cdot\vc{d}$、$b=\vc{d}\cdot(S-C)$ 以及 $c=(S-C)\cdot(S-C)-r^2$。可以看到,这变成了一个二次多项式,可以解析求解,即
\begin{equation} t = \frac{-b \pm \sqrt{b^2 -ac}}{a}. \end{equation} (3.85)
注意,如果 $\vc{d}$ 是归一化的,即 $\ln{\vc{d}}=1$,则 $t$ 就是从原点 $S$ 沿光线到球体与线段交点的距离。但还必须满足 $b^2 -ac \geq 0$,否则 $t$ 将变为复数,而沿光线的虚数距离 $t$ 没有直接的物理意义。因此,当 $b^2 -ac < 0$ 时光线不与球体相交。可以看到,可能有两个解 $t_1$ 和 $t_2$,分别对应进入点和离开点,即光线首先在进入点与球体相交,然后在另一个点离开球体。这些点的计算为 $R(t_1)$ 和 $R(t_2)$。如果 $t_1=t_2$,光线恰好在一个点处与球体相切。所有这些都在下方的交互图 3.22 中展示。
$S$
$\vc{d}$
$R(t_1)$
$R(t_2)$
$C$
交互图 3.22: 一条光线 $R(t) = S + t\vc{d}$ 与一个圆进行相交测试。光线方向和圆心可以通过点击/触摸并拖动来移动。如上所述,推导最终得到一个二次多项式,最多有两个解 $t_1$ 和 $t_2$。这两个解可用于创建两个点 $R(t_1)$ 和 $R(t_2)$,即两个交点。当交点存在时,以红色和绿色实心圆显示。建议读者探索当光线原点位于圆内时交点会发生什么变化,并尝试使 $R(t_1)$ 和 $R(t_2)$ 尽可能接近。
交互图 3.22: 一条光线 $\hid{R(t) = S + t\vc{d}}$ 与一个圆进行相交测试。光线方向和圆心可以通过点击/触摸并拖动来移动。如上所述,推导最终得到一个二次多项式,最多有两个解 $\hid{t_1}$ 和 $\hid{t_2}$。这两个解可用于创建两个点 $\hid{R(t_1)}$ 和 $\hid{R(t_2)}$,即两个交点。当交点存在时,以红色和绿色实心圆显示。建议读者探索当光线原点位于圆内时交点会发生什么变化,并尝试使 $\hid{R(t_1)}$ 和 $\hid{R(t_2)}$ 尽可能接近。

例 3.13: 反射定律
正如本章引言(3.1 节)中的图像所示,球面上的反射图像是可以计算的。为此,需要能够计算反射向量,而反射向量可以通过点积来计算。我们还需要反射定律,即入射角等于反射角。三维向量的情况在交互图 3.23 中展示。
$\vc{i}$
$\vc{n}$
$\vc{i}$
$\proj{\vc{n}}{\vc{i}}$
$-\proj{\vc{n}}{\vc{i}}$
$-\proj{\vc{n}}{\vc{i}}$
$\vc{r}$
交互图 3.23: 本图将展示如何在已知入射向量 $\vc{i}$ 和击中点处的法向量 $\vc{n}$ 的情况下计算反射向量 $\vc{r}$。这里,入射光线 $\vc{i}$ 指向一个灰色点。点击/触摸下一步开始演示。
交互图 3.23: 本图将展示如何在已知入射向量 $\hid{\vc{i}}$ 和击中点处的法向量 $\hid{\vc{n}}$ 的情况下计算反射向量 $\hid{\vc{r}}$。这里,入射光线 $\hid{\vc{i}}$ 指向一个灰色点。点击/触摸下一步开始演示。
我们已经看到了反射向量的几何构造过程(交互图 3.23),现在来看反射向量的数学表达式,即
\begin{align} \vc{r} =& \vc{i} - \proj{\vc{n}}{\vc{i}} - \proj{\vc{n}}{\vc{i}} \\ =& \vc{i} - 2\proj{\vc{n}}{\vc{i}} \\ =& \vc{i} - 2\frac{\vc{i} \cdot \vc{n}}{\ln{\vc{n}}^2}\vc{n}. \end{align} (3.86)
如果 $\vc{n}$ 是归一化的,即 $\ln{\vc{n}}=1$,则上式简化为
\begin{equation} \vc{r} = \vc{i} - 2(\vc{i} \cdot \vc{n})\vc{n}. \end{equation} (3.87)
注意 $\vc{r}$ 必须位于 $\vc{i}$ 和 $\vc{n}$ 所张成的平面内,因为 $2(\vc{i}\cdot\vc{n})$ 是标量,所以只是 $\vc{n}$ 的缩放版本加到了 $\vc{i}$ 上。我们还要证明入射角等于反射角,即 $[-\vc{i},\vc{n}] = [\vc{r},\vc{n}]$(注意 $\vc{i}$ 上的负号,这是必要的,因为 $\vc{i}$ 指向击中点,而 $\vc{r}$ 指向远离击中点的方向)。为简单起见,假设 $\vc{i}$ 和 $\vc{n}$ 是归一化的。这意味着 $\cos [-\vc{i},\vc{n}] = -\vc{i} \cdot \vc{n}$。反射向量 $\vc{r}$ 与向量 $\vc{n}$ 的点积可以如下表示并化简。
\begin{align} \cos [\vc{r},\vc{n}] =& \vc{r} \cdot \vc{n} \\ =& (\vc{i} - 2(\vc{i} \cdot \vc{n})\vc{n})\cdot \vc{n} \\ =& \vc{i}\cdot \vc{n} - 2(\vc{i} \cdot \vc{n}) \underbrace{(\vc{n}\cdot \vc{n})}_{=1} \\ =& \vc{i}\cdot \vc{n} - 2(\vc{i} \cdot \vc{n}) \\ =& - (\vc{i} \cdot \vc{n}) \end{align} (3.88)
可以看到,入射角和反射角的余弦值相同,由于点积只计算向量之间最小的(正)角度,且 $0$ 和 $\pi$ 之间的余弦值是唯一的,因此两个角度也必然相等。对于任意长度的入射向量和向量,这一结论同样成立,不过留作习题。


第 2 章:向量(上一章) 第 4 章:叉积(下一章)
关于本译本