计算机图形学基础笔记(2.2)

99 阅读13分钟

Category:Higher Mathematics & Computer Graphics Application

正文

2.4 向量

向量描述长度和方向。它可以有用地用箭头表示。如果两个向量具有相同的长度和方向,则它们是相等的,即使我们认为它们位于不同的位置(图 2.11)。您应该尽可能将矢量视为箭头,而不是坐标或数字。
在某些时候,我们将不得不在我们的程序中将向量表示为数字,但即使在代码中,它们也应该作为对象进行操作,并且只有低级向量操作应该知道它们的数字表示(DeRose,1989)。向量将表示为粗体字符,例如,a。向量的长度表示为||a||。单位向量是长度为 1 的任何向量。零向量是零长度的向量。零向量的方向未定义。
image.png
向量可用于表示许多不同的事物。例如,它们可用于存储偏移量,也称为位移。如果我们知道“宝藏在密会场东二步,北三步”,那么我们知道偏移量,但我们不知道从哪里开始。向量也可用于存储位置,即位置或点的另一个词。位置可以表示为从另一个位置的位移。通常有一些理解的原始位置,所有其他位置都从该位置存储为偏移量。请注意,位置不是向量。正如我们将要讨论的,您可以添加两个向量。然而,添加两个位置通常没有意义,除非它是计算位置加权平均值时的中间操作(Goldman,1985)。添加两个偏移量确实有意义,因此这就是为什么偏移量是向量的原因之一。但这强调了位置不是偏移量;它是从特定原点位置的偏移量。偏移量本身不是位置。

2.4.1矢量操作

向量具有我们与实数相关联的大多数常用算术运算。两个向量相等当且仅当它们具有相同的长度和方向。根据平行四边形规则添加两个向量。该规则规定,通过将任一向量的尾部靠在另一个向量的头部来找到两个向量的和(图 2.12)。
image.png
和向量是由两个向量开始的“完成三角形”的向量。通过按任一顺序求和来形成平行四边形。这强调了向量加法是可交换的:
image.png
请注意,平行四边形规则只是形式化了我们对位移的直觉。
想想沿着一个向量,从头到尾,然后沿着另一个向量走。净位移就是平行四边形对角线。您还可以为向量创建一元减号:-a(图 2.13)是与 a 长度相同但方向相反的向量。
image.png
这使我们还可以定义减法:
image.png
您可以使用平行四边形来可视化矢量减法(图 2.14)。
image.png
我们可以写
image.png
向量也可以相乘。事实上,涉及载体的产品有好几种。首先,我们可以通过将向量乘以实数 k 来缩放向量。
这只是乘以向量的长度而不改变其方向。例如,3.5a 是一个与 a方向相同的向量,但它的长度是 a 的 3.5 倍。我们将在本节后面讨论涉及两个向量的两个乘积,点积和叉积,在第 5 章讨论一个涉及三个向量的乘积,即行列式。

2.4.2 向量的笛卡尔坐标

二维向量可以写成任意两个不平行的非零向量的组合。两个向量的这种性质称为线性独立。两个线性独立的向量形成一个二维基,因此这些向量被称为基向量。例如,向量 c 可以表示为两个基向量 a 和 b 的组合(图 2.15):
image.png
image.png
请注意,权重 ac 和 bc 是唯一的。如果两个向量是正交的,即它们彼此成直角,则基特别有用。如果它们也是单位向量,在这种情况下它们是正交的,那就更有用了。如果我们假设我们已知两个这样的“特殊”向量 x 和 y,那么我们可以使用它们来表示笛卡尔坐标系中的所有其他向量,其中每个向量都表示为两个实数。例如,向量 a 可以表示为
image.png
其中 xa 和 ya 是二维向量 a 的真实笛卡尔坐标(图 2.16)。
image.png
请注意,这在概念上与等式(2.3)没有任何不同,其中基向量不是正交的。但是笛卡尔坐标系有几个优点。例如,根据勾股定理,a 的长度为
image.png
在笛卡尔系统中计算点积、叉积和向量坐标也很简单,我们将在以下部分中看到。 按照惯例,我们将 a 的坐标写为有序对 (xa, ya) 或列矩阵:
image.png
我们使用的形式将取决于排版的便利性。我们偶尔也会将向量写为行矩阵,我们将其表示为 aT
image.png
我们还可以在笛卡尔坐标中表示 3D、4D 等向量。对于 3D 情况,我们使用与 xy 都正交的基向量 z

