开发者网络

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 102|回复: 0

DirectX 12 3D游戏开发实战

[复制链接]

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-2-9 18:02:26 | 显示全部楼层 |阅读模式
# 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寄存器而不是内存中;由于不同平台寄存器大小限制,需要类型的别名来传递参数,以在不同的平台有对应的措施;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|开发者网络

GMT+8, 2025-4-10 03:52 , Processed in 0.086374 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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