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

正在加载和构建章节...

第3章:点积





3.1 引言


本章介绍一个强大的工具,称为点积。 它是计算机图形学中的基本构建块之一, 在交互式插图 3.1中, 有一个计算机图形学程序称为光线追踪器。光线追踪器的思想是生成一组几何对象的图像 (在下面的情况中,只有球体)。这些对象由 多个位于三维位置的光源照明。用户还必须 设置一个虚拟相机,即相机位置和视野,以及相机的方向(即它朝向哪里)。然后光线追踪器从相机位置沿相机方向追踪光线,穿过 相机图像平面中的一组像素。程序然后找到最近的几何对象, 并确定是否有任何光线从光源直接到达该点(否则,它将处于阴影中)。 也可以追踪反射光线以创建反射对象(例如 交互式插图 3.1中的中间球体)。 通过按下插图下方的开始按钮来试用光线追踪程序。
交互式插图 3.1: 光线追踪程序可以创建像上面这样的图像。注意首先发生"粗糙渲染阶段", 它快速创建质量较低的图像。这是为了保持交互性。用户 可以单击/触摸并移动鼠标/手指(左/右),同时单击/按下以从 另一个视点重新渲染场景。在粗糙渲染阶段之后,发生"精化渲染阶段", 再次渲染像素,但质量更高。 这消除了锯齿边缘(通常称为锯齿),例如球体轮廓上的锯齿边缘。 在该模式下,有一个白色像素显示 当前进度点(从顶部开始,从左到右向下工作)。
交互式插图 3.1: 光线追踪程序可以创建像上面这样的图像。注意首先发生"粗糙渲染阶段", 它快速创建质量较低的图像。这是为了保持交互性。用户 可以单击/触摸并移动鼠标/手指(左/右),同时单击/按下以从 另一个视点重新渲染场景。在粗糙渲染阶段之后,发生"精化渲染阶段", 再次渲染像素,但质量更高。 这消除了锯齿边缘(通常称为锯齿),例如球体轮廓上的锯齿边缘。 在该模式下,有一个白色像素显示 当前进度点(从顶部开始,从左到右向下工作)。
在上面的光线追踪程序中,点积被用于计算光线与球体之间的相交, 并且点积还被用于测量到相交点的长度。 此外,用于计算反射对象的反射定律是使用点积实现的。 当读者了解点积如何工作时,这两个主题将在第 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}$,表示向量是正交的, 也就是垂直。 注意左下角的角度是 $0$,底行中间的角度是 $\pi$ 弧度。在这两种情况下,可以说向量是 共线的,因为它们位于共享的直线上,并且它们实际上也是平行的。 在左下角,向量是平行的并且具有相同的方向,而 在底行中间,向量是平行的但具有相反的方向。 当两个向量平行时,记为 $\vc{u}\, || \,\vc{v}$。 还要注意,如果 $\vc{u}$ 和 $\vc{v}$ 平行,那么对于某个值 $k$,必须满足 $\vc{v} = k \vc{u}$。

我们现在准备好了点积本身的定义:

定义 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{如果 } \vc{u}\neq \vc{0} \text{ 且 } \vc{v}\neq \vc{0},\\ 0, & \text{如果 } \vc{u}=\vc{0} \text{ 或 } \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{\ 即\ } [\vc{u},\vc{v}]=\pi/2 \mathrm{\ 或\ } \vc{u} = 0 \mathrm{\ 或\ } \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 单位向量与标准化



