1_向量_《3D图形编程基础——基于DirectX11》笔记

一、向量


目标:

  1. 向量的定义和表示方式。
  2. 向量的标准化。
  3. 向量的运算,包括加减、数乘、点乘、叉乘
  4. 坐标系和齐次坐标系
  5. XNA库中向量的表示和操作方法

1.1 向量的概念

​ 只有大小的量叫做标量(Scalar);既有大小又有方向的量叫做向量(Vector);

​ 由定义可知:向量与位置无关,即处于不同位置的两个向量,只要大小和方向相同,我们就是说他们相等。

1.1.1 向量的表示

​ 向量最初被应用于物理学,数学中的向量是从复数中引入的。在数学中,向量有以下三种表示形式:

​ a. 几何表示:规定了起点和终点的有向线段。

​ b. 坐标表示:在坐标系中平移向量,使向量的起点与原点重合,此时向量终点的坐标用于表示改向量。

​ 在坐标表示形式中,向量和点的表示形式没有差别,都是形如 a = ( x , y ) b = ( x , y , z ) 的形式,因此需要根据上下文理解。

​ 而齐次坐标的表示就是为了解决这样的歧义,该表示方式通过增加一个维度来标识点或向量。

​ c. 线性组合表示: a = a x × i + a y × j + a z × k 其中 i , j , k 表示单位向量,这种表示方法与坐标表示是对应的。

1.1.2 左手坐标系与右手坐标系

​ 三维空间有多种表示方法,最常用的方法是笛卡尔坐标系。三维笛卡尔坐标系基于三条相互垂直的坐标轴:x轴、y轴、z轴。每条坐标轴都有原点、正方向、单位长度三要素。根据三条坐标轴之间的相对位置,有两种三维笛卡尔坐标系:左手坐标系(LHS)和右手坐标系(RHS)。

​ 左手坐标系:当左手拇指指向z轴,其余四指指向x轴、并能够扫向y轴时,该坐标系称为左手坐标系。

1.2 向量的长度及标准化

1.2.1 向量的长度

​ 在几何中,向量的长度(大小)叫做向量的模,也叫做向量的范数。对于向量 u = ( x , y , z ) ,其模可以记作 | | u | | :

(2) | | u | | = ( x 2 + y 2 + z 2 )

1.2.2 向量的标准化

​ 长度为1的向量叫做单位向量,向量的标准化就是对向量进行缩放,使其变为单位向量。通常在不关心向量长度而只关注向量方向的情况下进行标准化操作。对于给定向量 n = ( x , y , z ) ,其标准化向量表示为 n ^ :

(3) n ^ = n / | | n | | , | | n | | 0

​ 标准化向量在判断多边形朝向、关照计算、碰撞检测等情形下常用到。

1.3 向量的运算

1.3.1 加减

  1. 从坐标表示来看,向量的加减只需将各个分量分别相加减即可;
  2. 从几何表示来看,向量的加减满足平行四边形法则和三角形法则。

​ 从坐标表示或从几何表示来看,减去一个向量实际上相当于加上一个方向相反大小相等的向量。几何上有一句口诀:相同起点,指向被减。

​ 向量的加法和乘法满足交换律和结合律,即:

(4) u + v = v + u

(5) ( u + v ) + w = u + ( v + w )

1.3.2 数乘

​ 数乘指一个标量和一个向量相乘,得到的结果也是一个向量。

1.3.3 点积

​ 点积是向量乘法的一种形式,其结果是一个标量,因此也称为数量积。当 α β 都不为零向量,且夹角为 φ ,数量积记做: α β = | | α | | | | b e t a | | c o s φ

​ 由于向量数量积满足分配率,在直角坐标系中,给定向量 u = ( u x , u y , u z ) v = ( v x , v y , v z ) ,点积可表示为:

(6) u v = u x v x + u y v y + u z v z

1.3.4 叉积

​ 叉积是向量乘法的另一种形式,其结果是一个向量,因此也称为向量积。当 α β 都不为零向量,且夹角为 φ ,向量积记做: α × β , 其长度为: | | α × β | | = | | α | | | | b e t a | | s i n φ 。向量积结果与 α β 同时垂直。在左手坐标系中满足左手法则,右手坐标系中满足右手法则。

​ 在直角坐标系中,给定向量 u = ( u x , u y , u z ) v = ( v x , v y , v z ) ,向量积可表示为:

(7) u × v = [ ( u y v z u z v y ) , ( u z v x u x v z ) , ( u x v y u y v x ) ] = | i j k a 1 a 2 a 3 b 1 b 2 b 3 |

1.4 齐次坐标系

​ 在笛卡尔坐标系中,向量和点的表示形式没有差别,都是形如 a = ( x , y ) b = ( x , y , z ) 的形式,因此需要根据上下文理解。

​ 而齐次坐标的表示就是为了解决这样的歧义,该表示方式通过增加一个维度来标识点或向量。如在三维坐标系中,点 p = ( x , y , z ) 的齐次坐标形式为 ( x , y , z , 1 ) ,向量 u = ( x , y , z ) 的齐次坐标形式为 ( x , y , z , 0 )

​ 采用齐次坐标有以下优点:

  • 表示无穷远概念,当 w 趋近于无穷远时, x / w 将趋近于无穷;
  • 可以使用相同的形式执行所有基础变换,包括线性变换、平移和投影变换。如 3 × 3 的矩阵不能实现三维点的平移变换,必须使用 4 × 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寄存器的类型。

猜你喜欢

转载自blog.csdn.net/renjiewen1995/article/details/79155602