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

 

 

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电磁波谱详细划分

电磁波波段名字 波长范围(单位/m) 频率范围(单位/Hz) γ射线 <10-12 X射线 10-11~10-8 紫外线 10-8~3.8-7 可见光 (8.310-7~7.610-7m) 紫 3.810-7~4.310-7 蓝 4.310-7~4.710-7 青 4.710-7~5.010-7 绿 5.010-7~5.610-7 黄 5.610-7~5…

matlab 计算N天前(后)的日期

注意时间的格式&#xff1a;是字符串、数字还是日期&#xff1f; 下面是计算明天、今天、昨天的日期。 day1 datetime(datestr(now,yyyy-mm-dd))caldays(1)%tomorrowday0 datetime(datestr(now,yyyy-mm-dd))%todayday_1 datetime(datestr(now,yyyy-mm-dd))-caldays(1)%yest…

CAT arguments dimensions are not consistent.CAT参数的维度不一致。

错误实例&#xff1a; 在写符号矩阵的时候常常会出现下面错误&#xff1a; 错误&#xff1a;CAT arguments dimensions are not consistent. CAT参数的维度不一致。 举个栗子&#xff1a; clear; close all; clc; syms A_0 B_0 B C D E F G H ;T_3 [2*A_0 C-D*1i H G*1i;C…

传感器尺寸、像素、DPI分辨率、英寸、毫米的关系

虽然网上有很多这种资料&#xff0c;但是太过于复杂&#xff0c;每个人的说法都不一样&#xff0c;看的让人云里雾里的&#xff0c;我总结了一下&#xff0c;不知道对不对&#xff01; 1. 1英寸25.4mm 2. 传感器尺寸&#xff1a;传感器的尺寸是指传感器的大小&#xff0c;一般…

利用PS将n张图制作成动态GIF图

第一步&#xff1a;打开PS,导入图片&#xff0c;文件→脚本→将文件载入堆栈… 数据量大的话&#xff0c;就耐心等待一下。 第二步&#xff1a; 创建祯动画 如果没有这个&#xff0c;可以点击窗口→时间轴 如果祯排列顺序反了&#xff0c;这样 最后按照自己要求设置祯动画时间&…

matlab padarray函数详解

本文来自于matlab帮助页面&#xff0c;命令&#xff1a;help padarray 语法&#xff1a; B padarray(A,padsize) B padarray(A,padsize,padval) B padarray(A,padsize,padval,direction) gpuarrayB padarray(gpuarrayA,___) 描述&#xff1a; B padarray(A,padsize…

matlab 三维画图函数错误提示:数据维度必须一致

用三维画图软件经常会出现下面错误 以mesh(x,y,z)为例&#xff1a; 主要原因是因为没有注意Z数据格式&#xff0c;Z必须是矩阵形式。而且Z矩阵的m*n必须与y,x相关&#xff0c; mesh(X,Y,Z) 使用 Z 确定的颜色绘制线框网格&#xff0c;因此其颜色与曲面高度成比例。如果 X 和 …

毕业论文格式修改方法

好久没更新博客&#xff0c;忙着毕业论文。刚答完辩时就想写一篇关于论文格式的博客&#xff0c;这样在修改论文的时候很轻巧很多&#xff0c;别人花一两天修改好&#xff0c;我只需要几个小时&#xff08;包括图片大小、页面调整、错别字修改&#xff09;。话不多说&#xff0…

利用matlab实现SAR 图像线性拉伸显示

SAR 图像是一幅灰度图像&#xff0c;由于极少数点&#xff08;金属、裸地、建筑&#xff09;的后向散射太强&#xff0c;而导致SAR图像强度图的值分布范围很广&#xff0c;而图像显示值的分布为[0,255]&#xff0c;因此&#xff0c;如果直接显示&#xff0c;将会导致图像颜色很…

批量下载哨兵(Sentinel)数据

由于网络的原因&#xff0c;现在下载哨兵数据很难&#xff0c;直接在国外网站上下载&#xff0c;需要科学上网。某宝上虽然也提供下载哨兵数据的服务&#xff0c;但是价格太贵了&#xff0c;因此在网上找了很久&#xff0c;发现了一个非常非常实用的工具Internet Download Mana…

