1.1 向量
计算机绘图、碰撞检测和物理模拟是现代视频游戏的基本组成部分,向量(vector)在
这些领域中具有至关重要的作用。本书所采用的教学方式与普通教科书不同,我们所提供的
所有的知识都是基于实践的;我们在这里为读者推荐一本专门讲解 3D 游戏与绘图的数学教
程[Verth04]。读者在本书的每个演示程序中都会看到一些注释,我们通过这些注释来强调向
量的重要性。
学习目标
1.学习使用几何与数值方式表示向量。
2.了解向量运算及向量的几何应用。
3.熟悉 XNA 数学中的向量函数和向量类。
向量(vector)是一种同时具有大小和方向的物理量(quantity)。同时具有大小和方向
的物理量称为向量值物理量(vector-valued quantity)。常见的向量值物理量有:力(在某个
特定方向上施加一定的作用力——量值),位移(在某个净方向上移动一段距离),速度(速
率和方向)。因此,向量可以用来表示力、位移和速度。有时我们也用向量来表示一个单个
方向,比如玩家在 3D 游戏中的观察方向、多边形面对的方向、光线的传播方向以及从一个
物体表面折回的反射光方向。
首先,我们从几何学角度描述向量的算术特征:我们通过一个有向线段来表示向量(参
见图 1.1),其中长度表示向量的大小,箭头表示向量的方向。我们注意到,向量所描绘的位
置并不重要,改变向量的位置并不会影响向量的大小和方向(这是向量具有的两个属性)。
也就是,当且仅当两个向量具有相同的长度和方向时,我们说这两个向量相等。所以,图
1.1a 中的两个向量 u 和 v 实际上是相等的,因为它们具有相同的长度和方向。其实,位置对
于向量来说无关紧要,我们可以随便平移一个向量,但是不会改变该向量所表示的含义(因
为平移即不会改变向量的长度,也不会改变向量的方向)。注意,我们可以平移 u,使它与
v 重叠(反之亦然),由此使它们彼此难以区分——因为它们是相等的。举一个物理上的例
子,图 1.1b 中的向量 u 和 v 表示位于不同位置上的两只蚂蚁 A 和 B 从当前位置开始向北移
动 10 米。也就是这里的 u=v。由于向量本身与位置无关;所以它们只是告诉蚂蚁该从当前
位置向哪个方向移动,以及移动多远的距离。在本例中,它们告诉蚂蚁向北(方向)移动
10 米(长度)。
图 1.1 (a)绘制在 2D 平面上的向量。(b)向量告诉蚂蚁向北移动 10 米。
1 / 529
1.1.1 向量和坐标系
我们现在学习如何定义用于几何运算的向量,随后我们要用向量来解决各种向量值问题。
不过,我们无法在计算机中以几何方式表示向量,我们必须寻求一种替代方案,以数字方式
表示向量。所以我们在空间中引入了 3D 坐标系的概念,并将所有的向量尾部平移到坐标系
原点(图 1.2)。然后通过指定向量首部的坐标来表示一个向量,记作 v= (x,y,z),如图 1.3 所
示。现在,我们可以在计算机程序中用 3 个浮点数来表示一个向量了。
图 1.2 平移向量 v,使它的尾部与坐标系的原点对齐。当一个向量的尾部与原点对齐时,我
们说该向量位于标准位置。
图 1.3 以坐标表示的相对于坐标系的向量。
注意:若只处理 2D,那么只需要使用一个 2D 坐标系统,向量只有两个坐标:v= (x,y),
在计算机程序中可以用 2 个浮点数来表示一个向量。
考虑图 1.4,它展示了一个向量 v 以及空间中的两个参照系。注意,我们在本书中使用
术语 frame、参照系(frame of reference)、空间(space)、坐标系(coordinate system)来表
示相同含义。我们平移 v,使它位于两个参照系的标准位置上。可以看到,向量 v 相对于参
照系 A 的坐标不同于向量 v 相对于参照系 B 的坐标。换句话说,对于不同的参照系,同一
个向量会有不同的坐标。
2 / 529
图 1.4 当以不同参照系描述时,同一个向量 v 会有不同的坐标。
这一概念说起来与物理学中的温度颇为相似。水的沸点是摄氏 100º或华氏 212º。使水
沸腾的物理温度是相同的,与温标无关(即,我们不可能通过改变温标来提高或降低水的沸
点),但是我们必须根据当前选用的温标来指定不同的标量值。同样,对于一个向量来说, 它
的方向和大小被牢牢地固定在有向线段中,不会改变;只有在以不同的参照系描述向量时,
它的坐标才会改变。这一点很重要,因为我们无论何时通过坐标来表示一个向量,这些坐标
都是相对于某一参照系的。通常在 3D 计算机绘图中我们使用的参照系不只一个,所以必须
保证向量坐标与对应的参考系一致;另外,我们需要知道如何完成从一个参照系到另一个参
照系的向量坐标转换。
注意:我们看到,在一个参照系中向量和点都可以使用坐标(x,y,z)来描述。但是,它们
的意义完全不同;点表示的是三维空间中的位置,而向量表示的是大小和方向。点会在随后
的 1.5 节中讨论。
1.1.2 左手坐标系和右手坐标系
Direct3D 使用所谓的左手坐标系(left-handed coordinate system)。假如你把左手手指指
向 x 轴正方向,然后朝 y 轴正方向弯曲四指,大拇指就会指向 z 轴正方向。图 1.5 展示了左
手坐标系和右手坐标系之间的区别。
3 / 529
图 1.5 左边是左手坐标系,z 轴正方向向页面内部延伸。右边是右手坐标系,z 轴正方向向
观察右手坐标系。假如你把右手手指指向 x 轴正方向,然后朝 y 轴正方向弯曲四指,大
页面外部延伸。
拇指就会指向 z 轴正方向。
1.1.3 基本向量运算
现在,我们使用坐标来描述向量的判等运算、加法运算、标量乘法运算和减法运算。我
们设 u=(ux,uy,uz)和 v=(vx,vy,vz)。
1.当且仅当两个向量的各自分量相等时,这两个向量相等。也就是说,仅当 ux=vx、uy=vy、
uz=vz 时,u=v。
2.两个向量的对应分量可以相加;仅当两个向量的维度相同时,向量分量加法才有意
义。u+v= (ux+vx,uy+vy,uz+vz)。
3.标量(即,实数)可以与向量相乘,所得结果仍为向量。设 k 为标量,则 ku=(kux,kuy,kuz)。
这种向量运算称为标量乘法。
4 . 减 法 可 以 通 过 向 量 加 法 和 标 量 乘 法 来 表 示 。 也 就 是 , u−v=u+(−1 · v)
=u+(−v)=(ux−vx,uy−vy,uz−vz)。
例 1.1
设 u= (1,2,3)、v= (1,2,3)、w=(3, 0, −2)、k=2。则,
1.u+w= (1, 2,3) + (3, 0, −2) = (4, 2,1);
2.u=v;
3.u−v=u+ (−v) = (1,2,3) + (−1, −2, −3) = (0, 0,0) = 0;
4.kw=2(3, 0, −2) = (6, 0, −4)。
第 3 行例举了一个特殊的向量,称为零向量。零向量的所有分量均为零,它可以由 0
来表示。
例 1.2
我们将用个例子来解释如何使用 2D 向量来简化绘图操作。3D 向量的原理基本相同,
4 / 529
只是比 2D 向量多了一个分量而已。
1.设 v= (2,1)。在几何学中 v 和−v/2 是如何进行比较的呢?把 v 和−v/2 同时绘制出来
(图 1.6a),我们注意到−v/2= (−1, −1/2),它们的方向恰好相反,而−v/2 的长度是 v 的一半。
所以,在几何学中对向量取负值可以“反转”向量的方向,而标量乘法可以缩放向量的长度。
图 1.6 (a)标量乘法的几何表示。(b)向量加法的几何表示。(c)向量减法的几何表示。
2.设 u= (2,1/2)、v= (1,2),则 u+v= (3,5/2)。图 1.6b 描绘了向量加法在几何学中的含义:
对 u 进行平移,使其尾部与 v 的首部对齐。那么,二者之和等于从 v 的尾部开始、到 u 的
首部结束的向量。(如果我们保持 u 的位置不变,对 v 进行平移,使 v 的尾部和 u 的首部对
齐,那么得到的结果完全相同。此时,u+v 所得的向量从 u 的尾部开始、到平移后的 v 的首
部结束。)另外,我们还可以看到向量加法的运算规则与我们根据自然规律从生活经验中判
断出的结果一致,当我们把多个作用力加在一起时, 可以得到一个最终的净作用力:如果
将同一个方向上的两个作用力(向量) 相加,那么就可以得到该方向上的一个更大的作用
力(更长的向量)。如果将两个方向相反的作用力(向量)相加,那么就会得到一个较小的
净作用力(较短的向量)。图 1.7 说明了这一概念。
图 1.7 施加在一个球上的作用力。向量加法将些作用力合为一体,得到一个净作用力。
3.设 u=(2,1/2)、v= (1,2),则 v-u= (−1,3/2)。图 1.6c 说明了向量减法的几何含义。本质
上,v−u 得到的差值等于从 u 的首部开始、到 v 的首部结束的一个向量。如果我们把 u 和 v
视为点而不是向量,那么 v−u 得到的差值就等于从点 u 开始、到点 v 结束的一个向量;这
种解释方式非常重要,因为我们经常需要从一点指向另一点的向量。同时我们还可以看到,
当把 u 和 v 视为点时,v−u 的长度就是从 u 到 v 的距离。
5 / 529
1.2 长度和单位向量
在几何学中,向量的大小等于有向线段的长度。我们用双竖线来表示向量的大小(例
如,‖u‖表示 u 的大小)。现在,给出一个向量 u=(x,y,z),我们希望以代数方式计算它的大
小。通过运用两次毕达哥拉斯定理可以计算出 3D 向量的大小(译者注:毕达哥拉斯定理和
勾股定理的概念相同,换言之,毕达哥拉斯定理就是勾股定理);参见图 1.8。
图 1.8 通过运用两次毕达哥拉斯定理计算 3D 向量的长度。
首先,我们来看 xz 平面上的三角形边 x、z 及斜边 a。由毕达哥拉斯定理可知
a
2
x
2
。
z
现在来看三角形边 a、y 及斜边‖u‖。通过再次使用毕达哥拉斯定理,可以得到如下求模公
式:
u
2
y
2
a
2
y
(
2
x
z
2 2
)
2
x
2
y
2
z
(1.1)
在某些应用中,我们不关心向量的长度, 只希望用向量来表示一个单纯的方向。对于
这种只表示方向、不表示大小的向量,我们希望将其长度精确地设定为 1。当我们想要让一
个向量具有单位长度时,我们说要对该向量进行规范化。我们将向量的每个分量除以该向量
的模,得到规范化向量:
ˆ
u
u
u
x
u
,
y
u
,
z
u
(1.2)
要验证这个公式的正确性,只需计算 ˆu 的长度即可:
ˆ
u
x
u
2
y
u
2
z
u
2
2
x
2
2
z
2
y
u
u
u
1
因此, ˆu 确实是一个单位向量。
例 1.3
对 向 量 v= (−1,3,4) 进 行 规 范 化 。 我 们 计 算
v
2
( 1)
2
3
2
4
26
。 则 ,
6 / 529
ˆ
v
,
3
26
1
26
v
v
要验证 ˆv 是否为单位向量,只需计算它的长度:
4
26
ˆ
v
2
1
26
2
3
26
2
4
26
1
26
9
26
16
26
1 1
7 / 529
1.3 点积
点积(dot product)是向量乘法的一种形式,它的计算结果是一个标量值;由于这一原
因,有时也将点积称为标量积(scalar product)。设 u=(ux,uy,uz),v=(vx,vy,vz),则点积定
义如下:
u v
u v
x x
u v
y
y
u v
z
z
(1.3)
简言之,点积等于两个向量对应分量的乘积之和。
点积的定义不存在任何明显的几何含义。但是,使用余弦定理可以发现存在如下关系:
u v
u v
cos
(1.4)
其中,θ表示向量 u 和 v 之间的夹角,且 0≤θ≤π(参见图 1.9)。公式 1.4 说明这两个向
量的点积等于向量夹角的余弦值和向量模之间的乘积。在特殊情况下,如果 u 和 v 都是单
位向量,那么 u∙v 就等于它们之间夹角的余弦值(即,u∙v=cosθ)。
图 1.9 在左图中,u、v 之间的夹角θ为锐角。在右图中,u、v 之间的夹角θ为钝角。记住,
当我们提及两个向量之间的夹角时,通常指的是最小的角,也就是角度θ,且 0≤θ≤π。
公式 1.4 提供了一些有用的点积的几何性质:
1.如果 u∙v=0,则 u⊥v(即,向量相互垂直)。
2.如果 u∙v>0,则两个向量之间的夹角θ小于 90º(即,向量形成一个锐角)。
3.如果 u∙v<0,则两个向量之间的夹角θ大于 90º(即,向量形成一个钝角)。
注意:“相互垂直”也可称为“互成直角”。
【例 1.4】
设 u=(1, 2,3)、v=(−4, 0, −1)。求 u 和 v 之间的夹角。首先,我们要做如下计算:
u v
u
v
4 3
(1,2,3) ( 4,0, 1)
2
2
1
14
2
2
( 4)
( 1)
3
3
2
0
17
2
7
现在,由公式 1.4 解得θ为:
cos
cos
u v
u v
14 17
7
1
7
14 17
117
【例 1.5】
8 / 529