DirectX12 3D 游戏开发与实战第二章内容
矩阵代数
学习目标
- 理解矩阵及其相关运算的定义
- 探究为何能把向量和矩阵的乘法视为一种线性组合
- 学习单位矩阵、转置矩阵、行列式以及矩阵的逆等概念
- 逐步熟悉DirectXMath库中提供的关于矩阵计算的类与函数的子集
2.1矩阵的定义
一个规模为m x n的矩阵,是由m行n列实数构成的矩阵阵列,行数和列数的乘积表示了矩阵的维度,矩阵中的数字则称为元素或元。理解矩阵相等、加法运算,标量乘法和减法运算。
2.2矩阵乘法
如果A是一个m x n矩阵,B是一个n x p矩阵,那么AB的乘积是一个规模为m x p的矩阵C,矩阵C中第i行、第j列的元素,有矩阵A的第i个行向量与矩阵B的第j个列向量的点积求得。要注意的是,矩阵A的行向量的维数(可认为是分量的个数)必须和矩阵B的列向量的维数相等才可以使矩阵乘积AB有意义。而且矩阵乘积一般不满足交换律
2.2.2向量和矩阵的乘法
向量与矩阵的乘积uA相当于:向量u给定的标量系数(x,y,z)与矩阵A中各行向量的线性组合。这个结论有一个一般性,对于一个1 x n行向量u和一个n x m矩阵A的乘积为:u1A1 + u2A2 + …… unAn
2.2.3结合律
矩阵乘法对矩阵加法的分配律:A(B + C) = AB + AC和(A + B)C = AC + BC。
矩阵乘法结合律:(AB)C = A(BC)
2.3转置矩阵
转置矩阵指的是将原矩阵的行与列进行互换所得到的新矩阵,转置矩阵具有一些性质,这里不列举
2.4单位矩阵
单位矩阵I是一种主对角线的元素均为1,其他元素都为0的方阵。单位矩阵是矩阵的乘法单位元,即任何矩阵和单位矩阵相乘,得到的原矩阵,如果M是一个方阵M,则MI = IM,满足乘法交换律
2.5矩阵的行列式
行列式是一种特殊的函数,它以一个方阵作为输入,并输出一个实数,方阵A的行列式通常表示为det A。行列式推导出求逆矩阵的公示,此外,行列式也可以用来证明:方阵A是可逆的,当且仅当det A 不为0。
2.5.1余子阵
指定一个n x n的矩阵,余子阵Aij(A上有一横线)即从A中取出第i行和第j列的(n - 1) x (n - 2)矩阵
2.5.2行列式的定义
略
2.6伴随矩阵
略
2.7逆矩阵
略
2.8用DirectXMath库处理矩阵
为了对点和向量进行变换,我们要借助1 x 4行向量以及4 x 4矩阵
2.8.1矩阵类型
DirectXMath库用定义在DirectXMath.h头文件中的XMMATRIX类来表示4 x 4矩阵,XMMATRIX由4个XMVECTOR实例构成,借此来使用SIMD技术。XMMATRIX类为矩阵运算提供了多种重载运算符。除了各种构造方法之外,我们还可以使用XMMatrixSet函数来创建XMMATRIX实例。
和XMVECTOR一样,我们建议用XMFLOAT4X4来存储类中的矩阵类型数据成员,而不是直接使用XMMATRIX.
我们可以用加载方法和存储方法来实现XMMATRIX和XMFLOAT4X4类型之间的相互转换
加载方法:
XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource)
存储方法:
void XM_CALLCONV XMStoreFloat4x4(XMFloat4x4 * pDestination,FXMMATRIX M)
2.8.2矩阵函数
DirectXMath库包含了一些和矩阵相关的函数
//返回单位矩阵
XMMATRIX XM_CALLCONV XMMatrixIdentity();
//如果M是单位矩阵则返回true
bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRXI M);
//返回矩阵乘积AB
XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX A,CXMMATRIX B);
//返回矩阵M的转置
XMMATRIX XM_CALLCONVE XMMatrixTranspose(FXMMATRIX M);
//返回(det M,det M,det M,det M,)
XMVECTOR XM_CALLCONV XMMatrixDeteminant(FXMMATRIX M);
//返回矩阵M的逆矩阵
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeteminant,FXMMATRIX M);
在声明具有XMMATRIX参数的函数时,除了要注意一个XMMATRIX类型相当于4个XMVECTOR类型之外,还要注意,第一个参数应该为FXMMATRIX类型,其余都应该为CXMMATRIX类型。不过有一个特例,在构造函数中的参数应该都使用CXMMATRIX类型,而且对于构造函数,也不能使用XM_CALLCONV约定注解
2.8.3DirectXMath矩阵实例程序
主要是一些XMMATRIX类的使用范例,如果想要看示例代码可以自行百度,以后可能会更新。
DirectX12 3D 游戏开发与实战第二章内容的更多相关文章
- DirectX12 3D 游戏开发与实战第九章内容(上)
仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...
- DirectX12 3D 游戏开发与实战第一章内容
DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...
- DirectX12 3D 游戏开发与实战第九章内容(下)
仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...
- DirectX12 3D 游戏开发与实战第八章内容(下)
DirectX12 3D 游戏开发与实战第八章内容(下) 8.9.材质的实现 下面是材质结构体的部分代码: // 简单的结构体来表示我们所演示的材料 struct Material { // 材质唯一 ...
- DirectX12 3D 游戏开发与实战第八章内容(上)
8.光照 学习目标 对光照和材质的交互有基本的了解 了解局部光照和全局光照的区别 探究如何用数学来描述位于物体表面上某一点的"朝向",以此来确定入射光照射到表面的角度 学习如何正确 ...
- DirectX12 3D 游戏开发与实战第十章内容(下)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- DirectX12 3D 游戏开发与实战第十章内容(上)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- DirectX12 3D 游戏开发与实战第五章内容
渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...
- DirectX12 3D 游戏开发与实战第四章内容(上)
Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...
随机推荐
- canvas 鼠标位置缩放图形
最近再做 webcad , 需要在 canvas 上对图形进行缩放,主要分为以下几个步骤: 1.找到当前光标所在位置,确定其在相对 canvas 坐标系的坐标 绑定鼠标滚轮事件,假定每次缩放比例 0 ...
- Android 框架揭秘 --读书笔记
Android 框架揭秘 Insied the Android Framework
- 数据结构与算法—二叉排序树(java)
前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度.规则相对是简单的. 再数据结构中树.图才是数据结构标志性产物,(线性表大多都现成api可以使用),因为树的难度相比线性表大一 ...
- redis 有没有ACID事务
看redis官网的介绍: redis确实是有事务的,但是和传统的ACID是否相同呢? 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. 一致 ...
- Hive 系列(六)—— Hive 视图和索引
一.视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集.视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0 ...
- Flink中watermark为什么选择最小一条(源码分析)
昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值) 这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...
- 牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)
求最小的两个数相加为sum //求最小的两个数相加为sum public ArrayList<Integer> FindNumbersWithSum(int [] array,int su ...
- 《Java 8 in Action》Chapter 6:用流收集数据
1. 收集器简介 collect() 接收一个类型为 Collector 的参数,这个参数决定了如何把流中的元素聚合到其它数据结构中.Collectors 类包含了大量常用收集器的工厂方法,toLis ...
- 随笔编号-16 MySQL查看表及索引大小方法
目标:阿里云OS数据库DMS,单个主库最大存储空间为2T.最近公司业务扩展很快,一天数据量达到7.9G左右.要求备份清理历史数据,备份到其他磁盘. 准备: 如果想知道MySQL数据库中每个表占用的空间 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...