跳过线性代数的数学概念部分。
绝大部分内容来自于《Introduction to 3D Game Programming with DirectX12 Frank D. Luna》
引用(值得一看):http://www.360doc.com/content/14/0824/14/202378_404267225.shtml
刚刚送走了“向量”,而现在迎来了“矩阵”。英语没过四级的我在这里遇到了前所未有的阻碍……
理解向量还是比较容易的事情,但是矩阵,有太多的东西令我无法理解。比如矩阵可以作为什么东西的模型?为什么矩阵的乘法规则定义得如此奇怪?我在想,我是不是应该看看类似于《矩阵论》之类的东西……
2.矩阵(Matrix)
向量可以被认为是具有n个相互独立的性质(维度)的对象的表示,它能够模拟弹道,力,物体运动等。矩阵能用来做什么?
我们使用矩阵可以简洁地描述几何变换,如缩放、旋转和平移,也可以从一个结构到另一个结构中改变一个点或是向量的坐标。(待补充)
2.1 矩阵类型(Matrix Types)
在DirectX Math 中,使用XMMATRIX类来表示一个4x4的矩阵。当然,它被定义在DirectXMath.h文件中。不管怎么样,先来看看它是如何定义的。虽然大多数时候这些底层的定义很难懂,但是更多的时候它会给你对一个事物更深入的理解,这样有利于思考的深度。总之我的学习习惯就是这样的。
#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM)) && defined(_XM_NO_INTRINSICS_)
struct XMMATRIX
#else
__declspec(align(16)) struct XMMATRIX
#endif
{
#ifdef _XM_NO_INTRINSICS_
union
{
XMVECTOR r[4];
struct
{
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
#else
XMVECTOR r[4];
#endif
XMMATRIX() {}
XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, CXMVECTOR R3)
{
r[0] = R0;
r[1] = R1;
r[2] = R2;
r[3] = R3;
}
XMMATRIX(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);
explicit XMMATRIX(_In_reads_(16) const float *pArray);
#ifdef _XM_NO_INTRINSICS_
float operator() (size_t Row, size_t Column) const { return m[Row][Column]; }
float& operator() (size_t Row, size_t Column) { return m[Row][Column]; }
#endif
XMMATRIX& operator= (const XMMATRIX& M) { r[0] = M.r[0]; r[1] = M.r[1]; r[2] = M.r[2]; r[3] = M.r[3]; return *this; }
XMMATRIX operator+ () const { return *this; }
XMMATRIX operator- () const;
XMMATRIX& XM_CALLCONV operator+= (FXMMATRIX M);
XMMATRIX& XM_CALLCONV operator-= (FXMMATRIX M);
XMMATRIX& XM_CALLCONV operator*= (FXMMATRIX M);
XMMATRIX& operator*= (float S);
XMMATRIX& operator/= (float S);
XMMATRIX XM_CALLCONV