DirectX11中XNA資料庫常見的幾個函式
本部落格的例子來自於《基於DirectX11的3D圖形程式設計案例教程》
矩陣轉換函式XMStoreFloat*x*(*表示正數,*×*矩陣)
如:XMStoreFloat4x4(以4×4矩陣為例)
函式定義:
VOID XMStoreFloat4x4(
[out] XMFLOAT4X4 *pDestination, //儲存資料的地址
[in] XMMATRIX M //要儲存的資料矩陣
);
函式介紹:
是一個行主矩陣形式。要寫出列主資料,需要在呼叫儲存函式之前通過XMMatrixTranpose來替換XMMATRIX。
參考:
例子:
XMFLOAT4X4 mScalFL;
//利用XMStoreFloat4x4函式把XMMATRIX物件mScal的內容存入XMFLOAT4X4物件mScalFL中
XMStoreFloat4x4(&mScalFL, mScal);
矩陣縮放函式:XMMatrixScaling
XMMatrixScaling
函式定義:
XMMATRIX XMMatrixScaling( [in] float ScaleX, //沿x軸縮放因子ScaleX [in] float ScaleY, //沿y軸縮放因子ScaleX [in] float ScaleZ //沿z軸縮放因子ScaleX );
參考:https://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.matrix.xmmatrixscaling(v=vs.85).aspx
例子:
//宣告3個XMMATRIX物件, //分別用來表示平移矩陣(mTrans),旋轉矩陣(mRota),以及縮放矩陣(mScal) XMMATRIX mTrans, mRota, mScal; //第一步:生成縮放矩陣 //呼叫XMMatrixScaling()函式用以生成縮放矩陣,該函式3個引數分別表示 //在X,Y,Z軸上的縮放量。 //在X, Y, Z軸縮小到1/5(即0.2),然後將生成的縮放矩陣**賦值給mScal** mScal = XMMatrixScaling(0.2f, 0.2f, 0.2f);//注意0.2形式,及時變為1,也只能寫成1.0或1. //將生成的縮放矩陣列印到控制檯上,**這裡只是方便我們檢視生成的矩陣,此步驟非必須** cout << "縮放矩陣為:" << endl; //由於過載的輸出操作符<<是針對XMFLOAT4X4物件,所以這裡要將XMMATRIX //物件轉換為XMFLOAT4X4物件 //首先宣告一個XMFLOAT4X4物件 XMFLOAT4X4 mScalFL; //利用XMStoreFloat4x4函式把XMMATRIX物件mScal的內容存入XMFLOAT4X4物件mScalFL中 XMStoreFloat4x4(&mScalFL, mScal); cout << mScalFL;
矩陣平移函式:XMMatrixTranslation
XMMatrixTranslation
函式定義:
XMMATRIX XMMatrixTranslation(
[in] float OffsetX, //x軸平移量
[in] float OffsetY, //y軸平移量
[in] float OffsetZ //z軸平移量
);
例子:
//宣告3個XMMATRIX物件,
//分別用來表示平移矩陣(mTrans),旋轉矩陣(mRota),以及縮放矩陣(mScal)
XMMATRIX mTrans, mRota, mScal;
//第三步:生成平移矩陣
//在X軸平移1個單位,在Y軸平移2個單位,在Z軸平移-3個單位
//呼叫函式XMMatrixTranslation生成平移矩陣,該函式3個引數分別表示在X,Y,Z軸上的平移量
mTrans = XMMatrixTranslation(1.0f, 2.0f, -3.0f);
//將生成的旋轉矩陣列印到控制檯上,方法同上,這裡不再贅述
cout << "平移矩陣為:" << endl;
XMFLOAT4X4 mTransFL;
XMStoreFloat4x4(&mTransFL, mTrans);
cout << mTransFL;
矩陣旋轉函式:XMMatrixRotationX
例子:
//宣告3個XMMATRIX物件,
//分別用來表示平移矩陣(mTrans),旋轉矩陣(mRota),以及縮放矩陣(mScal)
XMMATRIX mTrans, mRota, mScal;
XMMATRIX XMMatrixRotationX(
[in] float Angle //繞x軸旋轉的角度,以弧度表示。當沿旋轉軸向原點看時,角度是順時針測量的。
);
XMMATRIX XMMatrixRotationY(
[in] float Angle //繞y軸旋轉的角度,以弧度表示。當沿旋轉軸向原點看時,角度是順時針測量的。
);
XMMATRIX XMMatrixRotationZ(
[in] float Angle //繞z軸旋轉的角度,以弧度表示。當沿旋轉軸向原點看時,角度是順時針測量的。
);
將三者整合起來就是剛體變換
相關知識可以參考我的另一部落格(用matlab寫的,可以看講解,程式碼不用看):
https://blog.csdn.net/weixin_41649786/article/details/82115829
例子:
//第四步:將上面生成的3個變換矩陣組合成一個最終的變換矩陣
//首先宣告一個XMMATRIX物件用來存放最終的變換矩陣
XMMATRIX mFinal;
//利用XMMatrixMultiply來完成矩陣的相乘,
//**注意**:由於矩陣相乘不具有交換性,所以做乘法時各個變換矩陣的順序很重要
//教材的例子的變換順序是縮小(mScal)->旋轉(mRota)->平移(mTrans)
//所以這裡首先將mScal和mRota相乘的中間結果放入mFinal中
mFinal = XMMatrixMultiply(mScal, mRota);
//再將中間結果與mTrans相乘,得到最終結果並覆蓋先前的mFinal
mFinal = XMMatrixMultiply(mFinal, mTrans);
//將生成的變換矩陣列印到控制檯上
cout << "最終變換矩陣為:" << endl;
XMFLOAT4X4 mFinalFL;
XMStoreFloat4x4(&mFinalFL, mFinal);
cout << mFinalFL;
矩陣相乘函式:XMMatrixMultiply
XMMatrixMultiply
函式定義:
XMMATRIX XMMatrixMultiply(
[in] XMMATRIX M1, //第一個相乘的矩陣
[in] XMMATRIX M2 //第二個相乘的矩陣
);
參考:https://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.matrix.xmmatrixmultiply(v=vs.85).aspx、
例子,前文中已經包含了
感興趣的可以看完整程式碼:來自於《基於DirectX11的3D圖形程式設計案例教程》
//本例由於需要使用XNA函式庫
//所以需要包含"d3dcompiler.h"和"xnamath.h"
#include<iostream>
#include<d3dcompiler.h>
//#include<xnamath.h>//在從Windows8開始,DirectX 11中xnamath.h就去掉了,替換成DirectXMath.h標頭檔案。
//所以如果遇到一些在舊系統上開發的程式碼示例,如果提示找不到xnamath.h的話,可以用下面兩行程式碼代替
#include <DirectXMath.h>
using namespace DirectX;
using namespace std;
//過載"<<"操作符,讓XMVECTOR的物件也可以使用"cout<<"進行輸出,
//向量會以(X, X, X)形式輸出到螢幕上
ostream& operator << (ostream& os, XMVECTOR u)
{
//XMVectorGetX(),XMVectorGetY(),XMVectorGetZ(), XMVectorGetW()
//這4個函式用來獲取XMVECTOR的4個分量
os << "(" << XMVectorGetX(u)<<","
<< XMVectorGetY(u)<<","
<< XMVectorGetZ(u)<<","
<< XMVectorGetW(u)<<")"
<< endl;
return os;
}
//過載"<<"操作符,讓XMFLOAT4X4的物件也可以使用"cout<<"進行輸出,
//矩陣會以行-列的形式輸出到螢幕上
//注意:這裡使用XMFLOAT4X4物件作為引數而不是XMMATRIX作為引數
// 這是由於因為系統(x64/x86)不同會存在對齊的問題,詳細說明
// 參考教材第 頁。使用XMMATRIX會報以下錯誤
// error C2719: “m”: 具有 __declspec(align('16')) 的形參將不被對齊
// 大家可以試一下,如果這裡使用XMMATRIX做為引數會有什麼結果
ostream& operator << (ostream& os, XMFLOAT4X4 m)
{
for(int i=0; i < 4; i++)
{
for(int j=0; j < 4; j++)
{
//通過XMFLOAT4X4的過載括號操作符引用矩陣元素
os<<"\t"<<m(i, j)<<" ";
}
os << endl;
}
os << endl;
return os;
}
int main()
{
//宣告3個XMMATRIX物件,
//分別用來表示平移矩陣(mTrans),旋轉矩陣(mRota),以及縮放矩陣(mScal)
XMMATRIX mTrans, mRota, mScal;
//第一步:生成縮放矩陣
//呼叫XMMatrixScaling()函式用以生成縮放矩陣,該函式3個引數分別表示
//在X,Y,Z軸上的縮放量。
//在X, Y, Z軸縮小到1/5(即0.2),然後將生成的縮放矩陣**賦值給mScal**
mScal = XMMatrixScaling(0.2f, 0.2f, 0.2f);
//將生成的縮放矩陣列印到控制檯上,**這裡只是方便我們檢視生成的矩陣,此步驟非必須**
cout<<"縮放矩陣為:"<<endl;
//由於過載的輸出操作符<<是針對XMFLOAT4X4物件,所以這裡要將XMMATRIX
//物件轉換為XMFLOAT4X4物件
//首先宣告一個XMFLOAT4X4物件
XMFLOAT4X4 mScalFL;
//利用XMStoreFloat4x4函式把XMMATRIX物件mScal的內容存入XMFLOAT4X4物件mScalFL中
XMStoreFloat4x4(&mScalFL, mScal);
cout<<mScalFL;
//第二步:生成旋轉矩陣
//繞Y軸旋轉45度,即1/4PI
//呼叫XMMatrixRotationY()函式用以生成旋轉矩陣,該函式只有一個引數為旋轉的弧度
//XM_PIDIV4為XNA庫定義的資料常量表示1/4PI
mRota = XMMatrixRotationY(XM_PIDIV4);
//將生成的旋轉矩陣列印到控制檯上,方法同上,這裡不再贅述
cout<<"旋轉矩陣為:"<<endl;
XMFLOAT4X4 mRotaFL;
XMStoreFloat4x4(&mRotaFL, mRota);
cout<<mRotaFL;
//第三步:生成平移矩陣
//在X軸平移1個單位,在Y軸平移2個單位,在Z軸平移-3個單位
//呼叫函式XMMatrixTranslation生成平移矩陣,該函式3個引數分別表示在X,Y,Z軸上的平移量
mTrans = XMMatrixTranslation(1.0f, 2.0f, -3.0f);
//將生成的旋轉矩陣列印到控制檯上,方法同上,這裡不再贅述
cout<<"平移矩陣為:"<<endl;
XMFLOAT4X4 mTransFL;
XMStoreFloat4x4(&mTransFL, mTrans);
cout<<mTransFL;
//第四步:將上面生成的3個變換矩陣組合成一個最終的變換矩陣
//首先宣告一個XMMATRIX物件用來存放最終的變換矩陣
XMMATRIX mFinal;
//利用XMMatrixMultiply來完成矩陣的相乘,
//**注意**:由於矩陣相乘不具有交換性,所以做乘法時各個變換矩陣的順序很重要
//教材的例子的變換順序是縮小(mScal)->旋轉(mRota)->平移(mTrans)
//所以這裡首先將mScal和mRota相乘的中間結果放入mFinal中
mFinal = XMMatrixMultiply(mScal,mRota);
//再將中間結果與mTrans相乘,得到最終結果並覆蓋先前的mFinal
mFinal = XMMatrixMultiply(mFinal,mTrans);
//將生成的變換矩陣列印到控制檯上
cout<<"最終變換矩陣為:"<<endl;
XMFLOAT4X4 mFinalFL;
XMStoreFloat4x4(&mFinalFL, mFinal);
cout<<mFinalFL;
//按照例子宣告一個XMVECTOR物件
//例子中向量為3維向量,而XMVectorSet只能生成4維向量,
//最後一個分量如果是1表示這是一個向量,如果是0表示這是一個點
//這種向量稱之為“齊次向量”,詳細說明見補充知識。
XMVECTOR vector= XMVectorSet(5.0f, 0.0f, 0.0f, 1.0f);
//利用過載的操作符<<將宣告的XMVECTOR物件列印到控制檯上
cout<<"變換前的向量為:"<<endl;
cout<<vector;
//將上面生成的最終變換矩陣應用到XMVECTOR物件上
//並將生成的新向量覆蓋原來的向量
vector = XMVector4Transform(vector, mFinal);
//將最終的向量列印到控制檯上
cout<<"變換後的向量為:"<<endl;
cout<<vector;
system("PAUSE"); //讓控制檯不要閃退
return 0;
}
注:1.本部落格的例子來自於《基於DirectX11的3D圖形程式設計案例教程》
2.以上介紹的函式都在<DirectXMath.h>這個標頭檔案中。
3.也可以下載本部落格文件,下載地址:https://download.csdn.net/download/weixin_41649786/10711869
4.跟多的相關函式可以看:https://www.cnblogs.com/zhangbaochong/p/5240358.html
路漫漫其修遠兮,吾將上下而求