XNA Math库 XMVECTOR与XMMATRIX使用规则

XMVECTOR
 
1. 在局部、全局变量中使用XMVECTOR类型;

2. 在类中定义向量成员时,使用类型XMFLOAT2,XMFLOAT3,XMFLOAT4;

3. 对类中的向量进行运算时,用Load型函数把相应向量读取到XMVECTOR中,再进行运算;

4. 运算完后把相应的结果XMVECTOR通过Store型函数存储到相应的XMFLOATx向量中。

 三、 Load型和Store型函数

       Load型函数用来从一个XMFLOATx向量中读取内容到XMVECTOR中。如下几种:

[cpp] view plaincopy
  1. XMVECTOR XMLoadFloat2(CONST XMFLOAT2 *pSource);     //从XMFLOAT2中读取内容到一个XMVECTOR中  
  2. XMVECTOR XMLoadFloat3(CONST XMFLOAT3 *pSource);     //从XMFLOAT3中读取内容到一个XMVECTOR中  
  3. XMVECTOR XMLoadFloat4(CONST XMFLOAT4 *pSource);     //从XMFLOAT4中读取内容到一个XMVECTOR中  

       此外除了XMFLOATx类型,还可以Load到其他类型的向量数据中,如:

[cpp] view plaincopy
  1. XMVECTOR XMLoadInt2(CONST UINT *pSource);       //从二维UINT向量中读取内容到一个XMVECTOR向量中  
  2. XMVECTOR XMLoadColor(CONST XMCOLOR *pSource);       //从XMCOLOR中读取内容到一个XMVECTOR中  
  3. XMVECTOR XMLoadByte4(CONST XMBYTE4 *pSource);       //从XMBYTE4中读取内容到一个XMVECTOR中  

       Store型函数用来把一个XMVECTOR存储到一个XMFLOATx向量中。如下几种:

[cpp] view plaincopy
  1. void XMStoreFloat2(XMFLOAT2 *pDest, FXMVECTOR V);   //把XMVECTOR存储到一个XMFLOAT2向量中  
  2. void XMStoreFloat3(XMFLOAT3 *pDest, FXMVECTOR V);   //把XMVECTOR存储到一个XMFLOAT3向量中  
  3. void XMStoreFloat4(XMFLOAT4 *pDest, FXMVECTOR V);   //把XMVECTOR存储到一个XMFLOAT4向量中  

       同理,除了XMFLOATx类型,还可以把XMVECTOR存储到其他类型向量中,如:

[cpp] view plaincopy
  1. void XMStoreInt3(UINT *pDest, FXMVECTOR V);     //把XMVECTOR存储到一个二维UINT向量中     
  2. void XMStoreColor(XMCOLOR *pDest, FXMVECTOR V);     //把XMVECTOR存储到一个XMCOLOR向量中  
  3. void XMStoreByte4(XMBYTE4 *pDest, FXMVECTOR V);     //把XMVECTOR存储到一个XMBYTE4向量中  

 

       由于XMVECTOR映射为一个特殊的SIMD寄存器,而不是一个struct,因此我们不能直接操作其x,y,z,w维数据,因此提供了以下几个Set和Get函数:

[cpp] view plaincopy
  1. FLOAT XMVectorGetX(FXMVECTOR V);    //得到XMVECTOR的X维数据  
  2. FLOAT XMVectorGetY(FXMVECTOR V);    //得到XMVECTOR的Y维数据  
  3. FLOAT XMVectorGetZ(FXMVECTOR V);    //得到XMVECTOR的Z维数据  
  4. FLOAT XMVectorGetW(FXMVECTOR V);    //得到XMVECTOR的W维数据  
  5.   
  6. XMVECTOR XMVectorSetX(FXMVECTOR V, FLOAT x);    //设置一个XMVECTOR的X维数据,并返回新XMVECTOR  
  7. XMVECTOR XMVectorSetY(FXMVECTOR V, FLOAT y);    //设置一个XMVECTOR的Y维数据,并返回新XMVECTOR  
  8. XMVECTOR XMVectorSetZ(FXMVECTOR V, FLOAT z);    //设置一个XMVECTOR的Z维数据,并返回新XMVECTOR  
  9. XMVECTOR XMVectorSetW(FXMVECTOR V, FLOAT w);    //设置一个XMVECTOR的W维数据,并返回新XMVECTOR  

为了更好地利用SIMD,当XMVECTOR作为函数参数类型时,有特殊的规定。这些规则与平台相关,比如在32位和64位的Windows及XBox360下规则就不一样。为了在写代码时与平台无关,XNA Math专门针对函数参数类型定义了这两个类型:CXMVECTOR和FXMVECTOR。在不同的平台下这两个类型有着相应的不同的定义,对于程序员在写代码时则无需考虑这些,只要服从相应的规则即可。规则如下:

       在一个函数中,前三个使用到XMVECTOR类型的参数,必须为FXMVECTOR;之后所有其他的XMVECTOR类型参数要为CXMVECTOR。

当用到常量型的XMVECTOR时,应该使用XMVECTORF32类型,尤其是当使用初始化式时。
如果想事先定义一些常量型的XMVECTOR,则可以用const XMVECTORF32类型来定义,在程序中用到XMVECTOR类型时,再利用类型转换(static_cast)转换为XMVECTOR类型即可。比如我们可能想事先定义好各种常见的颜色,像白色可以这样定义:const XMFLOAT32 White = {1.f, 1.f, 1.f, 1.f};
 
 

 

 
 XMMATRIX

