您的位置:首页 > 其它

Direct3D数学基础函数

2016-11-22 16:45 302 查看
转载自:http://blog.csdn.net/blues1021/article/details/41790795
一、向量:
1.直接
相等加减直接
D3DXVec3Length
D3DXVec3Normalize
数乘直接

[b]2.点乘D3DXVec3Dot[/b]

点乘D3DXVec3Dot,主要计算夹角(投影角)
V1( x1, y1).V2(x2, y2) = x1*x2 + y1*y2
A.B = |A||B|Cos(θ)
FLOAT D3DXVec3Dot(
  _In_  const D3DXVECTOR3 *pV1,
  _In_  const D3DXVECTOR3 *pV2
);

3.叉乘D3DXVec3Cross
叉乘D3DXVec3Cross,主要计算平面的法向量
|A x B| = |A||B|Sin(θ)
a= [a1, a2, a3] =a1i+ a2j+ a3k
b= [b1,b2,b3]=b1i+ b2j+ b3k ;

a × b= [a2b3-a3b2,a3b1-a1b3, a1b2-a2b1]
D3DXVECTOR3* D3DXVec3Cross(
  _Inout_  D3DXVECTOR3 *pOut,
  _In_     const D3DXVECTOR3 *pV1,
  _In_     const D3DXVECTOR3 *pV2
);

二、矩阵:
1.直接
相等加减直接
数乘直接

矩阵乘以矩阵:
D3DXMATRIX* D3DXMatrixMultiply(
_Inout_  D3DXMATRIX *pOut, // 矩阵相乘所得结果
_In_     const D3DXMATRIX *pM1,// 输入矩阵1
_In_     const D3DXMATRIX *pM2 // 输入矩阵2
);


2.单位/转置/逆矩阵
单位矩阵:D3DXMatrixIdentity
D3DXMATRIX* D3DXMatrixIdentity(
  _Inout_  D3DXMATRIX *pOut
);

转置D3DXMatrixTranspose
D3DXMATRIX* D3DXMatrixTranspose(
  _Inout_  D3DXMATRIX *pOut,
  _In_     const D3DXMATRIX *pM
);

D3DXMatrixInverse
D3DXMATRIX* D3DXMatrixInverse(
  _Inout_  D3DXMATRIX *pOut,
  _Inout_  FLOAT *pDeterminant, // 行列式的值,如果行列式值为NULL也是可以的,否则用伴随矩阵/行列式值求得矩阵的逆
  _In_     const D3DXMATRIX *pM
);

3.平移D3DXMatrixTranslation

D3DXMATRIX* D3DXMatrixTranslation(
_Inout_  D3DXMATRIX *pOut,
_In_     FLOAT x,
_In_     FLOAT y,
_In_     FLOAT z
);


4.旋转D3DXMatrixRotationX/Y/Z

D3DXMATRIX* D3DXMatrixRotationX(
_Inout_  D3DXMATRIX *pOut,
_In_     FLOAT Angle // 弧度角,旋转方向是从旋转轴的正方向往原点看的顺时针方向
);


5.缩放D3DXMatrixScaling

D3DXMATRIX* D3DXMatrixScaling(
_Inout_  D3DXMATRIX *pOut,
_In_     FLOAT sx,
_In_     FLOAT sy,
_In_     FLOAT sz
);

6. 3D点/向量乘以矩阵实现真正物体变换
点乘矩阵:D3DXVec3TransformCoord将结果向量第四个设置为1,D3DXVec3TransformNormal将结果向量第四个设置为0.

//Coordinate是坐标系,基于坐标点的变换,需要将向量解释为2D/3D点
//变换向量将第四位置为1,需要考虑平移(pV->x, pV->y, pV->z, 1)

D3DXVECTOR3* D3DXVec3TransformCoord(
_Inout_  D3DXVECTOR3 *pOut,
_In_     const D3DXVECTOR3 *pV,
_In_     const D3DXMATRIX *pM // 都是考虑平移的矩阵
);

// Normal是法向量,就是纯向量的变换,向量是只有大小和方向的,需要将向量解释为2D/3D纯向量

//变换向量将第四位置为0,也就是忽略平移(pV->x, pV->y, pV->z, 0)

D3DXVECTOR3* D3DXVec3TransformNormal(
_Inout_  D3DXVECTOR3 *pOut,
_In_     const D3DXVECTOR3 *pV,
_In_     const D3DXMATRIX *pM //都是考虑平移的矩阵
);


点数组和向量数组乘以矩阵:D3DXVec3TransformCoordArray/D3DXVec3TransformNormalArray.

D3DXVECTOR3* D3DXVec3TransformCoordArray(
_Inout_  D3DXVECTOR3 *pOut,
_In_     UINT OutStride, // 输出数组元素的字节步长,sizeof(D3DVECTOR3)或者sizeof(VERTTEX)都可以
_In_     const D3DXVECTOR3 *pV,
_In_     UINT VStride, // 输入数组元素的步长sizeof(D3DXVECTOR3)
_In_     const D3DXMATRIX *pM,
_In_     UINT n
);

D3DXVECTOR3* D3DXVec3TransformNormalArray(
_Inout_  D3DXVECTOR3 *pOut,
_In_     UINT OutStride,// 输出数组步长
_In_     const D3DXVECTOR3 *pV,
_In_     UINT VStride, // 输入数组步长
_In_     const D3DXMATRIX *pM,
_In_     UINT n
);
D3DXVec3TransformNormalArray参数和CoordArray一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  direct3d