(轉)【D3D11游戲編程】學習筆記三:XNAMath之XMMATRIX


(注:【D3D11游戲編程】學習筆記系列由CSDN作者BonChoix所寫,轉載請注明出處:http://blog.csdn.net/BonChoix,謝謝~)

 

       在熟悉了XMVECTOR的風格及規則之后,再來了XNA數學庫中的矩陣就容易得多了。基本上可以跟向量相類比。

       一、 矩陣類型

       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 plain copy
  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 plain copy
  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前綴后,所有單詞首字母大寫,其他小寫(這個規則本身就很常見)

 

       XNA Math部分完畢,最后附上該部分的示例代碼,供學習XMMATRIX參考。

       XMMatrixGetSampleCode();

 

       熟悉了XNA數學庫,就開始真正走進D3D11的精彩世界啦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM