|
# DirectX 12 3D游戏开发实战
## 数学知识
### 一、向量代数
- 向量
* 坐标系:分为左手坐标系与右手坐标系,dx使用左手坐标系
* 基本运算:相等,加法,标量乘法,减法
- 长度(模)
* 规范化:将向量的每个分量分别除以该向量的模,使得该向量长度为1,公式为:$$\lVert \^u \rVert =\dfrac{u}{\lVert u \rVert}=(\dfrac{x}{\lVert u \rVert}\dfrac{y}{\lVert u \rVert},\dfrac{z}{\lVert u \rVert})$$
- 点积:求夹角或者投影
* 正交化:向量集的每一个元素都相互正交且都为单位长度,则称该集合规范正交;对非正交矩阵一般使用**格拉姆-施密特正交化**:以某一根轴为基准,其他轴按照次序减去与其他轴平行的分量(投影),公式为:$$w_{i}=v_i-\sum_{j=0}^{i-1}proj_{w_j}(v_i)$$
- 叉积:求法线
* 叉积正交化:3d中存在另外一种正交化方案,以一根轴为基准,与其他轴做叉积得到正交矩阵;可以将近乎规范的矩阵完全正交化,若受到累计精度误差影响,会导致其成为非规范矩阵
- 点:可以用向量表示,部分向量运算对于点没有意义
- DirectXMath库进行行向量运算:需要开启SSE2指令集和启用快速浮点模型
* 数据类型:
* `XMVECTOR`:为核心数据类型,被映射到SIMD硬件寄存器,可一次处理4个32位浮点数
* `XMFLOATn`:普通的n维浮点向量,用于存储XMVECTOR类型数据,一般用于数据成员;运算前需要转换为XMVECTOR类型
* 类型转换:使用下面方法从`XMVECTOR`与`XMFLOATn`之间转换
~~~c++
//将XMFLOAT4类型转换为XMVECTOR类型
XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4 *pSource);
//将XMVECTOR类型转换为XMFLOAT4类型
void XM_CALLCONV XMStoreFloat4(XMFLOAT4 *pDestination, XMVECTOR V);
~~~
也可以只设置`XMVECTOR`的某一个分量
~~~c++
//获取XMVECTOR类型的x分量
float XM_CALLCONV XMVectorGetX(XMVECTOR V);
//设置XMVECTOR类型的x分量
XMVECTOR XM_CALLCONV XMVectorSetX(XMVECTOR V, float x);
~~~
* 参数传递:可将`XMVECTOR`类型的值作为函数的参数,可以直接传送值SSE/SSE2寄存器而不是内存中;由于不同平台寄存器大小限制,需要类型的别名来传递参数,以在不同的平台有对应的措施; |
|