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

投影

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

裁剪空间

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

裁剪空间:

投影空间 :

观察空间 :

世界空间 :

世界空间 :

从右向左读这个乘法.

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

相关推荐
idkmn_37 分钟前
Daily AI 20250513 (集成学习及其与联邦学习的区别)
人工智能·神经网络·机器学习·集成学习
WenGyyyL1 小时前
研读论文——《用于3D工业异常检测的自监督特征自适应》
人工智能·python·深度学习·机器学习·计算机视觉·3d
belldeep2 小时前
python:trimesh 用于 STL 文件解析和 3D 操作
python·3d·stl
Leo.yuan2 小时前
3D 数据可视化系统是什么?具体应用在哪方面?
大数据·数据库·3d·信息可视化·数据分析
yzx9910132 小时前
支持向量机的回归用法详解
算法·支持向量机·回归
Unity官方开发者社区2 小时前
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
android·3d·团结引擎1.5·团结引擎车机版
11054654012 小时前
11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design
前端·3d
高德技术2 小时前
IJCAI 2025 | 高德首个原生3D生成基座大模型「G3PT」重塑3D生成的未来
3d
小羊在奋斗2 小时前
【LeetCode 热题 100】反转链表 / 回文链表 / 有序链表转换二叉搜索树 / LRU 缓存
算法·leetcode·链表
Wnq100722 小时前
基于 NanoDet 的工厂巡检机器人目标识别系统研究与实现
人工智能·机器学习·计算机视觉·目标跟踪·机器人·巡检机器人