3D游戏编程入门(十八)D3D立体几何和线性代数知识
逃的过一时,逃不过一世>_<某志还是要无奈的复习D3D相关几何线代知识。呼,还是从0开始这方面的复习吧。
D3D立体几何和线性代数知识
(一)向量
- 向量基本相关概念
我们在物理学中,常用一个有方向的线段来表示我们的作用力,它就是向量表示法,向量具有两大要素:长度,方向。
由于位置并不是向量的特性,所以,我们无论向量进行如何的平移,我们都认为它是相等的。
因为向量本身具有着方向的特性,所以我们的任何空间坐标系都对其无效,不会改变一个向量的任何信息,我们要想获得该向量在改变后的坐标系中的性质,需要重新进行计算,但是我们说这个向量并没有发生任何变化。
因为我们的向量在空间可以随意的平移并且不变,所以我们终究能获得一个尾顶点为坐标系原点的一个相等向量。此时该向量的表示由其头顶点坐标表示。所以向量的记录表示很类似于一个点(x,y,z),但从意义上来说,它与点不同,有长度和方向。
向量的长度,我们称之为模,以前也有称为强度的,我爱称之为模,相对现在更流行些。
- 特殊向量
- 零向量:各成分均为0的向量。(0,0,0)
- 单位向量:当向量的模为1时,我们称其为单位向量。
- 标准基础向量:分别沿着坐标系三轴前进的三个单位向量。(0,1,0)(1,0,0)(0,0,1)只有这三个。
- 向量模的算法
一向量u(x,y,z)的模|u|*|u|=x*x+y*y+z*z,也就是说向量模等于向量各数值的平方和再开根号。
- 标准化向量
我们将向量的各成分除以其模,则获得一个新的向量,该向量模为1,是个单位向量,该过程叫标准化向量。
- 向量加减
我们可以将相同维数的向量进行相加,相减,得到的新向量值为此两向量中每个成分元素的和或差
例N=U-V=(Ux-Vx,Uy-Vy,Uz-Vz)
- 向量的数乘
我们将一个向量和一个常量数值进行相乘,将获得一个新的向量,它的方向不改变,仅仅是模有增减。当我们乘的常量数值为负数时,则此向量方向进行反转。
例N=kU=(k*Ux,k*Uy,k*Uz)
- 向量的点乘,叉乘
两个向量进行点乘S=UV=(Ux*Vx,Uy*Vy,Uz*Vz),它将得到一个新的向量
两个向量进行叉乘P=U*V=[(Uy*Vz-Uz*Vy),(Uz*Vx-Ux*Vz),(Ux*Vy-UyVx)],它将得一个垂直于原来两个向量的新向量
(二)矩阵
- 矩阵相关概念
一个mXn矩阵表示是一个m列n行的矩形阵列。 矩阵中元素下标为Vmn。
当我们的矩阵仅有一行或者一列时,我们称其为列矩阵(列向量)或者行矩阵(行向量)。
- 方矩阵:行数和列数相等的方型矩阵。
- 单位矩阵:首先它是一个方型矩阵,当它对角线上的值都是1,而其他元素均是0时。我们称之为单位矩阵。、
- 逆矩阵:首先它必须是一个方型矩阵,它是将此矩阵中的所有元素行列下标进行转换得到的矩阵。
- 转置矩阵:我们将一个矩阵的行列进行互换则得到一个它的逆置矩阵,它不要求是方矩阵。
- 矩阵乘法运算
我们3D绘图全靠这个了,注意咯
我们计算A矩阵*B矩阵时,要求A矩阵行数必须和B矩阵列数相等。乘法公式我第9章有说。
当任何矩阵,乘以一个单位矩阵时,其值不发生任何改变。
当一个矩阵乘以它的逆矩阵时,其值必为一个单位矩阵。
- D3D中矩阵乘法运算
我们在D3D程序中,通常是使用4*4的矩阵以及1*4的列向量。对于他们的乘法,我这里更详细的说明一下
- 当一个1X4的列向量和一个4X4的矩阵相乘时,其结果是一个1X4的列向量
- 当一个4X4的矩阵和一个1X4的列向量相乘时,无法进行运算,因为它不符合矩阵乘法运算的要求。
- 当一个4X4的矩阵A和一个4X4的矩阵B相乘时,将得到一个新的4X4的矩阵。但值得注意的是A*B不等于B*A,因为矩阵的乘法不符合乘法交换率。
(三)D3D中为什么要使用4*4的变换矩阵
在D3D中,我们通常使用4*4的矩阵来进行矩阵的世界转换,因为我们无论是1*4的向量还是4*4的矩阵,在乘以4*4的矩阵后,其结构都不会变化,仅仅是改变了其中的值。
我们可以试图理解我们为什么要使用4*4的矩阵。粗看起来,似乎3*3的矩阵更适合用在3D中,因为我们的三维坐标系需要的就是三个参数,但我们在很多的变换,如位移,计算投影,反射时都需要一个额外的参数来参与运算,所以我们必须使用4*4的矩阵来进行变换控制。
(四)平面
我们假如有一个向量,又有空间中的一个点,我们能够获得空间内的一个平面,这是有且仅有唯一的。
假如我们由n向量和p点确定了一个平面,那么n是垂直于这个平面的,也就垂直于平面上任何一条线。此时假如我们在平面上还有一个点为q,那么p与q的连线必定在平面上,也必定与n垂直。用公式表示则是n*q+p=0
由上式可以推导出,假如n*q+p<0,那么q点就不再位于平面上,而是平面的前方,是平面的正方向中 相反,若n*q+p>0,则q是在平面的后方,在平面的负方向中。
我们通常通过这个来控制游戏中的碰撞检测,假如判断一个子弹和一个物体是否进行了碰撞,我们可以判断这个值与0的关系。