左手系和右手系
左手坐标系就是x轴的正方向指向右,y轴正方向指向上,z轴的正方向指向里面。当伸出左手,让四个手指指着x轴的正方向,大母指指向z轴的正方向,牚心指向y轴的正方向。符合这样规则的坐标系,就叫做左手坐标系。
向量
程序中可使用D3DXVECTOR3数据结构来代表向量,该结构需要添加#include <d3dx9math.h>头文件
计算向量的长度:向量的模就是有向线段的长度,
D3DX库中可以使用D3DXVec3Length来计算向量的模
int main()
{
D3DXVECTOR3 v(1.0f, 2.0f, 3.0f);
float length = D3DXVec3Length(&v);
std::cout << length << std::endl;
}
向量规范化:使向量的模变为1,可以通过将向量的每个分量都除以该向量的模来实现向量的规范化
D3DX库中可以使用D3DXVec3Normalize来计算,该函数返回指向变换结果的指针,所以该函数可以作为另一个函数的参数来使用,在大部分情况下,除非特别声明,一个D3DX数学函数均返回一个指向结果的指针
D3DXVECTOR3* WINAPI D3DXVec3Normalize
( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV );
向量加法:向量的加法定义为俩个向量对应分量的分别相加,只有维数相同的俩个向量才能进行加法运算,程序中实现向量加法,可以使用重载后的加法运算符(+)
向量减法:规则同加法一致
数乘:标量可以与向量相乘,该运算可以对向量进行缩放,与正数相乘不改变向量方向,与负数相乘后方向与原来相反
点积:是向量代数所定义的俩种乘法之一,结果为一个标量 上述公式并不具有明显几何意义,但由余弦定理可知
即俩向量的点积为二者夹角的余弦乘以俩个向量的模的乘积。可使用D3DXVec3Dot来计算点积
性质:若u·v=0则uv,u·v>0则俩向量之间夹角<
,u·v<0则俩向量之前夹角>
叉积:与点积不同,叉积的结果是另一个向量,如果取向量u和v的叉积,运算所得向量p与u、v彼此正交, 可使用D3DXVec3Cross计算,由图可知向量-p也是与向量u、v正交,叉积运算的次序决定了结果是p还是-p,换言之
,这表明叉积不具备交换性,可以借助左右手法则来判断,目前使用的为左手坐标系,则使用左右法则判断,左手四指朝向第一个向量u,然后四指朝着手心的方向弯曲到第二个向量v的方向,拇指的指向就是这俩个向量叉积的方向。
矩阵
一个mxn矩阵是一个m行、n列的矩形数组,行数和列数指定了矩阵的维数,有时一个矩阵包含单行或单列,这样的矩阵称为行向量或列向量,如果俩个矩阵维数相同且对应元素也相同,则二者相等,俩个矩阵只有维数相同时才能进行加法、减法运算。
矩阵乘法:为了计算矩阵乘积AB,矩阵A的列数必须等于B的行数,矩阵的乘法一般不具有交换性,若A为矩阵,B为
矩阵,则乘积AB有意义,且等于一个
矩阵C,其中乘积C的第ij个元素的值等于A的第i个行向量与B的第j个列向量的点积
单位矩阵:单位矩阵的特点是除主对角线上元素为1外,其余元素均为0,而且是方阵,用一个单位矩阵和某个矩阵相乘,不改变该矩阵,单位矩阵对于标量可认为是矩阵中的"1"
逆矩阵:矩阵数学中没有类似于标量除法的运算,但是有一种乘法逆运算,只有方阵才可能有逆矩阵,一个矩阵
的逆矩阵也是一个
矩阵,用符号
表示,并非所有方阵都有逆矩阵,一个矩阵与其逆矩阵的乘积为单位阵:
,另一个关于矩阵乘积的逆的有用性质:
该性质的前提是矩阵A、B均可逆,且均为维数相同的方阵
矩阵的转置:矩阵的转置可通过交换矩阵的行和列来实现,一个的矩阵转置是一个
矩阵,用符号
来表示矩阵
的的转置
D3DX矩阵:在D3DX中表示4x4的矩阵,可使用类D3DXMATRIX,它的一个重要的运算符是括号运算符,利用该运算符可以方便的访问矩阵中每一个元素,索引应像C语言中数组一样,下标从0开始,D3DX库对于D3DXMATRIX类型的矩阵,提供了转为单位矩阵、取转置以及求逆的函数,如果传入D3DXMatrixInverse函数的矩阵不可逆,则返回一个NULL值,本书中一般忽略第二个参数,调用时设置为0
矩阵的访问:1.使用括号运算符"()"(对于D3DXMATRIX类型) 2.使用索引运算符"[]"(对于D3DXMATRIX*)
//括号运算符访问
D3DXMATRIX M;
M(0,0) = 5.0f;
//索引运算符访问
D3DXMATRIX* M;
M[0][0] = 5.0f;
D3DXMatrixIdentity //转化单位矩阵
D3DXMatrixTranspose //取转置
D3DXMatrixInverse //求逆
D3DXMATRIX A(...);
D3DXMATRIX B;
D3DXMatrixInverse(&B, 0, &A);
基本变换:使用Direct3D编程时,我们使用4x4的矩阵表示一个变化,思路如下,设置一个4x4的矩阵中元素的值,使其表示一具体变化,然后将某一点的坐标或某一向量的分向量放入一个1x4的的行向量v中,乘积就生成了一个新的经过变化的向量
,之所以使用4x4矩阵,是因为这种特定维数的矩阵有能力表征所需要的所有变换,至于我们所关心的点和向量都是3D的,为什么要使用1x4的行向量,是为了使向量-矩阵乘积有意义(1x4行向量与4x4矩阵乘积)。
行向量w分量表示: 行向量的第四个分量用w表示,将点放入1x4的行向量时,我们将w分量设为1,这能够保证点的平移变换正确进行,因为向量不含位置信息,所以没有对向量定义平移变换,将1x3向量置入1x4向量时,将w分量置为0(防止对向量实施平移变换),例如点置入行向量后应为
,向量
置入行向量后应为
齐次向量、齐次空间:扩展后的4D向量称为齐次向量(可表示点和向量),当一个行向量的w分量不为0,不为1()时,我们称该向量处于齐次空间中,以区别与3D空间,将齐次空间中向量映射回3D房间的方法是,用w分量去除该齐次向量的每一个分量,进行3D图形编程时,如果涉及到透视投影,则经常需要将向量由齐次空间映射到3D空间
平移矩阵:将向量(一个点)进行平移操作时,可以使用D3DXMatrixTranslation创建一个平移矩阵,并将向量与该矩阵进行相乘,乘积后为平移之后的向量
旋转矩阵:用于创建绕x、y、z轴旋转的旋转矩阵函数为 D3DXMatrixRotationX D3DXMatrixRotationY D3DXMatrixRotationZ
比例变换矩阵:如果想让一个向量沿x、y、z轴分别放大,则可以使用D3DXMatrixScaling来创建比例矩阵,如果将比例矩阵的各个缩放因子取倒数,就得到该矩阵的逆矩阵
向量变换:D3DXVec3TransformCoord 用于对点进行变换,并假定向量的第4个分量为1,D3DXVec3TransformNormal 用于对向量的变换,并假定向量的第4个分量为0,D3DXVec3TransformCoordArray用于点数组变换 D3DXVec3TransformNormalArray用于向量数组变换