3D Mathematics 01 - Vector
# 概述
向量 (Vector) 在任何3D游戏引擎中都是至关重要的。它们用于表示空间中的点,例如3D空间中对象的位置或者三角形网格的顶点。它们还用于表示空间方向,例如摄像机的方向或者三角形网格的表面法线。因此我们有必要熟知如何操作向量。
本文假设读者对向量已有基本的认识,因此会略去书中一些太过于简单的内容。
在不同的地方对向量有不同的定义,在3D图形中,我们定义一个 维向量 为:
它的矩阵表示形式是一个 维列向量:
它的转置是一个 维行向量:
我们将这个 维列向量 视为与前述基本定义式等价的表达。
特别地,在3D图形中我们最常用到的是三维向量,常用三个坐标轴作为脚标,记为 ,其矩阵表示类同。
# 基本性质
# 向量的标量乘法
设 是一个 维向量, 是一个标量 (Scalar) ,定义向量的标量乘法为:
特别地,当 时,记 为 的反向向量。
# 向量的加法
设 是两个 维向量,定义向量的加法为:
定义向量的减法为:
# 向量的加法和标量乘法的运算律
向量的加法和标量乘法满足交换律和结合律。设 是 维向量, 是标量,则:
这些运算律都很简单,因此略去证明过程。
# 向量的模
设 是一个 维向量,定义 的 模 (magnitude) 为:
特别地,当 时,称 为 维 单位向量 (unit vector) 。
称对 乘以标量 的过程为向量的 归一化 (normalization) 操作,因为 。
设 是 维向量, 是一个标量,则:
恒成立,且 当且仅当 。
这些性质都很简单,因此略去证明过程。
# 点积
# 定义
两个向量的 点积 (dot product) ,也称为标量积 (scalar product) 或内积 (inner product) ,它提供了对两个矢量的方向之间的差异的度量,是3D图形中最常用的向量操作之一。
设 是两个 维向量,定义向量的点积为:
点积的结果是一个标量。
亦可用矩阵表示形式来定义点积,结果为一个 的矩阵,可以看作标量:
# 基本性质
若 是 之间的夹角,则点积的结果满足:
这很简单,但也很重要,它说明了点积的重要价值。
点积的结果与夹角 密切相关,例如其值的正负反映了 之间的夹角是锐角还是钝角。特别地, 当且仅当 。
# 运算律
设 是 维向量,则:
# 水平分量和垂直分量
我们经常需要将一个向量 分解为与另一个向量 平行和垂直的两个分量。如图所示,我们将 视为直角三角形的斜边,那么 在 上的投影的长度为 ,即 。
Figure 2.4
为了获得具有该长度并且与 平行的向量,我们简单地乘以单位向量 。我们现在定义 在 上的 投影 (projection) 方向,即 相对于 的水平分量为:
定义 相对于 的 垂直 (perpendicular) 分量为:
因为 在 上的投影是 的线性变换,所以可以表示为矩阵乘法的形式。以三维向量为例:
# 叉积
# 定义
注意,我们仅在三维空间下考虑叉积,即便有时叉积可以扩展到二维空间中。
两个三维向量的 叉积 (cross product) ,也称为向量积 (vector product) ,它会返回一个垂直于两个向量、并因此垂直于该平面的新的向量。叉积在计算机图形学中具有许多用途,其中之一是在给定两个不同切向量的情况下计算特定点处的表面法线的方法。
设 是两个三维向量,定义三维向量的叉积为:
叉积的结果是一个向量。
这种形式看起来很不直观,我们更多地会用行列式或矩阵的表示形式。
# 行列式形式的定义
可以用行列式表示形式来定义叉积。定义三个单位向量为:
那么我们可以定义三维向量的叉积为:
展开即可得到:
另外,这三个单位向量的叉积的结果满足:
# 矩阵形式的定义
亦可用矩阵表示形式来定义叉积,结果为一个三维列向量:
# 基本性质
前文已经提到过,叉积的基本性质是 与 都垂直。也就是说, 和 恒成立。
对于三维向量 ,我们可以用类似的行列式形式来表示 的结果:
如果 中的某个向量可以被另外两个向量线性表示,则 ,其中 或 的情形被包括在内。
若 是 之间的夹角,则叉积的结果满足:
证明如下:
如图所示,叉积的模表示了一个平行四边形的面积,其边由向量 构成。
因此,给定一个三角形的三个顶点的坐标 ,我们可以直接用叉积计算出三角形的面积:
# 右手法则
如果细心的话你会注意到,我们规定叉积的结果 与两个参与运算的向量 垂直,但是这并不能唯一地确定 的方向,只能确定它所处的直线,但是它有两个可选的朝向。事实上,叉积的结果遵循 右手法则 (right-hand rule) 来确定其朝向。
如图所示,举起你的右手,四指并拢,与拇指垂直,让四指的方向绕环地从 指向 ,此时拇指所指的方向就是 的方向。
# 运算律
设 是三维向量, 是标量,则:
对于倒数第二条规则,证明如下:
首先,运用第一条规则可以证明:
考虑叉积的表达式:
用 和 分别替换 和 可得:
下面我们计算 在 方向上的分量:
同理可以计算在 和 方向上的分量,因此有:
# 向量空间
目前为止我们所介绍的所有向量都属于被称为 向量空间 (vector space) 的向量集合。
(unfinished)
- 01
- Reading Papers - Kernel Concurrency06-01
- 02
- Linux Kernel - Source Code Overview05-01
- 03
- Linux Kernel - Per-CPU Storage05-01