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图像的存储方式,页面翻 ...
随机推荐
- django在启动时抛出Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 解决办法
1.适用场景 在启动某个服务的时候,比如python中django启动的时候8000端口被占用,导致无法启动服务. 2.解决办法 通过命令行找出端口对应的PID进程 C:\Users\micha> ...
- RedHat 6.5换源
https://wenku.baidu.com/view/5b87fb42c77da26924c5b03b.html
- Django-用户-组-权限
前言 RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...
- nodeCZBK-笔记2
目录 day04 mongoDB数据库使用 day05 node使用mongoDB数据库 day04 mongoDB数据库使用 电脑全局安装数据库 开机命令:mongod --dbpath c:\mo ...
- mave 笔记
有时maven在myeclipse配置不好用,可直接cmd到项目目录下执行下面命令,将maven包下载到当前文件夹的lib目录下 mvn dependency:copy-dependencies -D ...
- MyBatis的parameterType传入参数类型
在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的 ...
- appium+python自动化项目实战(一):引入nose和allure框架
本文将介绍一套比较完整的appium自动化框架,以python为编写脚本语言,是因为python有强大的库,同时易学易懂. 最终的测试框架代码,将在jenkins项目中一键构建,执行自动化测试用例,并 ...
- .Net Core 三大Redis客户端对比和使用心得
前言 稍微复杂一点的互联网项目,技术选型都可能会涉及Redis,.NetCore的生态越发完善,支持.NetCore的Redis客户端越来越多, 下面三款常见的Redis客户端,相信大家平时或多或少用 ...
- Python 基础1 - 位运算符
引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...
- Leetcode之回溯法专题-46. 全排列(Permutations)
Leetcode之回溯法专题-46. 全排列(Permutations) 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3, ...