一.矩阵基本概念
在DirectX10中,矩阵是一个非常重要的概念,这里我们主要探讨以下几个方面:
1.矩阵乘法
假设A是一个m*n矩阵,B是一个n*p的矩阵,若C = A* B,则C是一个m*p矩阵,其中C的每一个元素Ci,j = Ai,* * B*,j
2.向量-矩阵乘法
假设向量u=(x,y,z),矩阵A = [A*,1,A*,2,A*,3],则向量u与矩阵A相乘的结果为uA = xA*,1 + yA*,2 + zA*,3,这说明向量-矩阵的乘积uA等于向量的标量系数与矩阵A的行向量的线性组合。
注意:矩阵乘法满足交换律,即A(BC) = (AB)C
3.矩阵转置
对一个矩阵M的行列进行互换,即可得到该矩阵的转置(transpose)矩阵,记作MT.
4.单位矩阵
单位矩阵(identitymatrix)是一个正方形矩阵,其除了对角线上的元素为1外,其余都为0.
注意:单位矩阵的作用相当于一个乘法单位,也就是,如果A是一个m*n矩阵,B是一个n*p矩阵,I是n*n单位矩阵,那么,AI=A且IB = B
5.逆矩阵
矩阵运算中没有除法运算,但是却定义了一种逆(inverse)运算.
注意:
1.只有正方形矩阵有逆运算
2.逆矩阵记作M-1
3.并不是所有的正方形矩阵都有逆矩阵,有逆矩阵的正方形矩阵称为可逆矩阵,没有逆矩阵的正方形矩阵称为单调矩阵
4.逆矩阵若存在,必定唯一
5.矩阵与其逆矩阵相乘必为单位矩阵
6.(AB)-1 = B-1 * A-1
二.D3DX中的矩阵
1.基本类与函数
在D3DX中,我们主要使用D3DXMATRIX类表示4*4矩阵,其在D3DX中的定义如下:
typedef struct D3DXMATRIX: public D3DMATRIX
{
public D3DXMATRIX(){};
public D3DXMATRIX(CONST FLOAT*);
public D3DXMATRIX(CONST D3DMATRIX&);
public D3DXMATRIX(CONST D3DXFLOAT16 *);
public D3DXMATRIX(
FLOAT _11,FLOAT _12,FLOAT _13,FLOAT _14,
FLOAT _21,FLOAT _22,FLOAT _23,FLOAT _24,
FLOAT _31,FLOAT _32,FLOAT _33,FLOAT _34,
FLOAT _41,FLOAT _42,FLOAT _43,FLOAT _44,
);
FLOAT & operator(UINT row,UINT col) ;
FLOAT operator(UINT row,UINT col) const;
operator FLOAT*();
operator CONST FLOAT*() const;
D3DXMATRIX& operator *= (CONST D3DXMATRIX&);
D3DXMATRIX& operator += (CONST D3DXMATRIX&);
D3DXMATRIX& operator -= (CONST D3DXMATRIX&);
D3DXMATRIX& operator *= (FLOAT);
D3DXMATRIX& operator /=(FLOAT);
D3DXMATRIX operator + () const;
D3DXMATRIX operator - () const;
D3DXMATRIX operator *(CONST D3DXMATRIX&) const;
D3DXMATRIX operator +(CONST D3DXMATRIX&) const;
D3DXMATRIX operator -(CONST D3DXMATRIX&) const;
D3DXMATRIX operator * (FLOAT) const;
D3DXMATRIX operator / (FLOAT) const;
friend D3DXMATRIX operator *(FLOAT,CONST D3DXMATRIX &);
bool operator ==(CONST D3DXMATRIX&) CONST;
bool operator !=(CONST D3DXMATRIX&) CONST;
}D3DXMATRIX,*LPD3DXMATRIX;
除了上述定义之外,D3DX库还定义了许多实用函数,分别用于获取4 x 4单位矩阵,计算转置矩阵,计算逆矩阵,以及几种不同维数的向量矩阵乘法。
分别如下:
D3DXMATRIX *D3DXMatrixIdentity(
D3DXMATRIX *pOut;// 获取单位矩阵
);
D3DXMATRIX *D3DXMatrixTranspose(
D3DXMATRIX *pOut;//输出 MT
CONST D3DXMATRIX *pM;//输入M,
);
D3DXMATRIX *D3DXMatrixInverse(
D3DXMATRIX *pOut;//输出M-1
FLOAT * pDeterminent;//通常为0
CONST D3DXMATRIX *pM;//输入M
);
D3DXVECTOR4 *D3DXVec4Transform(
D3DXVECTOR4 *pOut;//输出 V*M
CONST D3DXVECTOR4 *pV;//输入 V
CONST D3DXMATRIX *pM;// 输入 M
);
2.程序演示
注意:程序中的一些配置不再赘述,可参考
#include<D3D10.h>
#include<iostream>
#include<D3DX10math.h>
using namespace std;
ostream& operator<<(ostream& os,D3DXVECTOR4& v)
{
os<<"{"<<v.x<<","<<v.y<<","<<v.z<<","<<v.w<<"}";
return os;
}
ostream& operator<<(ostream& os,D3DXMATRIX& m)
{
for (int i=0;i<4;++i)
{
for (int j=0;j<4;++j)
{
os<<m(i,j)<<" ";
}
os<<endl;
}
return os;
}
int main()
{
D3DXMATRIX A(
1.0f,0,0,0,
0,2.0f,0,0,
0,0,4.0f,0,
1.0f,2.0f,3.0f,1.0f
);
D3DXMATRIX B;
D3DXMatrixIdentity(&B);//求ó单蹋?位?矩?阵ó
D3DXMATRIX C = A*B;//矩?阵ó乘?法ぁ?
D3DXMATRIX D,E,F;
D3DXMatrixTranspose(&D,&A);//矩?阵ó转羇置?
D3DXMatrixInverse(&E,0,&A);//逆?矩?阵ó
F = A * E;//向ò量?*矩?阵ó
D3DXVECTOR4 P(2.0f,2.0f,2.0f,1.0f);
D3DXVECTOR4 Q(2.0f,2.0f,2.0f,0.0f);
D3DXVECTOR4 R,S;
D3DXVec4Transform(&R,&P,&A);//R = P * A
D3DXVec4Transform(&S,&Q,&A);//S = Q * 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<<"E = inverse(A) = "<<endl<<E<<endl;
cout<<"F = A*E = "<<endl<<F<<endl;
cout<<"P = "<<P<<endl;
cout<<"Q = "<<Q<<endl;
cout<<"R = P*A = "<<R<<endl;
cout<<"S = Q*A = "<<S<<endl;
system("pause");
return 0;
}
程序结果: