二、矩阵
在三维计算机图形学中,使用矩阵描述几何变换,比如平移,旋转,缩放等;通过运算将向量或点从一个空间转换到另一个空间。本章讲解矩阵的概念及其运算。
目标:
- 矩阵的定义
- 矩阵的运算
- XNA库中矩阵的表示和操作
2.1 矩阵的定义
矩阵是一个由m行、n列数字组成的二维表。表示如下:
行数和列数相同的矩阵叫做方阵,接下来主要讨论方阵。
2.2 矩阵的运算
2.2.1 矩阵相等、加减法和数乘
- 如果矩阵A和矩阵B维数相同,并且所有对应位置元素都相同,则称这两个矩阵相等,记作 .
- 矩阵数乘:
- 矩阵加减法的前提是矩阵维度相同:
2.2.2 矩阵乘法
只有当矩阵A中的列数与矩阵B中的行数相等时,矩阵乘法才有意义。乘法公式为:
矩阵乘法不满足交换律。
2.2.3矩阵转置
把矩阵 的行转换成相应的列,得到的新矩阵称为 的转置矩阵,记作 。
矩阵转置有以下性质:
- (要证明此性质,只需将矩阵元素展开,比较对应项是否相等)
2.3 单位矩阵
定义:主对角线元素为1,其余元素为0的方阵。n阶单位矩阵记作 或 .
2.4 逆矩阵
对于 方阵 ,若存在另一个 方阵 ,使得 ,则称 A为可逆矩阵,B为A的逆矩阵,记作 。
矩阵A的逆矩阵存在,当且仅当其行列式 .
2.5 XNA矩阵
XNA库中,最关键的一个类是XMMATRIX,它是通过支持SIMD的SSE及其扩展指令集的支持库Intrisics实现的,是一个实现与平台相关的,非常复杂的,进行16字节对齐的,映射到SSE寄存器的类型。
在XNA数学库中,还定义了另外一些数据结构来表示矩阵,有XMFLOAT3X3,XMFLOAT4X3,XMFLOAT4X4,XMFLOAT4X3A,XMFLOAT4X4A等。在编写程序时,最好避免直接使用XMMATRIX作为类或者结构体的数据成员,而是使用XMFLOAT*X*。
因为对XMMATRIX类型动态分配内存(从堆中分配内存)时可能会出现问题。XMMATRIX是按16字节对齐的,而在X86系统中,堆只能按8字节对齐(但在X64系统中,所有堆都是按16字节对齐的)。
特别的,在X86系统中,XMMATRIX不能再Vector中使用,因为X86系统按8字节对齐的特性决定了按16字节对齐的函数参数不能进行值传递,这会引起编译器报告一个代码未“C2719”的错误。
当XMMATRIX类型变量是在栈中分配,或者是放在数据段中(如作为全局变量)时,编译器会保证变量对齐。在堆中使用XMMATRIX时,可以使用_aligned_molloc和_ _alignedfree来分配和释放内存以保证字节对齐。