DirectX12-常用数学库
作者:互联网
·采用SIMD流指令扩展2(SSE2)指令集
·头文件:
#include<DirectXMath.h>
#include<DirectXPackedVector.h>
1.向量
·核心向量类型:XMVECTOR(局部、全局变量)
typedef _m128 XMVECTOR; //_m128为特殊的SIMD类型
·对于类中的数据成员,分别使用XMFLOAT2、XMFLOAT3、XMFLOAT4
·运算前,通过加载函数将XMFLOATn类型转换为XMVECTOR类型
·存储函数将XMVECTOR转换为XMFLOATn
·加载函数:
XMVECTOR XM_CALLCNOV XMLoadFloatn( const XMFLOATn* pSource );
·存储函数:
void XM_CALLCONV XMStoreFloatn( XMFLOATn* pDestination, FXMVECTOR V );
·从XMVECTOR实例取得某一向量分量或某一向量分量转换为XMVECTOR类型:
float XM_CALLCONV XMVectorGetX( FXMVECTOR V ); //X,Y,Z,W
XMVECTOR XM_CALLCONV XMVectorSetX( FXMVECTOR V, float x); //X,Y,Z,W
·XM_CALLCONV:放置在函数名前,根据编译器的版本确定对应的调用约定属性
·构造函数不适用XM_CALLCONV
·为提高效率,XMVECTOR类型的值作为函数的参数直接传送至SSE/SSE2寄存器,而不存于栈内
·传递XMVECTOR的参数规则:
·前三个XMVECTOR参数应为FXMVECTOR
·第四个为GXMVECTOR
·第五、六个为HXMVECTOR
·其余为CXMVECTOR
·32位操作系统上,编译器根据__fastcall调用约定将前三个XMVECTOR参数传递到寄存器中,其余存于栈;而根据__vectorcall调用约定将前六个XMVECTOR参数传递至寄存器,其余存于栈
·建议:前三个XMVECTOR参数用FXMVECTOR类型,其余XMVECTOR参数用CXMVECTOR类型
·在XMVECTOR的参数间掺杂非XMVECTOR参数,统计时对其他类型的参数视若无睹
·传递XMVECTOR参数的规则仅适用于“输入”参数,“输出”的XMVECTOR参数则不会占用SSE/SSE2寄存器
·XMVECTORF32:XMVECTOR的常量实例
·通过XMVECTORU32创建由整形数据构成的XMVECTOR向量
static const XMVECTORU32 vGrabY = {
0x00000000,0xFFFFFFFF,0X00000000,0X00000000
};
·XMVECTOR类型对加、减、标量乘提供了重载运算符
·弧度和角度间的互相转化
inline float XMConvertToRadians( float fDegrees )
{
return fDegrees * ( XM_PI / 180.0f );
}
inline float XMConvertToDegrees( float fRadians)
{
return fRadians * ( 180.0f / XM_PI );
}
·求两数间较大值及较小值
template< class T > inline T XMMin( T a, T b ) { return ( a < b ) ? a : b;}
template< class T > inline T XMMax( T a, T b ) { return ( a > b ) ? a : b;}
·Setter函数
//返回零向量
XMVECTOR XM_CALLCONV XMVectorZero();
//返回向量(1,1,1,1)
XMVECTOR XM_CALLCONV XMVectorZeroSplatOne();
//返回向量(x,y,z,w)
XMVECTOR XM_CALLCONV XMVECTORSet( float x, float y, float z, float w );
//返回向量(value,value,value,value)
XMVECTOR XM_CALLCONV XMVectorReplicate( float Value );
//返回向量(vx,vx,vx,vx)
XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR) //X,Y,Z
·向量函数
//返回|v|
XMVECTOR XM_CALLCONV XMVector3Length( FXMVECTOR v );
//返回||V||²
XMVECTOR XM_CALLCONV XMVector3LengthSq( FXMVECTOR v );
//返回V1 * V2
XMVECTOR XM_CALLCONV XMVector3Dot( FXMVECTOR V1, FXMVECTOR V2 );
//返回V1 x V2
XMVECTOR XM_CALLCONV XMVectorCross( FXMVECTOR V1, FXMVECTOR V2 );
//返回v // ||v||
XMVECTOR XM_CALLCONV XMVector3Normalize( FXMVECTOR V );
//返回一个正交于v的向量
XMVECTOR XM_CALLCONV XMVector3Orthogonal( FXMVECTOR V );
//返回v1、v2的夹角
XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors( FXMVECTOR V1, FXVECTOR V2);
//返回v1 == v2?
bool XM_CALLCONV XMVector3Equal( FXMVECTOR V1, FXMVECTOR V2 );
//返回v1 != v2 ?
bool XM_CALLCONV XMVECTOR3NotEqual( FXMVECTOR V1, FXMVECTOR V2);
- 为弥补浮点数精确性上的不足,通过比较两个浮点数是否近似相等来加以解决:
- 定义Epsilon常量,一个非常小的值。若两数差小于Epsilon则近似相等
2.矩阵
-
头文件:
#include<DirectXMath.h>
-
//用四个XMVECTOR表示矩阵 XMVECTOR r[4]; //指定四个向量初始化矩阵 XMMATRIX( FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2,CXMVECTOR R3 ) { r[0] = R0; r[1] = R1; r[2] = R2; r[3] = R3; } //16个矩阵元素初始化矩阵(...仅仅是省略号) XMMATRIX( float m00, float m01, ... , float m33 ); //以含有16个浮点数的数组初始化矩阵 explict XMMATRIX( _IN_reads_[16] const float* pArray );
-
用XMFLOAT4X4存储类中的矩阵数据成员
-
加载函数、存储函数
inline XMMATRIX XM_CALLCONV XMLoadFloat4x4 ( const XMFLOAT4X4* pSource ); inline void XM_CALLCONV XMStoreFloat4x4 ( XMFLOAT4X4* pDestination, FXMMATRIX M );
-
矩阵函数
//返回单位矩阵I XMMATRIX XM_CALLCONV XMMatrixIdentity (); //如果为单位矩阵则返回true bool XM_CALLCONV XMMatrixIsIdentity ( FXMMATRIX M ); //返回矩阵乘积AB XMMATRIX XM_CALLCONV XMMatrixMultiply ( FXMMATRIX A, FXMMATRIX B); //返回M的转置 XMMATRIX XM_CALLCONV XMMatrixTranspose ( FXMMATIX M ); //返回( detM, detM, det M, det M) XMVECTOR XM_CALLCONV XMMatrixDeterminant ( FXMMATRIX M ); //返回M的逆矩阵 XMMATRIX XM_CALLCONV XMMatrixInverse ( XMVECTOR* pDeterminant, FXMMATRIX M );
-
声明具有XMMATRIX参数的函数时,应注意一个XMMATRIX应计作4个XMVECTOR参数。其它规则与传入XMVECTOR类型的参数相一致
-
传入函数的XMVECTOR参数,第一个XMMATRIX参数应为FXMMATRIX,其余XMMATRIX参数为CXMMATRIX
-
32位操作系统上__fastcall调用中,因为寄存器只支持三个XMVECTOR参数,因此矩阵类型的数据只可通过堆栈加以引用
-
在构造函数中用CXMMATRIX类型获取XMMATRIX参数,对构造函数不要使用XM_CALLCONV
3.变换
-
变换函数
//构建一个缩放矩阵 XMMATRIX XM_CALLCONV XMMatrixScaling ( float ScaleX, float ScaleY, float ScaleZ ); //以一个3D向量中的分量构建缩放矩阵 XMMATRIX XM_CALLCONV XMMatrixScalingFromVector ( FXMVECTOR Scale ); //构建一个绕x/y/z轴旋转的矩阵 XMMATRIX XM_CALLCONV XMMartixRotationX ( float Angle ); //构建一个绕任意轴旋转的矩阵 XMMATRIX XM_CALLCONV XMMatrixRotationAxis ( FXMVECTOR Axis, float Angle ); //构建一个平移矩阵 XMMATRIX XM_CALLCONV XMMatrixTranslation ( float OffsetX, float OffsetY, float OffsetZ ); //以一个3D向量中的分量构建平移矩阵 XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector ( FXMVECTOR Offset ); //以下两个函数不必显示设置w分量,含有默认值 //计算向量与矩阵的乘积Vm,此函数为针对点的变换,总是默认令Vw = 1 XMVECTOR XM_CALLCONV XMVector3TransformCoord ( FXMVECTOR V, CXMMATRIX M ); //计算向量与矩阵的乘积Vm,此函数为针对向量的变换,总是默认令Vw = 0 XMVECTOR XM_CALLCONV XMVector3TransformNormal ( FXMVECTOR V, CXMMATRIX M );
标签:常用,XM,float,数学,DirectX12,CALLCONV,FXMVECTOR,XMVECTOR,XMMATRIX 来源: https://www.cnblogs.com/chenglixue/p/16367540.html