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

 

 

 

 

                                                                                                                                                                       路漫漫其修远兮,吾将上下而求

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心网千结

若有所帮助,请点赞支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值