学习目标:
- 学习如何使用几何学和数字描述 Vector;
- 学习 Vector 的运算方法及其在几何学上的应用;
- 熟悉在 DirectXMath library 中的 Vector 相关的类和函数。
1 向量
一个向量代表的是一个拥有大小和方向的量。类似力(拥有力的大小和方向)、位移(移动的方向和距离)、速度(速度的大小和方向)等,例如下图(图 1.1):
绘制向量的位置和向量本身无关,所以当且仅当两个向量的大小和方形相等时,两个向量相等;所以上图中a和b中的向量u和向量v相等。
1.1 向量和坐标系统
我们现在可以定义各种向量几何运算来解决对应的问题,但是因为计算机无法直接通过几何学计算向量,所以我们需要用数字来描述向量;
考虑到下图中的情况(图1.4),同一个向量在不同坐标系中会有不同的坐标变现:
在计算机3D图形学中我们需要使用多个坐标系,我们要知道当前在哪一个坐标系下,并且熟悉坐标系之间的转换。
1.2 左手坐标系 VS 右手坐标系
Direct3D 使用的是左手坐标系:如果你使用你的左手指向 X轴正方向,然后向Y轴正方向弯曲你的手指,此时你的大拇指指向的就是Z轴正方向,如图1.5 所示(右手坐标系类似,只不过替换为右手)
1.3 基本向量运算
我们也可以在坐标系中使用绘制的方法来表示:
2 长度和单位向量
向量长度计算公式:
单位向量计算公式:
为了证明单位向量计算公式,我们可以计算单位向量的长度:
3 向量的点积
向量的点积是一种结果为数量值的乘法形式,其定义和计算公式为:
向量的点积的定义并没有提出明显的几何定义,利用余弦定理,我们可以找到几何关系:
如图1.9,θ是向量v和u的夹角,再根据上面的公式,我们可以得出向量点积的一些有用的几何属性:
- 当两个向量点积为0时,两个向量垂直;
- 当两个向量点积大于0时,两个向量夹角小于90度;
- 当两个向量点积小于0时,两个向量夹角大于90度。
3.1 向量的分解
如图1.10
给出向量v和单位向量n,使用点积公式求出向量p:
向量p也可以表示为: p = p r o j n ( v ) p = proj_n(v) p=projn(v),那么向量w = v - p
所以向量v就可以分解为: v = p + w = p r o j n ( v ) + p e r p n ( v ) v = p + w = proj_n(v) + perp_n(v) v=p+w=projn(v)+perpn(v)
如果向量n不是单位向量,那么可以提前把n标准化:
3.2 正交化
当一组向量相互之间都垂直,并且都是单位向量时,我们称他们为标准正交。在3D计算机图形学中,我们刚开始可能会有一组标准正交的向量,但是由于变量精度的问题,这些向量会在进行一系列计算后开始变得相互不垂直。所以我们的目标就是主要考虑在3D和2D情况下手动正交化。
我们先从2D开始,假设拥有向量 v 0 v_0 v0和 v 1 v_1 v1,我们要将他们正交化为标准正交集 w 0 w_0 w0和 w 1 w_1 w1;首先我们使 w 0 = v 0 w_0=v_0 w0=v0,然后修改 v 1 v_1 v1让它垂直于 w 0 w_0