carsim输出端口2的宽度无效_PIO CORE 解析 (2)

下图为一般配置的PIO CORE:具有输入&#xff0c;输出和中断信号引脚&#xff0c;通过Avalon-MM接口与系统交互。下图提供了支持双向口功能的实例图&#xff1a;PIO内核的Avalon-MM接口由单个Avalon-MM从端口组成。从端口能够进行基本的Avalon-MM读和写传输。AvalonMM从端口提供…

利用matlab提取中心线

先看看代码运行结果&#xff08;红色部分表示河流中心线&#xff0c;黑色表示河流两岸&#xff01;&#xff09;&#xff1a; 注&#xff1a; 1. 由于河流两岸的坐标不是等距采样&#xff0c;所以无法保证100%准确&#xff0c;只要按着要求处理河岸坐标数据Shape文件&#xff…

b类 蚂蚁金服_股权设计与合伙制,解析蚂蚁金服与华为的顶层结构

股权设计与合伙制商道君这篇文章讲一讲股权设计与合伙制。股权设计和合伙制两者都是企业的顶层设计&#xff0c;股权的设计和合伙人制度有不同之处&#xff0c;但核心点都只有一个那就是——争夺企业的控制权。举例&#xff1a;马云与阿里巴巴马云说&#xff0c;如果阿里巴巴不…

SARScape二次开发-IDL编程心得

最近由于项目需要&#xff0c;需要使用IDL编程。此前从接触过编程&#xff0c;但好在有matlab、C编程的一些底子&#xff0c;所以自学编程&#xff0c;进行SARScape二次开发。相比MATLAB而言&#xff0c;IDL资料少&#xff0c;而且只有英文版的官方帮助&#xff0c;学起来非常费…

地址池命令 思科理由_论CCNA基础之常用命令

Cisco常用查看命令&#xff1a;Show VLAN brief //查看端口所属VLANShow ip int brief //查看端口的启用状态特权模式下Show running-config //查看设备当前运行配置特权模式下Show clock //查看当前系统时钟特权模式下 show log //查看log 日志特权模式下show interface //查看…

SARscape 二次开发讲解

官方给了一些讲解(地址&#xff1a;SARscape/SARscape IDL Scripting/SARscape batch object)&#xff0c;以及一些参考例子&#xff08;地址&#xff1a;SARscape/SARscape IDL Scripting/Example&#xff09;都可以用来学习参考。 SARscape 二次开发可以分为10个详细的步骤&a…

applicationproperties不是小叶子_三角梅整株叶子发黄从这里找原因,早解决早生长!...

家里的花草长得好不好&#xff0c;看叶子就行&#xff0c;长势好的叶子翠绿&#xff0c;油亮有光泽&#xff0c;长势不好的叶子发黄&#xff0c;暗淡无生机。所以如果花草的叶子不健康&#xff0c;那么就是哪里出了问题&#xff0c;需要及时找出原因解决。为什么家里盆栽的三角…

利用Matlab替换图片部分颜色

目录 1. 需求分析 2. 技术分析 3. 程序代码 1. 需求分析 日常工作、研究、学习当中&#xff0c;往往需要对图片进行处理。其中图片重新着色、渲染是非常常见的。比如说去掉或则更换证件照底色&#xff1b;去掉遥感图像中黑边……为解决此类问题&#xff0c;而编写此代码。 …

十万个为什么儿童版_把中国科技传播至阿语地区,少儿社《十万个为什么》阿拉伯文版亮相童书展...

在11月13日至15日举行的第八届上海国际童书展上&#xff0c;少年儿童出版社的《十万个为什么》阿拉伯文版亮相。该书于2020年正式出版&#xff0c;中国的科技成果将沿着“一带一路”&#xff0c;传播至2.9亿人口所在的阿语地区。《绘心寓意中国古代寓言典藏图画书 曾子不撒谎》…

利用Matlab判断某些点是否在多边形区域内

目录 1. 代码作用及实现效果 2. 技术分析&#xff1a; 3. 程序 1. 代码作用及实现效果 先给各位看看具体效果&#xff0c;如下所示&#xff0c;其中红色的点表示需要判断的点&#xff0c;是否在蓝色区域内&#xff0c;从图中可知&#xff0c;有两个点在蓝色区域内&…