找回密码
 立即注册
查看: 173|回复: 0

DirectX 12 3D游戏开发实战

[复制链接]
发表于 2023-2-9 12:01 | 显示全部楼层 |阅读模式
# 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寄存器而不是内存中;由于不同平台寄存器大小限制,需要类型的别名来传递参数,以在不同的平台有对应的措施;
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 09:05 , Processed in 0.087871 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表