2.4.3 Dot Product

将两个向量相乘的最简单方法是点积。 a 和 b 的点积表示为 a·b,通常称为标量积,因为它返回一个标量。点积返回一个与其参数的长度和它们之间的角度 φ 相关的值(图 2.17)
image.png
image.png
图形程序中点积最常见的用途是计算两个向量之间夹角的余弦值。点积也可用于找到一个向量到另一个向量的投影。这是以直角投影到向量 b 上的向量 a 的长度 a→b(图 2.18):
image.png
image.png
点积遵循我们在实数算术中熟悉的结合和分配性质:
image.png
如果二维向量 a 和 b 用笛卡尔坐标表示,我们可以利用 x · x = y · y = 1 和 x · y = 0 推导出它们的点积为
image.png
同样在三维中,我们可以得出:
image.png

2.4.4 叉积

叉积 a × b 通常只用于三维向量;在章节注释中给出的参考文献中讨论了广义叉积。叉积返回一个垂直于叉积的两个参数的 3D 向量。结果向量的长度与 sin φ 有关:
image.png
||a×b||等于由向量 a 和 b 形成的平行四边形的面积。此外,a × b 垂直于 a 和 b(图 2.19)。
image.png
请注意,这样的向量只有两个可能的方向。根据定义,x、y 和 z 轴方向上的向量由下式给出
image.png
我们约定 x × y 必须在正或负 z 方向。
选择有点武断,但标准假设是
image.png
三个笛卡尔单位向量的所有可能排列是
image.png
由于 sin φ 的性质,我们也知道一个向量本身是零向量,所以 x × x = 0 等等。请注意,叉积不可交换,即 x × y != y × x。细心的观察者会注意到,上述讨论不允许我们清楚地描绘笛卡尔轴之间的关系。更具体地说,如果我们把 x 和 y 放在人行道上,x 指向东,y 指向北,那么 z 是指向天空还是指向地面?通常的约定是让 z 指向天空。这被称为右手坐标系。这个名字来自于用你的右手掌和手指“抓住” x 并将其向 y 方向旋转的记忆方案。矢量 z 应该与您的拇指对齐。如图 2.20 所示。
image.png
叉积具有很好的性质
image.png
并且
image.png
然而,右手定则的结果是
image.png
在笛卡尔坐标中,我们可以使用显式展开来计算叉积:
image.png
所以,在坐标形式中,
image.png

2.4.5 正交基和坐标系

管理坐标系是几乎所有图形程序的核心任务之一;关键是管理正交基。任何两个 2D 向量 u 和 v 的集合形成一个正交基,前提是它们是正交的(成直角)并且每个都是单位长度。因此,
image.png
而且
image.png
在 3D 中,三个向量 uvw 形成一个正交基,如果
image.png
并且
image.png
这个正交基是由右手提供的
image.png 否则它是左手的
请注意,笛卡尔标准正交基只是无限多可能的正交基之一。它的特别之处在于它及其隐含的原始位置用于程序中的低级表示。因此,向量 x、y 和 z 永远不会被显式存储,规范原点位置 o 也不会被显式存储。全局模型通常存储在此规范坐标系中,因此通常称为全局坐标系。但是,如果我们想使用具有原点 p 和正交基向量 u、v 和 w 的另一个坐标系,那么我们会明确存储这些向量。这样的系统称为参考系或坐标系。例如,在飞行模拟器中,我们可能希望保持原点位于飞机机头的坐标系,并且正交基准与飞机对齐。同时,我们将拥有主规范坐标系(图 2.21)。与特定对象(例如平面)相关联的坐标系通常称为局部坐标系。
image.png
(总有一个主坐标系或“规范”坐标系,原点为 o,正交基为 x、y 和 z。该坐标系通常被定义为与全局模型对齐,因此通常称为“全局”或“世界”坐标系。这个原点和基向量从不明确存储。所有其他向量和位置都与将它们与全局框架相关的坐标一起存储。与平面关联的坐标系以全局坐标的形式显式存储)
在低级别,局部坐标系存储在规范坐标中。例如,如果 u 有坐标 (xu, yu, zu)
image.png
位置隐含地包括从规范原点的偏移量
image.png
其中 (xp, yp, zp) 是 p 的坐标。
请注意,如果我们存储一个相对于 u-v-w 框架的向量 a,我们存储一个三元组 (ua, va, wa),我们可以将其几何解释为
image.png
要获得存储在 u-v-w 坐标系中的向量 a 的规范坐标,只需回忆一下 u、v 和 w 本身是根据笛卡尔坐标存储的,因此如果显式求值,表达式uau + vav + waw已经在笛卡尔坐标中。要获得存储在规范坐标系中的向量 b 的 u-v-w 坐标,我们可以使用点积:
image.png
这是可行的,因为我们知道对于某些 ub、vb 和 wb,
image.png
点积能分离出ub的坐标:
image.png
这是因为U,V和W是正顺序的。
在第6.2.1和6.5节中讨论了使用矩阵来管理坐标系的更改。\

