DirectX12(D3D12)基础教程三 线性代数与3D世界空间

线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。 向量和矩阵是学习3D入门最基本的理论基础。本章重点讲向量和矩阵.

向量概念

向量最基本的定义就是一个方向 和长度, 如图坐标点(3,4)

根据 勾股定理 可以计算出它长度 是5= ,也叫做向量的模 。方向 是与X轴的夹角θ,向量的长度和方向根据坐标可以计算出,通常书写标记为: 通常大家喜欢在字母上面加一横表示向量,如: =。

单位向量

有一个特殊类型向量的模(长度)等于1叫做单位向量,把一个向量变成单位向量这叫标准化 。任意向量的每个分量除以向量的模就得到它的单位向量。特别是在我们只关心方向不关心模(长度)的时候。比如 =要标准化,先计算模,然后除以向量的模 ,的单位向量。现在我们再计算向量的模 ,再次证实了。

向量运算

向量与标量加减乘除:

,比如加法运算 :

向量与向量的加减

比如加法运算 :

以上都比较好理解,不做过多的说明了

向量相乘

普通的乘法在向量上是没有定义的,在3D世界里 ,两种特定情况:1.点乘 (Dot Product)记作,2.叉乘( Cross Product)记作

1.点乘 (Dot Product) ,两个向量的点乘结果等两个向量之间夹角的余弦值,可以算出向量之间夹角的角度,提前是先要标准化。 点乘会在计算光照的时候非常有用。比如计算向量与X轴的夹角,点乘会像是这样。

**2.叉乘(**Cross Product) 叉乘只在3D空间中有定义,它需要两个不平行向量作为输入,生成一个正交于两个输入向量的第三个向量。公式如下:

如看不懂,先放下。

矩阵

现在我们已经讨论了向量的全部内容,是时候看看矩阵了!简单来说矩阵就是一个矩形的数字、符号或表达式数组。矩阵中每一项叫做矩阵的元素(Element)。下面是一个2×3矩阵的例子: 可以把它看做一个两维数据。

矩阵运算

矩阵与与标量加减乘除 比较好理解,比较如加法

矩阵相乘

注意事项

  1. 只有当左侧矩阵的列数与右侧矩阵的行数相等,两个矩阵才能相乘。

  2. 矩阵相乘不遵守交换律也就是说A⋅B≠B⋅A

我们先看一个两个2×2矩阵相乘的例子

上面的例子我们来找找规律:

结果矩阵19是由第一个矩阵的第一行和第二个矩阵的第一列运算出来的

19 = 1*5+2*7

结果矩阵22是由第一个矩阵的第一行和第二个矩阵的第二列运算出来的

22 = 1*6+2*8

结果矩阵43是由第一个矩阵的第二行和第二个矩阵的第一列运算出来的

43 = 3*5+4*7

结果矩阵50是由第一个矩阵的第二行和第二个矩阵的第二列运算出来的

43 = 3*6+4*8

它的规律就是 矩阵n×n 记作 ,矩阵, 矩阵相乘结果 = 简单记作 结果矩阵的行就是第一矩阵的行,结果矩阵的列是第二矩阵的列,结果矩阵的值 第一矩阵的行与第二矩阵的列相乘相加的结果。

再练来习一个

要是实在记不住 也没关系,运算时我们调用库函数去实现计算细节。

单位矩阵

由于某些原因我们通常使用4×4的变换矩阵,单位矩阵是一个除了对角线以外都是0的N×N矩阵。如下 。

向量/2D/3D变换都可以放在一个单位矩阵进行比如 矩阵乘以 单位矩阵 还是原来的矩阵

缩放

通常使用4×4的变换矩阵, 3D空间对向量进行缩放,先构造单位矩阵,然后设置缩放因子(S1,S2,S3)

位移

原始向量的基础上加上另一个向量,两个向量相加,我们也可用矩阵与向量相乘同样达到目的

旋转

对向量旋转需要定义一个角和一个旋转轴。沿x、y、z轴旋转作算法不相同。这部份理论稍复杂些我们直接抄公式了,旋转角度用θ表示

在实际代码中使用是比较简单的 比如沿Y轴旋转 XMMATRIX model = XMMatrixRotationY(static_cast<float>(m_dYAngle));

组合练习

我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位.

注意,矩阵乘法是不遵守交换律的,这意味着它们的顺序很重要,建议您在组合矩阵时,先进行缩放操作,然后是旋转,最后才是位移,否则它们会(消极地)互相影响。

定义缩放矩阵 缩放w分量是无意义,所以还是1

定义位移矩阵

缩放位移矩阵运算

顶点(x, y, z)最终的变换矩阵

展开书写是这样的:

当矩阵相乘时,在最右边的矩阵是第一个与向量相乘的,所以你应该从右向左读这个乘法。

3D世界空间

举个例子出来说明,比如人站在房间里面看到一个物体,我们把这个物体作为研究对象,如图

局部空间

物体本身作参照点原点就在它在左角(0,0),它长宽高参照于物体起始的坐标。这叫局部坐标或叫局部空间。

世界空间

如果把房间的左下角作为原点,物体在房间的位置坐标叫世界空间

观察空间

以人坐标位置为原点观察物体,人为的设定Look At矩阵,这样就能计算出观察点在世界空间的坐标

投影

定义了 可观察空间大小,比如可观察空间远近,宽度 ,长度。如图红线处

裁剪空间

以观察点为原点,把不可视范围去掉,保留可视范围最后变换回标准化设备坐标系最终显示在屏幕上叫裁剪空间。

裁剪空间:

投影空间 :

观察空间 :

世界空间 :

世界空间 :

从右向左读这个乘法.

感谢大家的支持,如要问题欢迎提问指正。

相关推荐
Logic10119 分钟前
C语言/数据结构位运算题解:异或XOR找出套碗游戏中的“幸运碗“——只出现一次的数字
c语言·数据结构·算法·数组·位运算·时间复杂度·空间复杂度
具身AGI37 分钟前
世界模型改当裁判,物理AI 物理推理 做判据
人工智能·深度学习·机器学习
yi01139 分钟前
LeetCode 3. 无重复字符的最长子串|不定长滑动窗口:什么时候更新最大值?
笔记·python·算法·leetcode·双指针·滑动窗口
y1su1 小时前
Leetcode 单调栈模板
java·开发语言·数据结构·算法·leetcode
索尔~古德曼1 小时前
CF(1400-1400&1300-1500)
算法
爱刷碗的苏泓舒1 小时前
泰勒级数与泰勒展开:GNSS卫地距线性化、Jacobian矩阵与Hessian矩阵
线性代数·算法·矩阵·gnss·雅可比矩阵·卫地距线性化·海森矩阵
垆边人似月.1 小时前
华为题:每日温度
数据结构·c++·算法
袖清暮雨1 小时前
机器学习之其他聚类(层次聚类+DBSCAN算法)
人工智能·机器学习·ai·聚类
小宋10211 小时前
Recursive Language Models 实战:递归处理超长外部文本
人工智能·深度学习·机器学习
Sylvia-girl1 小时前
堆排序算法
算法·排序算法·c