DirectX11中XNA数据库常见的几个函数
?
本博客的例子來自于《基于DirectX11的3D圖形程序設計案例教程》
矩陣轉換函數XMStoreFloat*x*(*表示正數,*×*矩陣)
如:XMStoreFloat4x4(以4×4矩陣為例)
函數定義:
VOID XMStoreFloat4x4([out] XMFLOAT4X4 *pDestination, //存儲數據的地址[in] XMMATRIX M //要存儲的數據矩陣);函數介紹:
是一個行主矩陣形式。要寫出列主數據,需要在調用存儲函數之前通過XMMatrixTranpose來替換XMMATRIX。
參考:https://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.storing.xmstorefloat4x4(v=vs.85).aspx
例子:
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軸平移量);參考:https://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.matrix.xmmatrixtranslation(v=vs.85).aspx
例子:
//聲明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
參考:https://msdn.microsoft.com/en-us/library/microsoft.directx_sdk.matrix.xmmatrixrotationy(v=vs.85).aspx
例子:
//聲明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相乘,得到最終結果并覆蓋先前的mFinalmFinal = 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/4PImRota = 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相乘,得到最終結果并覆蓋先前的mFinalmFinal = 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
?
?
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?路漫漫其修遠兮,吾將上下而求
總結
以上是生活随笔為你收集整理的DirectX11中XNA数据库常见的几个函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 三维高程根据图片颜色给对应
- 下一篇: matlab 计算N天前(后)的日期