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矩阵,这样就能计算出观察点在世界空间的坐标

投影

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

裁剪空间

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

裁剪空间:

投影空间 :

观察空间 :

世界空间 :

世界空间 :

从右向左读这个乘法.

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

相关推荐
freexyn11 分钟前
Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
笔记·算法·matlab
gis收藏家13 分钟前
几何编码:启用矢量模式地理空间机器学习
人工智能·机器学习
陈大大陈14 分钟前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存
不吃酸的柠檬18 分钟前
MATLAB 中的图形绘制
人工智能·机器学习·matlab
数据分析螺丝钉32 分钟前
LeetCode 252 会议室 III(Meeting Rooms III)题解与模拟面试
算法·leetcode·职场和发展
小李独爱秋35 分钟前
动态哈希映射深度指南:从基础到高阶实现与优化
数据结构·算法·哈希算法
猫猫头有亿点炸44 分钟前
C语言斐波拉契数列2.0
c语言·开发语言·算法
云天徽上1 小时前
【数据可视化-30】Netflix电影和电视节目数据集可视化分析
人工智能·机器学习·信息可视化·数据挖掘
写个博客1 小时前
代码随想录算法训练营第二十六天
算法
海底火旺2 小时前
寻找缺失的最小正整数:从暴力到最优的算法演进
javascript·算法·面试