1. 程式人生 > >DirectX11中XNA資料庫常見的幾個函式

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相乘,得到最終結果並覆蓋先前的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

 

 

 

 

                                                                                                                                                                       路漫漫其修遠兮,吾將上下而求