1、Part I 必备的数学知识1本部分学习目标 了解线性代数学在3D图形学中的应用 熟悉D3DX中提供的数学类数学类和函数函数,并用它们来完成3D数学运算 2Direct3D中要用到的数学知识 向量vector 矩阵matrix 矩阵变换matrix transformation 平面plane 射线ray前三个方面三个方面是最重要,最基本的33D空间中的向量 在几何几何学学上,使用一条带箭头的带箭头的直线段直线段来表示向量 注意:注意:区分向量的头部和尾部back4向量的属性有两个属性属性:1 长度长度(数量,大小)2 方向方向3D图形学中经常用向量向量来表示方向表示方向(如水的流向,光线方向
2、等)5向量相等“位置位置”并不是向量的属性向量相等向量相等的条件:长度相等,且方向相同见图中的u,v注意:向量的描述是独立于坐标系独立于坐标系的(因为没有位置属性)6左手左手坐标系与右手右手坐标系 Direct3D用的是左手左手坐标系,OpenGL用的是右手右手坐标系 7左手左手坐标系与右手右手坐标系用除了大拇指之外的四个指头从+X轴轴绕向+Y轴轴,大拇指的指向大拇指的指向就是+Z轴的方向8处于标准位置的向量在某个特定特定的坐标系中,移动向量移动向量,使向量的尾部位于尾部位于坐标系的原点原点,这时,向量处于标准位置标准位置注意:注意:平移向量并不会改平移向量并不会改变向量变向量,因为向量没有位
3、置属性见图中u,v9标准向量的表示方法在指定的坐标系中,可以用标准向量头部标准向量头部所在点的位置所在点的位置来表示向量 不要将点点和向量等同向量等同起来 前者只有位置只有位置属性,后者没有位置属性后者没有位置属性,只有大小和方向10向量的表示方法用大写或小写 粗体字表示向量2D向量:u=(ux,uy)3D向量:N=(Nx,Ny,Nz)4D向量:c=(cx,cy,cz,cw)113D向量中的特殊向量 零向量零向量:0=(0,0,0)所有分量为0 三个基本向量基本向量:i,j,ki=(1,0,0)j=(0,1,0)k=(0,0,1)分别沿着坐标系中x轴、y轴和z轴伸展 注意注意:长度为1的向量称
4、为单位向量单位向量12特殊向量的示意图从图中可见,零向零向量不表示任何方向量不表示任何方向,或者说可表示任何可表示任何方向方向13D3DX中的vectorD3DXVECTOR3 表示3D向量具体定义见SDK从D3DVECTOR结构继承具有x y z三个数据成员加上一些对向量的操作操作,如+-*/14除了3D向量还有 D3DXVECTOR2表示2D向量 D3DXVECTOR4表示4D向量分量个数不同,操作基本相同,除了3D向量所特有的叉乘运算叉乘运算注意:向量的运算大部分可以推广推广到多维向量多维向量15向量的相等性判断(Equality)几何几何判断:长度,方向均相同 代数代数判断:维数维数相
5、同,相对应的分量分量相等16判断相等性的代码D3DXVECTOR u(1.0f,0.0f,1.0f);D3DXVECTOR v(0.0f,1.0f,0.0f);if(u=v)return true;类似的,也有不相等的判断if(u!=v)return true;重载了重载了=和和!=运算符运算符17注意:浮点数的判断不精确因为计算机中浮点数的精度限制精度限制,所以进行浮点数的判断只能是判断是否为近似相近似相等等,在代码中应定义一个误差值误差值代码:const float EPSILON=0.001f;bool Equals(float lhs,float rhs)return fabs(lhs
6、-rhs)0,那么两个向量之间的夹角小于小于90度度如果S 0点p在平面外侧外侧 n p+d 0点p在平面内侧内侧 56D3DX中的点面距离求法FLOAT D3DXPlaneDotCoord(CONST D3DXPLANE*pP,CONST D3DXVECTOR3*pV);判断返回的结果值判断返回的结果值57在D3DX中构建平面由前面可知,知道了法线向量法线向量n和原点到平面的距离d,就可以唯一地确定一个平面D3DXPLANE*D3DXPlaneFromPointNormal(D3DXPLANE*pOut,CONST D3DXVECTOR3*pPoint,CONST D3DXVECTOR3*p
7、Normal);58第二种方法由共面的三个点共面的三个点求出平面给出了3个点p0、p1和p2,可以得到两个向量:通过计算u和v进行叉乘的结果就可以得到平面的法线向量法线向量n,记住用左手法则:然后可以得到d(由d=-n p0)59D3DX中的解法D3DXPLANE*D3DXPlaneFromPoints(D3DXPLANE*pOut,CONST D3DXVECTOR3*pV1,CONST D3DXVECTOR3*pV2,CONST D3DXVECTOR3*pV3);60标准化平面标准化平面指的是对平面的法线对平面的法线进行标准化标准化但不仅仅是标准化法线向量这么简单但不仅仅是标准化法线向量这么
8、简单61因为d=np0,法线向量的改变会影响到常量d,进而改变整个平面所以,要对对d进行处理进行处理所以,标准化后的平面为62D3DX中的标准化平面D3DXPLANE*D3DXPlaneNormalize(D3DXPLANE*pOut,CONST D3DXPLANE*pP);63对平面进行变换操作对平面进行变换操作 把它看成一个4D向量向量,用我们所需要的变换矩阵的逆转置逆转置矩阵来对它进行操作。注意,这个平面的法线平面的法线要先被标准化标准化。步骤:1M Mi Mit2标准化平面3用Mit对平面进行变换操作4M:原变换矩阵原变换矩阵 Mi:M的逆的逆 Mit:Mi的转置的转置64D3DX中的
9、变换函数D3DXPLANE*D3DXPlaneTransform(D3DXPLANE*pOut,CONST D3DXPLANE*pP,.CONST D3DXMATRIX*pM);65代码片段D3DXMATRIX T(.);/T是原变换矩阵D3DXMATRIX inverseOfT;D3DXMATRIX inverseTransposeOfT;D3DXMatrixInverse(&inverseOfT,0,&T);D3DXMatrixTranspose(&inverseTransposeOfT,&inverseOfT);D3DXPLANE p(.);/初始化平面D3DXPlaneNormaliz
10、e(&p,&p);/标准化平面/用转换后的矩阵进行变换D3DXPlaneTransform(&p,&p,&inverseTransposeOfT);66求到一个指定点距离最短的平面上求到一个指定点距离最短的平面上的点的点 p是平面外一点n是单位向量要求q67根据公式来求qk为p到平面的最短距离最短距离,可由公式n p+d 求得公式的意义意义:p点沿法线的反方向移动k,就能到达q一般一个标量乘以一个向量能表示沿向量方向的移动68射线 射线多应用于碰撞检测碰撞检测及拣取拣取CS等射击游戏中的子弹子弹也是由由射线射线这种数学模型来描述描述的69射线的数学描述射线可以通过一个点一个点和一个方向一个方向
11、进行描述,射线的参数方程是:P0是原点原点,u是方向方向,t是参数参数。当设置t为不同的值不同的值时,可以计算出射线上不同射线上不同的点点,参数t的范围0,)在之间。超出这个范围的情况呢?70射线与平面的相交射线与平面的相交 如果给定一条射线p(t)=p0+tu和一个平面np+d=0,我们想知道射线是否和平面相交,如果相交相交的话,两者相交于哪一点?解法:将射线方程代入代入到平面方程中来求参数t,再判断判断 t 所在的范围范围71详细的公式推导72判断t的范围如果t不在不在0,)之间,那么射线将不会不会和平面相交相交如果t在在0,)之间之间,那么射线与平面相交射线与平面相交交点将可以通过将参数代入射线参数方程中来得出 73本部分的总结 向量向量的属性属性标准向量标准向量标准向量标准向量在坐标系中的表示方法表示方法74 矩阵用44矩阵表示一个变换 用14行矩阵行矩阵表示点点或向量向量一个14行向量行向量和一个一个44变换矩阵矩阵的乘积的结结果果是一个新的14向量向量行矩阵中w值的意义:0表示方向,1表示点75 平面一个平面用于分割分割空间可用于判断点与平面的关系(把点代入平面方程)76 射线 可以用一个原点一个原点和一个方向向量一个方向向量来定义定义一条射线射线。射线用于表示游戏中的物理模型,如光线,子弹射线子弹射线77 Part I FINISH 谢谢,再见谢谢,再见78