本博客的例子来自于《基于DirectX11的3D图形程序设计案例教程》
如: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
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
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;
参考: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
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
#include
//#include//在从Windows8开始,DirectX 11中xnamath.h就去掉了,替换成DirectXMath.h头文件。
//所以如果遇到一些在旧系统上开发的代码示例,如果提示找不到xnamath.h的话,可以用下面两行代码代替
#include
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"<旋转(mRota)->平移(mTrans)
//所以这里首先将mScal和mRota相乘的中间结果放入mFinal中
mFinal = XMMatrixMultiply(mScal,mRota);
//再将中间结果与mTrans相乘,得到最终结果并覆盖先前的mFinal
mFinal = XMMatrixMultiply(mFinal,mTrans);
//将生成的变换矩阵打印到控制台上
cout<<"最终变换矩阵为:"<
注:1.本博客的例子来自于《基于DirectX11的3D图形程序设计案例教程》
2.以上介绍的函数都在
3.也可以下载本博客文档,下载地址:https://download.csdn.net/download/weixin_41649786/10711869
4.跟多的相关函数可以看:https://www.cnblogs.com/zhangbaochong/p/5240358.html
路漫漫其修远兮,吾将上下而求