基础知识之数学
这一部分主要提供游戏开发所需要的数学知识的简要介绍。这是本书的预备知识。
这里的数学知识主要讨论向量(Vector)、矩阵(Matrix)、变换(transformation)等,同时包括平面(plane)及射线(ray)。
向量(vector):
在D3DX库中,用类D3DXVECTOR3表示3D空间中的向量。其中D3DXVECTOR3成员变量继承自D3DVECTOR其定义如下。
typedef struct D3DVECTOR{
float x,y,z;
}D3DVECTOR;
1. 两个向量相等,可以直接用已经重载了运算符“==”和“!=”表示。
2. 向量大小,用D3DVec3Length函数获取其模的大小。
3. 向量规范化,我们使用以下函数。函数返回变换结果的指针,所以该函数可以作为另一个函数的参数来使用。在大部分情况下,D3DX数学函数返回的都是指针结果的指针。
D3DXVECTOR3 *D3DXVec3Normalize(
D3DXVECTOR3 *pOut,
CONST D3DXVECTOR3 *pV
);
4. 向量的加法,用被重载了的“+”运算符实现。向量减法同理。
5. 向量数乘,用重载运算符“*”。
6. 向量点积(dot product),用函数D3DXVec3Dot实现,返回FLOAT类型。同理,向量叉积(cross product),用函数D3DXVect3Cross函数实现,返回运算结果(D3DXVECTOR3类型)指针。
矩阵(matrix):
关于矩阵的纯数学知识,这里不详细列出。在编写DirectX3D应用程序时,我们通常只使用4*4矩阵和1*4的行向量。4*4矩阵一般用类D3DXMATRIX表示,该类继承自D3DMATRIX结构体。
D3DXMATRIX类中有很多有用的运算符。最重要的有矩阵相乘和括号运算(访问矩阵中的元素,索引从0开始)。
D3DX库中针对D3DXMATRIX类型矩阵也定义了很多函数。包括:
D3DXMATRIX *D3DXMatrixIndentity(... //取单位矩阵
D3DXMATRIX *D3DXMatrixTranspose(... //取转置矩阵
D3DXMAREIX *D3DXMatrixInverse(... //取逆矩阵,若不可逆,返回NULL
变换(transformation):
在程序中我们之所以选择4*4矩阵而不是更接近现实生活的3*3矩阵,但是4*4矩阵更有能力表征我们所需要的所有变换,其中包括平移(translation)、透视投影(prospective projection)和反射(reflection)。为了防止向量做毫无意义的平移,我们将向量的最后一个参数w设为0,将w设为1是为了保证点的平移交换能正确进行。
矩阵变换的相关函数:
D3DXMATRIX *D3DXMatrixTranslation(... //矩阵平移
D3DXMATRIX *D3DXMatrixRotationX(... //创建绕X轴旋转的矩阵
D3DXMATRIX *D3DXMatrixScaling(... //比例变换
向量变换的相关函数:
D3DXVECTOR3 *D3DXVec3TransformCoord(... //...
小结:
1. 向量通常对具有大小和方向的物理量进行建模。
2. 我们可以用4*4矩阵表示各种变换,而用1*4的齐次向量来描述点和向量。通过矩阵和矩阵的乘法将几种变换整合成一个变换矩阵。
3. 我们用4D齐次向量来同时表示点和向量。当表示向量时,令w分量为0,当表示点时,令w为1。
——Josh 2012年10月13日