单位向量长度为 1 的向量,即如果 $\ln{\vc{v}}=1$,那么 $\vc{v}$ 是单位向量。 从每个非零向量 $\vc{v}$ 都可以创建一个单位向量。这被称为标准化向量, 这个过程称为标准化标准化向量 $\vc{n}$ 是通过将 $\vc{v}$ 除以其长度 $\ln{\vc{v}}$ 从 $\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}}$,这就得到了通用的正交投影公式
\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{(交换律)} \\ (ii) & k(\vc{u} \cdot \vc{v}) = (k\vc{u}) \cdot \vc{v} & \spc\text{(结合律)} \\ (iii) & \vc{v} \cdot (\vc{u} +\vc{w}) = \vc{v} \cdot \vc{u} + \vc{v} \cdot \vc{w} & \spc\text{(分配律)} \\ (iv) & \vc{v} \cdot \vc{v} = \ln{\vc{v}}^2 \geq 0, \mathrm{当且仅当\ } \vc{v}=\vc{0}时\ 等号成立. & \spc\text{(平方长度)} \\ \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\vc{u},\vc{v}]=[-\vc{u},\vc{v}]=\pi-[\vc{u},\vc{v}]$ 对于负数 $k$。根据三角学知识,我们知道 $\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{标量}}) \vc{v} + (\underbrace{\vc{w} \cdot \vc{v}}_{\text{标量}})\vc{v} = \bigl(\underbrace{(\vc{u}+\vc{w}) \cdot \vc{v}}_{\text{标量}}\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: 正交规范基
对于一个 $n$ 维正交规范基,由向量集合 $\{\vc{e}_1, \dots, \vc{e}_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{二维\ } &:\ \ \vc{u}\cdot\vc{v} = u_xv_x + u_yv_y, \\ \mathrm{三维\ } &:\ \ \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: 柯西-施瓦茨不等式
如果 $\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$


另一个相关的不等式是下面显示的三角不等式

定理 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章关于高斯消元法的内容。将上面的第一行乘以 $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$ 的向量,那么 如果 $P$ 在直线上,它与 $\vc{n}$ 的点积必须为零。 有趣的是,我们看到 $\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}$ 通常被称为直线法向量。另外请注意, $\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$ 的二维直线,这 表示所有在由 $S$ 和 $\vc{d}$ 表示的直线上的点 $P$ 都满足上述表达式,即点积等于零。 如果 $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 制作的电脑游戏《镜之边缘:催化剂》的屏幕截图。注意,在该图像中渲染的每个物体 都由一组三角形组成,其中三角形内每个 像素的颜色都是使用游戏开发者编写的简短程序计算的。要判断 一个像素是否在三角形内部,图形处理器通常使用三个 边方程(三角形的每条边一个)。
(版权 2015 Electronic Arts Inc.)
交互插图 3.17: DICE 制作的电脑游戏《镜之边缘:催化剂》的屏幕截图。注意,在该图像中渲染的每个物体 都由一组三角形组成,其中三角形内每个 像素的颜色都是使用游戏开发者编写的简短程序计算的。要判断 一个像素是否在三角形内部,图形处理器通常使用三个 边方程(三角形的每条边一个)。
(版权 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}$ 可以转换成 隐式形式的直线:$\vc{n}\cdot (P-S)$。这是通过消去 $t$ 完成的,同样的方法 可以应用于上面的方程 (3.73),其中 $t_1$ 和 $t_2$ 都可以被消去。这可以使用 高斯消元法完成,在第 5 章中有一个相关例子。 这里,我们只是说明上面的方程 (3.73) 可以转换成
\begin{equation} \vc{n} \cdot (P - S) = 0, \end{equation} (3.74)
并参考 第 5 章以了解更多关于如何消去 $t_1$ 和 $t_2$ 的细节。 请注意,$\vc{n}$ 是该平面法向量,即它垂直于任何 位于该平面内的向量。在法向量 $\vc{n}$ 和方向向量 $\vc{d}_1$ 与 $\vc{d}_2$ 之间也存在关系 。这就是叉积,这是 第 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$ 的表达式。 由于只有满足 $\vc{n}\cdot(P-S)=0$ 的点 $P$ 才位于平面内, 并且因为我们也希望这些点 $P$ 位于直线方程上,我们可以简单地在 平面方程中用 $R_i(t)$ 替换 $P$ 并简化表达式。这在下面完成。
\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$ 定义。球面则描述为 所有与中心 $C$ 的距离等于半径 $r$ 的点 $P$。这可以表示为
\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$ 相同,那么射线在该点击中球体。 因此,我们用射线方程 $R(t)$ 替换 $P$,并简化得到
\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{r}$,已知 入射向量 $\vc{i}$ 和击中点处的法向量 $\vc{n}$。 在这里,入射射线 $\vc{i}$ 指向一个灰色点。 点击/触摸 前进 开始插图演示。
交互插图 3.23: 本插图将展示如何计算反射向量 $\hid{\vc{r}}$,已知 入射向量 $\hid{\vc{i}}$ 和击中点处的法向量 $\hid{\vc{n}}$。 在这里,入射射线 $\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 章:向量积(下一章)