一、 矩阵类型

       XNA数学库中针对矩阵的类型为XMMATRIX。这是一个4x4的矩阵,里面可以容纳16个32位浮点数。对于XMMATRIX的初始化,可以有多种方法,一种方法是传4个XMVECTOR参数,每个XMVECTOR对应矩阵的一行;第二种方法是直接传递16个浮点数,代表整个矩阵的内容;第三种方法是用一个FLOAT型的数组,代表整个矩阵的内容。当然,这三种方法都有点麻烦,不过在实际中,自己来手动初始化矩阵的地方也不多,了解下其初始化方法即可。其次,XMMATRIX重载了()操作符,用来访问矩阵中的成员,用法跟正常矩阵访问完全一样,即传递两个参数(row, col)即可。 XMMATRIX也重载了*和*=操作符,用途很明显,用来进行矩阵的乘积。

       二、 类成员矩阵类型

       跟XMVECTOR一样,作为局部或全局变量使用时,直接使用XMMATRIX即可。当作为类中成员类型时,推荐使用的类型为XMFLOAT4X4,从名字上一目了然,即4x4矩阵,不像向量一样提供了多种维的类型,这里只提供了4x4的通用类型的矩阵,如果是用较小维的矩阵,多出来的不关心即可。XMFLOAT4X4也重载了()操作符用来访问内部成员。

       三、 作为函数参数类型时的规则

       同样,XMMATRIX作为函数参数类型时,其使用也要服从一定的规则。这里规则更为简单,即统一要求使用CXMMATRIX。即在函数定义中,类型为XMMATRIX的形参必须用CXMMATRIX类型代替。

       四、 矩阵相关函数

[cpp] view plaincopy
  1. XMMATRIX XMMatrixIdentity();                //返回单位矩阵,即对角线全1,其他全0  
  2. BOOL     XMMatrixIsIdentity(CXMMATRIX M);       //判断一个矩阵是否为单位矩阵  
  3. XMMATRIX XMMatrixMultiply(CXMMATRIX A, CXMMATRIX B);    //两矩阵相乘  
  4. XMMATRIX XMMatrixTranspose(CXMMATRIX M);        //矩阵转置  
  5. XMVECTOR XMMatrixDeterminant(CXMMATRIX M);      //求矩阵对应行列式的值det  
  6. XMMATRIX XMMatrixInverse(XMVECTOR *pDet, CXMMATRIX M);  //求矩阵M的逆,*pDet为该矩阵的det  

 五、 3D中矩阵变换相关函数

[cpp] view plaincopy
  1. XMMATRIX XMMatrixScaling(FLOAT scaleX, FLOAT scaleY, FLOAT scaleZ); //伸缩变化,指定三个方向上的伸缩比  
  2. XMMATRIX XMMatrixScalingFromVector(FXMVECTOR scale);            //通过向量指定三个方向伸缩比,求伸缩变换  
  3. XMMATRIX XMMatrixRotationX(FLOAT angle);                //围绕x轴的旋转变换  
  4. XMMATRIX XMMatrixRotationY(FLOAT angle);                //围绕y轴的旋转变换  
  5. XMMATRIX XMMatrixRotationZ(FLOAT angle);                //围绕z轴的旋转变换  
  6. XMMATRIX XMMatrixRotationAxis(FXMVECTOR axis, FLOAT angle);     //围绕任意轴axis的旋转变换  
  7. XMMATRIX XMMatrixTranslation(FLOAT x, FLOAT y, FLOAT z);        //平移变换,指定三个方向的平移量  
  8. XMMATRIX XMMatrixTranslationFromVector(FXMVECTOR offset);       //通过向量指定三个方向的平移量,求平移变换  
  9. XMVECTOR XMVector3Transform(FXMVECTOR v, CXMMATRIX m);          //向量、矩阵相乘  
  10. XMVECTOR XMVector3TransformCoord(FXMVECTOR v, CXMMATRIX m);         //向量、矩阵相乘,但向量w=1,因此为点的变换  
  11. XMVECTOR XMVector3TransformNormal(FXMVECTOR v, CXMMATRIX m);        //向量、矩阵相乘,但向量w=0,因此为向量的变换  

 

       关于矩阵的基本知识就这么些,相比XMVECTOR简单了很多。等用多了,习惯了相关的规则及命名后,XNA Math库还是相当好用的~不但可以用于学习d3d11的过程中,而且在以后自己构架框架时也可以考虑使用,毕竟它进行了很大的优化,一般人自己很写出比它性能更好的数学库了,当然为了学习3D数学而自自己动手写数学库例外。

       下面是我学习XNA数学库时的一点小总结,其实这太明显了,不过对于更快的记住函数命名、熟练地使用还是有一定作用的:

       1. 所有类型名全部大写:XMVECTOR、XMVECTORF32、XMFLOAT2、XMFLOAT3、XMFLOAT4、XMCOLOR、XMBYTE4、XMMATRIX、XMFLOAT4X4等等

       2. 所有函数名以XM开头(意指DirectX Math)

       3. 跟向量操作相关的函数名在XM后全部以Vector3开头:XMVector3Length、XMVector3Normalize、XMVector3Transform等等(Load型、Store型、Set型、Get型等不属于“操作”相关的范畴,不满足这个特性)

       4. 跟矩阵操作相关的函数名在XM后全部以Matrix开头:XMMatrixScaling、XMMatrixRotationX、XMMatrixTranspose等等

       5. XMVector3、XMMatrix前缀后,所有单词首字母大写,其他小写(这个规则本身就很常见)

你可能感兴趣的:(DirectX,3D,11)