在三维计算机图形学中,我们使用矩阵来简洁地描述几何变换,如缩放、旋转、平移,以及将点或向量的坐标从一帧变换到另一帧。本章探讨矩阵的数学。

目的:

  1. 了解矩阵及其运算。
  2. 发现向量矩阵乘法如何被视为一个线性组合。
  3. 学习单位矩阵是什么,矩阵的转置,行列式和逆是什么。
  4. 熟悉用于矩阵数学的DirectX数学库提供的类和函数的子集。

2.1定义

2.2矩阵乘法

2.3矩阵转置

2.4单位矩阵

2.5矩阵行列式

2.6伴随矩阵

2.7矩阵的逆

以上内容为线性代数知识,不赘述

2.8 DIRECTX MATH MATRICES

DirectX数学矩阵

2.8.1矩阵类型

为了在DirectX数学中表示4×4矩阵,我们使用了XMMATRIX类,它在DirectXMath.h头文件中定义

XMMATRIX使用四个XMVECTOR实例来使用SIMD。而且,XMMATRIX为矩阵运算提供了重载的运算符。

除了使用各种构造函数之外,还可以使用XMMatrixSet函数创建XMMATRIX实例:

XMMATRIX XM_CALLCONV XMMatrixSet(

float m00, float m01, float m02, float m03,

float m10, float m11, float m12, float m13,

float m20, float m21, float m22, float m23,

float m30, float m31, float m32, float m33);

我们使用以下方法将数据从XMFLOAT4X4加载到XMMATRIX:

 inline XMMATRIX XM_CALLCONV

XMLoadFloat4x4(const XMFLOAT4X4* pSource);

我们使用以下方法将数据从XMMATRIX存储到XMFLOAT4X4:

inline void XM_CALLCONV

XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIX M);

2.8.2矩阵函数

XMMATRIX XM_CALLCONV XMMatrixIdentity();

 // Returns the identity matrix I 返回单位矩阵I

 bool XM_CALLCONV XMMatrixIsIdentity( FXMMATRIX M);

 // Returns true if M is the identity matrix 如果是单位矩阵返回true

 // Input M

XMMATRIX XM_CALLCONV XMMatrixMultiply( FXMMATRIX A, CXMMATRIX B);

 // Returns the matrix product AB 返回矩阵AB的乘积

// Input A

 // Input B

XMMATRIX XM_CALLCONV XMMatrixTranspose( FXMMATRIX M);

// Returns MT 返回矩阵转置

 // Input M

XMVECTOR XM_CALLCONV XMMatrixDeterminant(  FXMMATRIX M);

// Returns(det M, det M, det M, det M) 返回矩阵行列式

// Input M XMMATRIX XM_CALLCONV

XMMatrixInverse(XMVECTOR* pDeterminant, FXMMATRIX M);

 // Returns M1 返回矩阵的逆

 // Input (det M, det M, det M, det M)

// Input M

When we declare a XMMATRIX

2.8.3例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <windows.h> // for XMVerifyCPUSupport
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <iostream>
using namespace std;
using namespace DirectX;
using namespace DirectX::PackedVector;
 
// Overload the  "<<" operators so that we can use cout to 
//重载“<<”操作符,以便我们可以使用cout
// output XMVECTOR and XMMATRIX objects.
//输出XMVECTOR和XMMATRIX对象。
ostream& XM_CALLCONV operator << (ostream& os, FXMVECTOR v)
{
    XMFLOAT4 dest;
    XMStoreFloat4(&dest, v);
 
    os << "(" << dest.x << ", " << dest.y << ", " << dest.z << ", " << dest.w << ")";
    return os;
}
 
ostream& XM_CALLCONV operator << (ostream& os, FXMMATRIX m)
{
    for (int i = 0; i < 4; ++i)
    {
        os << XMVectorGetX(m.r[i]) << "\t";
        os << XMVectorGetY(m.r[i]) << "\t";
        os << XMVectorGetZ(m.r[i]) << "\t";
        os << XMVectorGetW(m.r[i]);
        os << endl;
    }
    return os;
}
 
int main()
{
    // Check support for SSE2 (Pentium4, AMD K8, and above).
	//检查是否支持SSE2
    if (!XMVerifyCPUSupport())
    {
        cout << "directx math not supported" << endl;
        return 0;
    }
 
    XMMATRIX A(1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 2.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 4.0f, 0.0f,
        1.0f, 2.0f, 3.0f, 1.0f);
 
    XMMATRIX B = XMMatrixIdentity();//定义了一个单位矩阵
 
    XMMATRIX C = A * B;//矩阵乘法
 
    XMMATRIX D = XMMatrixTranspose(A);//A的转置
 
    XMVECTOR det = XMMatrixDeterminant(A);//A的行列式
    XMMATRIX E = XMMatrixInverse(&det, A);//A的逆
 
    XMMATRIX F = A * E;//A乘A的逆矩阵,结果是单位阵
 
    cout << "A = " << endl << A << endl;
    cout << "B = " << endl << B << endl;
    cout << "C = A*B = " << endl << C << endl;
    cout << "D = transpose(A) = " << endl << D << endl;
    cout << "det = determinant(A) = " << det << endl << endl;
    cout << "E = inverse(A) = " << endl << E << endl;
    cout << "F = A*E = " << endl << F << endl;
 
    return 0;
}