2.4.6 从单个向量构建基础

通常我们需要一个与给定向量对齐的正交基。也就是说,给定一个向量 a,我们想要一个正交的 u、v 和 w,使得 w 指向与 a 相同的方向(Hughes & M¨oller,1999),但我们并不特别关心 u 和 v 是什么.一个向量不足以唯一确定答案;我们只需要一个强大的程序来找到任何一个可能的基础。
这可以使用叉积来完成,如下所示。首先将 w 设为 a 方向的单位向量:
image.png
然后选择与 w 不共线的任意向量 t,并使用叉积构建一个垂直于 w 的单位向量 u:
image.png
如果 t 与 w 共线,则分母将消失,如果它们几乎共线,则结果将具有低精度。找到与 w 完全不同的向量的一个简单过程是从 t 等于 w 开始,并将 t 的最小幅度分量更改为 1。例如,如果 w = (1/ √ 2, -1/ √ 2, 0)那么 t = (1/ √ 2, -1/ √ 2, 1)。一旦掌握了 w 和 u,完成基础就很简单了:
image.png
使用此构造的一个示例是表面着色,其中需要与表面法线对齐的基础,但围绕法线的旋转通常并不重要。

2.4.7 从两个向量构造一个基

上一节中的过程也可用于基础围绕给定向量的旋转很重要的情况。一个常见的例子是为相机构建基础:让一个矢量与相机的视线方向对齐很重要,但相机围绕该矢量的方向不是任意的,需要以某种方式指定。一旦确定了方向,基础就完全确定了。
完全指定框架的常用方法是提供两个向量 a(指定 w)和 b(指定 v)。如果已知这两个向量是垂直的,那么通过 u = b × a 构造第三个向量是一件简单的事情。

u = a × b 也产生一个正交基,但它是左手的。

为了确保得到的基确实是正交的,即使输入向量不完全,也建议使用类似于单向量过程的过程:
image.png

如果您希望我将 w 和 v 设置为两个不垂直的方向,则必须给出一些东西——使用此方案,我将按照您想要的方式设置所有内容,除了我将对 v 进行最小的更改,以便它实际上垂直于w。

事实上,当 a 和 b 不垂直时,这个过程就可以正常工作。在这种情况下,w 将精确地在 a 的方向上构造,并且 v 被选择为所有垂直于 w 的向量中最接近 b 的向量。

如果 a 和 b 并行,计算会出现什么问题?

如果 a 和 b 共线,此过程将不起作用。在这种情况下,b 对选择我们应该使用哪个垂直于 a 的方向没有帮助:它垂直于所有方向。
在指定摄像机位置的示例中(第 4.3 节),我们要构建一个框架,其中 w 平行于摄像机的观察方向,并且 v 应该指向摄像机的顶部。为了使相机垂直定向,我们围绕视图方向构建基础,使用垂直方向作为参考向量来确定相机围绕视图方向的方向。将 v 设置为尽可能接近笔直与“保持相机笔直”的直观概念完全吻合。

2.4.8 求平方

有时,您可能会发现计算中出现的问题是由应该是正交的基但由于计算中的舍入误差或由于存储在低精度文件中的基而出现错误而引起的。
可以使用上一节的程序;简单地使用现有的 w 和 v 向量重新构造基础将产生一个新的正交基础,并且接近旧的基础。
这种方法适用于许多应用程序,但不是最好的。
它确实会产生精确的正交向量,并且对于几乎正交的起始基数,结果不会偏离起始点太远。然而,它是不对称的:它“支持” w 胜过 v 和 v 胜过 u(其起始值被丢弃)。
它选择一个接近起始基的基,但不能保证选择最接近的正交基。当这还不够好时,可以使用 SVD(第 5.4.1 节)来计算保证最接近原始基的正交基。