(注:【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類型代替。
四、 矩陣相關函數
XMMATRIX XMMatrixIdentity(); //返回單位矩陣,即對角線全1,其他全0
BOOL XMMatrixIsIdentity(CXMMATRIX M); //判斷一個矩陣是否爲單位矩陣
XMMATRIX XMMatrixMultiply(CXMMATRIX A, CXMMATRIX B); //兩矩陣相乘
XMMATRIX XMMatrixTranspose(CXMMATRIX M); //矩陣轉置
XMVECTOR XMMatrixDeterminant(CXMMATRIX M); //求矩陣對應行列式的值det
XMMATRIX XMMatrixInverse(XMVECTOR *pDet, CXMMATRIX M); //求矩陣M的逆,*pDet爲該矩陣的det
五、 3D中矩陣變換相關函數
XMMATRIX XMMatrixScaling(FLOAT scaleX, FLOAT scaleY, FLOAT scaleZ); //伸縮變化,指定三個方向上的伸縮比
XMMATRIX XMMatrixScalingFromVector(FXMVECTOR scale); //通過向量指定三個方向伸縮比,求伸縮變換
XMMATRIX XMMatrixRotationX(FLOAT angle); //圍繞x軸的旋轉變換
XMMATRIX XMMatrixRotationY(FLOAT angle); //圍繞y軸的旋轉變換
XMMATRIX XMMatrixRotationZ(FLOAT angle); //圍繞z軸的旋轉變換
XMMATRIX XMMatrixRotationAxis(FXMVECTOR axis, FLOAT angle); //圍繞任意軸axis的旋轉變換
XMMATRIX XMMatrixTranslation(FLOAT x, FLOAT y, FLOAT z); //平移變換,指定三個方向的平移量
XMMATRIX XMMatrixTranslationFromVector(FXMVECTOR offset); //通過向量指定三個方向的平移量,求平移變換
XMVECTOR XMVector3Transform(FXMVECTOR v, CXMMATRIX m); //向量、矩陣相乘
XMVECTOR XMVector3TransformCoord(FXMVECTOR v, CXMMATRIX m); //向量、矩陣相乘,但向量w=1,因此爲點的變換
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參考。
熟悉了XNA數學庫,就開始真正走進D3D11的精彩世界啦~