二、矩阵
在三维计算机图形学中,使用矩阵描述几何变换,比如平移,旋转,缩放等;通过运算将向量或点从一个空间转换到另一个空间。本章讲解矩阵的概念及其运算。
目标:
- 矩阵的定义
- 矩阵的运算
- XNA库中矩阵的表示和操作
2.1 矩阵的定义
m×n
m
×
n
矩阵是一个由m行、n列数字组成的二维表。表示如下:
行数和列数相同的矩阵叫做方阵,接下来主要讨论方阵。
2.2 矩阵的运算
2.2.1 矩阵相等、加减法和数乘
- 如果矩阵A和矩阵B维数相同,并且所有对应位置元素都相同,则称这两个矩阵相等,记作 A=B A = B .
- 矩阵数乘: C=kA=(k⋅aij)mn C = k A = ( k ⋅ a i j ) m n
- 矩阵加减法的前提是矩阵维度相同: C=A+B=(aij+bij)mn C = A + B = ( a i j + b i j ) m n
2.2.2 矩阵乘法
只有当矩阵A中的列数与矩阵B中的行数相等时,矩阵乘法才有意义。乘法公式为:
矩阵乘法不满足交换律。
2.2.3矩阵转置
把矩阵 A A 的行转换成相应的列,得到的新矩阵称为的转置矩阵,记作 AT A T 。
矩阵转置有以下性质:
- (AT)T=A ( A T ) T = A
- (A+B)T=AT+BT ( A + B ) T = A T + B T
- (AB)T=BTAT ( A B ) T = B T A T (要证明此性质,只需将矩阵元素展开,比较对应项是否相等)
2.3 单位矩阵
定义:主对角线元素为1,其余元素为0的方阵。n阶单位矩阵记作 In I n 或 En E n .
2.4 逆矩阵
对于 n×n n × n 方阵 A A ,若存在另一个 方阵 B B ,使得,则称 A为可逆矩阵,B为A的逆矩阵,记作 A−1 A − 1 。
矩阵A的逆矩阵存在,当且仅当其行列式 det(A)≠0 d e t ( A ) ≠ 0 .
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来分配和释放内存以保证字节对齐。