【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類型代替。

       四、 矩陣相關函數

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參考。

       XMMatrixGetSampleCode();

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章