DirectX12 3D 游戏开发与实战第二章内容

矩阵代数

学习目标

  1. 理解矩阵及其相关运算的定义
  2. 探究为何能把向量和矩阵的乘法视为一种线性组合
  3. 学习单位矩阵、转置矩阵、行列式以及矩阵的逆等概念
  4. 逐步熟悉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类的使用范例,如果想要看示例代码可以自行百度,以后可能会更新。

posted @ 2019-09-03 18:59  风雅yaya  阅读(1067)  评论(0编辑  收藏  举报