《DirectX游戏编程第一章.ppt》由会员分享,可在线阅读,更多相关《DirectX游戏编程第一章.ppt(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2第1章 基本的数学概念 主要目标:向量几何和向量代数的基本知识以及它们在三维计算机图形学中的应用。矩阵和矩阵运算以及如何利用矩阵进行三维几何变换。如何建立点线代数模型以及如何在三维图形设计中使用它们。熟悉D3DX中提供的数学类和函数,并用它们来完成三维数学运算。31.1 三维空间中的向量使用使用带箭箭头的直的直线段来表示向量,如段来表示向量,如图1.1所示。所示。用于描述向量的两个属性是用于描述向量的两个属性是长度度(也称也称为数量或数量或者者标量量)和方向。和方向。在在图1.2中描述了一个左手坐中描述了一个左手坐标系和一个右手坐系和一个右手坐标系。系。41.1 三维空间中的向量图1.3显示
2、的是将示的是将图1.1中的向中的向量移量移动到到标准位置的准位置的结果,在果,在标准位置下指定坐准位置下指定坐标系中的向系中的向量,量,这时候注意向量候注意向量u和和v重合重合在一起,只是因在一起,只是因为这两个向量两个向量相等。相等。在三在三维向量中有向量中有4个特殊的向个特殊的向量量(如如图1.4所示所示)。在在D3DX库中,可以使用中,可以使用D3DXVECTOR3类来代表三来代表三维向量,在向量,在D3DX中中该类的定的定义如下:如下:参见教材P5 51.1.1 向量的相等几何上,如果两个向量方向和几何上,如果两个向量方向和长度都相同,那度都相同,那么么这两个向量就相等。在代数上,我两
3、个向量就相等。在代数上,我们说如果如果它它们拥有相同的有相同的维数并且它数并且它们拥有相等的分量,有相等的分量,那么它那么它们相等。相等。在代在代码中,可以通中,可以通过重重载“=”运算符来运算符来检测两两个向量是否相等:个向量是否相等:D3DXVECTOR u(1.0f,0.0f,1.0f);D3DXVECTOR v(0.0f,1.0f,0.0f);if(u=v)return true;61.1.2 向量模的计算几何上,向量的模就是一个有向几何上,向量的模就是一个有向线段的段的长度。如果知度。如果知道了向量的所有属性,就可以通道了向量的所有属性,就可以通过如下的方法来如下的方法来进行行向量模
4、的向量模的计算:算:在在D3DX库中,可以使用如下函数中,可以使用如下函数计算向量的模:算向量的模:FLOAT D3DXVec3Length(/返回值为向量的模 CONST D3DXVECTOR3*pV /所要计算的D3DXVECTOR3类型的向量 );D3DXVECTOR3 v(1.0f,2.0f,3.0f);float magnitude=D3DXVec3Length(&v);/计算向量的模71.1.3 向量归一化单位向量指模位向量指模为1的向量,的向量,归一化向量就是指将一般向量就是指将一般向量向量转换为单位向量。可以通位向量。可以通过将向量的所有分量除将向量的所有分量除以向量的模来得到
5、以向量的模来得到单位向量,如下所示:位向量,如下所示:通通过D3DX库,可以使用如下函数,可以使用如下函数进行向量的行向量的归一化:一化:D3DXVECTOR3*D3DXVec3Normalize(D3DXVECTOR3*pOut,/Result CONST D3DXVECTOR3*pV/The vector to normalize );81.1.4 向量加法可以通可以通过将两个向量的分量分将两个向量的分量分别相加来相加来进行向量加法的行向量加法的计算。算。图1.5是向量加法的几何表示。是向量加法的几何表示。在程序中在程序中进行加法运算行加法运算时,可以,可以进行行“+”运算符的重运算符的重
6、载:D3DXVECTOR3 u(2.0f,0.0f,1.0f);D3DXVECTOR3 v(0.0f,-1.0f,5.0f);/(2.0+0.0,0.0+(-1.0),1.0+5.0)D3DXVECTOR3 sum=u+v;/=(2.0f,-1.0f,6.0f)91.1.5 向量减法与加法与加法类似,向量的减法也是通似,向量的减法也是通过对向量的所有分量向量的所有分量进行减法运算。行减法运算。如如图1.6所示所示为向量减法的几何表示。向量减法的几何表示。同同样在在D3D中通中通过重重载“-”运算符运算符进行向量减法:行向量减法:D3DXVECTOR3 u(2.0f,0.0f,1.0f);D3D
7、XVECTOR3 v(0.0f,-1.0f,5.0f);D3DXVECTOR3 difference=u-v;/=(2.0f,1.0f,-4.0f)101.1.6 数乘可以将向量和一个可以将向量和一个标量相乘,就像名字所量相乘,就像名字所说明明的那的那样,使向量的数量大小,使向量的数量大小发生改生改变。这个运个运算得到的向量将不会改算得到的向量将不会改变向量的方向,除非是向量的方向,除非是与一个与一个负标量相乘,那么就会使原向量的方向量相乘,那么就会使原向量的方向翻翻转:ku=(kux,kuy,kuz)在在D3DXVECTOR3类中提供了中提供了“*”运算符:运算符:D3DXVECTOR3 u
8、(1.0f,1.0f,-1.0f);D3DXVECTOR3 scaledVec=u*10.0f;/=(10.0f,10.0f,-10.0f)111.1.7 点乘点乘是向量在代数学上定点乘是向量在代数学上定义的两种算法之一,的两种算法之一,它通它通过如下的方法如下的方法计算:算:点乘运算的主要属性如下:点乘运算的主要属性如下:如果=0,那么向量之间的夹角等于0度。如果0,那么向量之间的夹角小于90度。如果0,则点p在平面上的外侧。如果np+d0,则点p在平面上的内侧。D3DX中的如下函数等价于中的如下函数等价于np+d,用于求,用于求出一个指定的平面和点之出一个指定的平面和点之间的距离:的距离:
9、参见教材P27361.3.3 构建平面371.3.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);381.3.4 标准化一个平面可以使用如下的公式来可以使
10、用如下的公式来标准化平面准化平面(n,d):在在D3DX中可以使用如下的函数来中可以使用如下的函数来标准化一个准化一个平面的法平面的法线向量:向量:D3DXPLANE*D3DXPlaneNormalize(D3DXPLANE*pOut,/Resulting normalized plane CONST D3DXPLANE*pP/Input plane);391.3.5 对平面进行变换操作把它看成一个四把它看成一个四维向量,用所需要的向量,用所需要的变换矩矩阵的逆的逆转置矩置矩阵来来对它它进行操作。注意,行操作。注意,这个平面的法个平面的法线要先被要先被标准化。准化。使用下面的函数:使用下面的函
11、数:D3DXPLANE*D3DXPlaneTransform(D3DXPLANE*pOut,/Result CONST D3DXPLANE*pP,/Input plane CONST D3DXMATRIX*pM/Transformation matrix);401.3.5 对平面进行变换操作实例代例代码如下:如下:D3DXMATRIX T(.);/Init.T to a desired transformationD3DXMATRIX inverseOfT;D3DXMATRIX inverseTransposeOfT;D3DXMatrixInverse(&inverseOfT,0,&T);D3
12、DXMatrixTranspose(&inverseTransposeOfT,&inverseOfT);D3DXPLANE p(.);/Init.Plane.D3DXPlaneNormalize(&p,&p);/make sure normal is normalizedD3DXPlaneTransform(&p,&p,&inverseTransposeOfT);411.3.6 求到一个指定点距离最短的平面上的点假假设在空在空间中有一个点中有一个点p并并且希望找出在平面且希望找出在平面(n,d)上上的一个离的一个离p点最近的点点最近的点q。图1.13 k是p到平面上最短的距离在平面在平面(n,
13、p)上距离点上距离点p最最近的是点近的是点q。可以。可以发现点点p到平面的距离是正的,但到平面的距离是正的,但是如果点是如果点p在平面的另一面,在平面的另一面,那么那么p将会是将会是负的。的。421.4 射 线设想在游想在游戏中一个玩家正在向一个中一个玩家正在向一个敌人开火,人开火,通通过什么方法来判断从一个指定的位置和方向什么方法来判断从一个指定的位置和方向射出后的子射出后的子弹是否能是否能击中目中目标呢?呢?一个解决方案就是使用一个射线对子弹建模,并对敌人建立一个包围盒,它和一个物体紧密地绑定在一起,因此近似为它的体积。包围盒将在第11章中重点讲述,然后通过数学计算,我们可以判断射线是否击
14、中了包围盒并且能知道击中了哪个地方,在这一节中,我们学习怎样在数学上对一条射线建模。431.4.1 射线的表达式一条射一条射线可以通可以通过一个原一个原点点p0和一个方向和一个方向u进行描述行描述(见图1.14),我,我们可以通可以通过增加参量增加参量t或者或者设置置为0来生来生成一条射成一条射线上的点,一个上的点,一个射射线的表达式是:的表达式是:441.4.2 射线与平面的相交如果如果给定一条射定一条射线p(t)=p0+tu和一个平面和一个平面np+d=0,想知道射,想知道射线是否和平面相交,如是否和平面相交,如果相交的果相交的话,两者相交于哪一点。要达到,两者相交于哪一点。要达到这些些目
15、的,可以将射目的,可以将射线方程代入到平面方程中来求方程代入到平面方程中来求参数参数t,如果存在,如果存在满足方程式要求的参数足方程式要求的参数t,那,那么将可以得出么将可以得出处于平面上的点。于平面上的点。451.5 小 结在物理学中,向量在物理学中,向量还被用于被用于处理数量和方向相关的数理数量和方向相关的数学学问题。可以使用可以使用44的矩的矩阵来描述来描述变换,使用,使用14的的齐次向量次向量来描述点和向量。来描述点和向量。可以使用四可以使用四维齐次向量来描述向量和点,通次向量来描述向量和点,通过设置置w分量分量为0来描述一个向量,并且通来描述一个向量,并且通过设置置w为1来描述来描述一个点。一个点。平面可以将一个三平面可以将一个三维的空的空间分割分割为两个部分。两个部分。可以用一个原点和一个方向向量来定可以用一个原点和一个方向向量来定义一条射一条射线。射。射线在建立不同的物理模型在建立不同的物理模型时很有用,例如光很有用,例如光线和投影和投影射射线,它,它们都是沿着一条直都是沿着一条直线延伸的,就像火箭和子延伸的,就像火箭和子弹一一样。