一、向量
目标:
- 向量的定义和表示方式。
- 向量的标准化。
- 向量的运算,包括加减、数乘、点乘、叉乘
- 坐标系和齐次坐标系
- XNA库中向量的表示和操作方法
1.1 向量的概念
只有大小的量叫做标量(Scalar);既有大小又有方向的量叫做向量(Vector);
由定义可知:向量与位置无关,即处于不同位置的两个向量,只要大小和方向相同,我们就是说他们相等。
1.1.1 向量的表示
向量最初被应用于物理学,数学中的向量是从复数中引入的。在数学中,向量有以下三种表示形式:
a. 几何表示:规定了起点和终点的有向线段。
b. 坐标表示:在坐标系中平移向量,使向量的起点与原点重合,此时向量终点的坐标用于表示改向量。
在坐标表示形式中,向量和点的表示形式没有差别,都是形如 或 的形式,因此需要根据上下文理解。
而齐次坐标的表示就是为了解决这样的歧义,该表示方式通过增加一个维度来标识点或向量。
c. 线性组合表示: 其中 表示单位向量,这种表示方法与坐标表示是对应的。
1.1.2 左手坐标系与右手坐标系
三维空间有多种表示方法,最常用的方法是笛卡尔坐标系。三维笛卡尔坐标系基于三条相互垂直的坐标轴:x轴、y轴、z轴。每条坐标轴都有原点、正方向、单位长度三要素。根据三条坐标轴之间的相对位置,有两种三维笛卡尔坐标系:左手坐标系(LHS)和右手坐标系(RHS)。
左手坐标系:当左手拇指指向z轴,其余四指指向x轴、并能够扫向y轴时,该坐标系称为左手坐标系。
1.2 向量的长度及标准化
1.2.1 向量的长度
在几何中,向量的长度(大小)叫做向量的模,也叫做向量的范数。对于向量
,其模可以记作
:
1.2.2 向量的标准化
长度为1的向量叫做单位向量,向量的标准化就是对向量进行缩放,使其变为单位向量。通常在不关心向量长度而只关注向量方向的情况下进行标准化操作。对于给定向量
,其标准化向量表示为
:
标准化向量在判断多边形朝向、关照计算、碰撞检测等情形下常用到。
1.3 向量的运算
1.3.1 加减
- 从坐标表示来看,向量的加减只需将各个分量分别相加减即可;
- 从几何表示来看,向量的加减满足平行四边形法则和三角形法则。
从坐标表示或从几何表示来看,减去一个向量实际上相当于加上一个方向相反大小相等的向量。几何上有一句口诀:相同起点,指向被减。
向量的加法和乘法满足交换律和结合律,即:
1.3.2 数乘
数乘指一个标量和一个向量相乘,得到的结果也是一个向量。
1.3.3 点积
点积是向量乘法的一种形式,其结果是一个标量,因此也称为数量积。当 与 都不为零向量,且夹角为 ,数量积记做: 。
由于向量数量积满足分配率,在直角坐标系中,给定向量
和
,点积可表示为:
1.3.4 叉积
叉积是向量乘法的另一种形式,其结果是一个向量,因此也称为向量积。当 与 都不为零向量,且夹角为 ,向量积记做: , 其长度为: 。向量积结果与 和 同时垂直。在左手坐标系中满足左手法则,右手坐标系中满足右手法则。
在直角坐标系中,给定向量 和 ,向量积可表示为:
1.4 齐次坐标系
在笛卡尔坐标系中,向量和点的表示形式没有差别,都是形如 或 的形式,因此需要根据上下文理解。
而齐次坐标的表示就是为了解决这样的歧义,该表示方式通过增加一个维度来标识点或向量。如在三维坐标系中,点 的齐次坐标形式为 ,向量 的齐次坐标形式为 。
采用齐次坐标有以下优点:
- 表示无穷远概念,当 趋近于无穷远时, 将趋近于无穷;
- 可以使用相同的形式执行所有基础变换,包括线性变换、平移和投影变换。如 的矩阵不能实现三维点的平移变换,必须使用 的矩阵。
1.5 XNA向量
XNA(Next Generation Architecture)是DirextX 11 SDK的一部分。在DirextX 11 SDK以前版本,有一个数学库名为D3DXMath,但逐渐被淘汰。
目前win8、win10的windows SDK包含一个DirectX SDK,最新的是directxmath库(DirectXMath为单精度浮点向量(2D,3D和4D)或矩阵(3×3和4×4)提供了一个优化的可移植接口,用于算术和线性代数运算)
最关键的一个类是XMVECTOR,它是通过支持SIMD的SSE及其扩展指令集的支持库Intrisics实现的,是__m128的别名。是一个实现与平台相关的,非常复杂的,进行16字节对齐的,映射到SSE寄存器的类型。