三维空间向量
在D3DX库中,用D3DVECTOR3类表示三维空间的向量。向量支持+、-、*、/、==、!= 等各种运算。
计算向量大小(向量的模)
我们利用D3DX库下面的函数便能计算向量的大小。
FLOAT D3DXVec3Length(CONST D3DXVECTOR3* Pv);
-
标准化向量
标准化向量就是让向量的大小等于1, 即被叫做单位向量。
我们利用D3DX的库下面的函数能标砖化向量。
D3DXVECTOR3 *D3DXVec3Normalize(
D3DXVECTOR3* pOut, // Result.
CONST D3DXVECTOR3* pV // The vecotr to normallize.
);
-
点积
数学上定义点积两个量向量的乘积
我们用下面的D3DX函数计算两个向量的点积:
FLAOT D3DXVec3Dot(
CONST D3DVECTOR3* pV1,
CONST D3DVECTOR3* pV2
);
-
叉积
我们用下面的D3DX函数计算两个向量的叉积:
D3DXVERTOR* D3dXVec3Cross(
D3DXVECTOR* pOut,
CONST D3DXVECTOR3* pV1,
CONST D3DXVECTOR3* pV2
);
D3DX矩阵
在D3DX中表示4 X 4的矩阵,我们用D3DXMATRIX类
D3DX库也提供下列函数:将D3DXMATRIX转化为单位矩阵,转置D3DXMATIRX矩阵以及求逆矩阵。
D3DXMATRIX* D3DXMatrixIdentity(
D3DXMATIRX *pOut // 将矩阵转换为单位矩阵
);
D3DXMATRIX* D3DXMatrixTranspose(
D3DXMATRIX* pOut, // 输出的转置矩阵
CONST D3DXMATRIX *pM // 原矩阵
);
D3DXMATRIX* D3DXMatrixInverse(
D3DXMATRIX* pOut, // 输出的逆矩阵
FLOAT* pDeterminant, //除非是必须的,一般设为0
CONST D3DXMATRIX *Pm // 原矩阵
);
假如我们将不能求逆的矩阵用求逆函数,那么函数将会返回null。我们忽视第二个参数,并且总是把他设置为0.
基本变换:
当用DirectX3D编程时,我们用4X4矩阵来进行矩阵变换,因为4X4矩阵能够更精确地描述矩阵变换。但是点和向量是3D的,想要用4X4的矩阵变换,就必须扩展为1X4的行矩阵。
第四个成员用来区别点和向量。
点是可以平移的,第四个数设为1。而对于向量,向量的位置与位置无关,为了防止对向量进行平移,把第四个数设为0.
点:[p1, p2,p3, 1]
向量:[v1, v2, v3, 0]
-
矩阵平移:
将矩阵平移的D3DX函数是:
D3DXMATRIX* D3DXMatrixTranslation(
D3DXMATRIX* pOut, // 返回评议后的矩阵
FLOAT x, // x轴移动的距离
FLOAT y,
FLOAT z,
);
-
矩阵旋转
将矩阵饶着x轴旋转的D3DX函数是:
D3DXMATRIX *D3DXMatrixRotationX
(
D3DXMATRIX* pOut, // 返回旋转后的矩阵
FLOAT Angle // Angle是旋转的弧度
);
将矩阵饶着y轴旋转的D3DX函数是:
D3DXMATRIX *D3DXMatrixRotationY
(
D3DXMATRIX* pOut, // 返回旋转后的矩阵
FLOAT Angle // Angle是旋转的弧度
);
将矩阵饶着z轴旋转的D3DX函数是:
D3DXMATRIX *D3DXMatrixRotation
Z
(
D3DXMATRIX* pOut, // 返回旋转后的矩阵
FLOAT Angle // Angle是旋转的弧度
);
-
矩阵缩放
D3DXMATRIX *D3DXMatrixScaling(
D3DXMATRIX* pOut, // 返回缩放后的矩阵
FLOAT sx, // x缩放的比例
FLOAT sy,
FLOAT sz
);
-
一些向量变换函数
D3DXVec3TransformCoord函数变换点同时设置向量第四个成员为1.
D3DXVec3TransformNormal函数变换向量并且设置第四个成员变量为0
D3DX 库也提供D3DXVec3TransformCoordArray 和D3DXVec3TransformNormalArray 来分别变
换一个点数组和向量数组
D3DX平面
一个平面能通过一个向量n 和平面上的一个点p0来描述。这个向量n 垂直于平面,它被称为此平
面的法向量
假如p、p0 都是平面上一点,那么向量(p - p0)垂直于平面的法向量。
当我们通过法向量n 和平面上一个已知点来描述一个平面时,上述等式又被写成这样:
这时d = –n·p0。
在代码中描述一个平板:仅仅需要一个法向量和常数就可以了。因为我们就使用一个4d向量来实现它。
D3DX库中用D3DXPLANE来定义一个平面。
-
点和平面的空间关系
FLOAT D3DXPlaneDotCoord(
CONST DEDXPLANE *pP,//平面
CONST D3DXVECTOR3 *Pv // 点
);
返回值为0时表示点在平面上,大于0表示点在平面正半空间。
-
创建平面
我们能通过两种方法创建平面。
第一种方法,直接用指定法线和点创建平面。假设法线n和在平面上的已知点p0 ,我们就能求出d:
D3DX库提供如下函数来完成创建平面的任务:
D3DXPLANE *D3DXPlaneFromPointNormal
(
D3DXPLANE* pOut, // Result.
CONST D3DXVECTOR3* pPoint, // Point on the plane.
CONST D3DXVECTOR3* pNormal // The normal of the plane.
);
第二种方法,我们能通过在平面上的3个点创立一个平面。
D3DX库提供如下函数来完成通过同一平面上的3个点确定一个平面:
D3DXPLANE *D3DXPlaneFromPoints
(
D3DXPLANE* pOut, // Result.
CONST D3DXVECTOR3* pV1, // Point 1 on the plane.
CONST D3DXVECTOR3* pV2, // Point 2 on the plane.
CONST D3DXVECTOR3* pV3 // Point 3 on the plane.
);
-
标准化平面
我们能用下面的D3DX函数来标准化一个平面:
D3DXPLANE *D3DXPlaneNormalize
(
D3DXPLANE *pOut, // Resulting normalized plane.
CONST D3DXPLANE *pP // Input plane.
);
-
变换平面
我们能用下面的D3DX函数来完成操作:
D3DXPLANE *D3DXPlaneTransform
(
D3DXPLANE *pOut, // Result
CONST D3DXPLANE *pP, // Input plane.
CONST D3DXMATRIX *pM // Transformation matrix.
);