《《游戏编程数学与物理基础》学习笔记.pdf》由会员分享,可在线阅读,更多相关《《游戏编程数学与物理基础》学习笔记.pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、点和直线点和直线 点的表示:在 2D 平面上用一个 2 元组表示(x,y)在 3D 位置上用一个 3 元组表示(x,y,z)记得要统一 x,y,z 轴的起点和方向。直线的属性:斜率 斜率 slope=1212xxyyxy=性质 斜率相等的两条直线平行 斜率为负值,表示直线沿左上角到右下角延伸 斜率为正值,表示直线沿左下角到右上角延伸 斜率为 0,直线为水平线,和 x 轴平行 分母为 0,表示直线为垂直型,和 y 轴平行 相互垂直的直线斜率的积为-1 直线的标准表示是 Ax+By=C,斜率为 m=-A/B 斜截式是 y=mx+b,斜率为 m 点斜式是(y y1)=m(x x1),斜率为 m 对于
2、同一平面上的两条直线组成的线性方程组,其解的情况如下:如果两直线的斜率不相等,则有一组解,该解为两直线交点;如果两直线的斜率以及在 y轴上的截距相等,则有无穷组解,即两直线重叠;如果两直线的斜率以及在 y轴上的截距不相等,则无解,即两直线平行。相关几何知识相关几何知识 1 两点间的距离两点间的距离 在人工智能程序中,智能体可以通过判断敌人与自己的距离来决定发动攻击的时机。2D 场景中的距离公式:设点 P1(x1,y1)和 P2(x2,y2)分别为线上的点,他们的距离 d 的计算方法如下:212212)y -(y )x-(x+=d 3D 场景中的距离公式:212212212)()()(zzyyx
3、xd+=2 两点的中点坐标两点的中点坐标 设有点 P1(x1,y1)和 P2(x2,y2),两点的中点 P3的坐标是:)2,2(21213yyxxp+=3 抛物线抛物线 抛物线总是轴对称的。有两个因素决定了抛物线的形状,第一是顶点,是抛物线的与对称轴的交点;第二个是对称轴。抛物线有 2 种形状,一种是对称轴垂直,一种是对称轴水平。对称轴垂直的抛物线方程:y=a(x-h)2+k 顶点是(h,k),对称轴为 x=h 对称轴水平的抛物线方程:x=a(y k)2+h 顶点是(h,k),对称轴为 y=k 常数 a 代表了抛物线的开口方向和开口大小。如果 a 是正数,对于 y=a(x-h)2+k 的抛物线
4、来说开口向上,对于 x=a(y k)2+h 的抛物线来说开口向右。如果 a 是负数,对于 y=a(x-h)2+k 的抛物线来说开口向下,对于 x=a(y k)2+h 的抛物线来说开口向左。a 的绝对值越大,开口越小。4 圆和球圆和球 圆是所有到定点长度等于定长的点的集合,这个定长称为半径,定点称为圆心。圆的方程:(x-h)2+(y-k)2=r2 圆心是(h,k),半径是 r 球是一个圆绕着圆心旋转所得到的。球体的方程:(x-h)2+(y-k)2+(z-l)2=r2 圆心是(h,k,l),半径是 r 使用方程时应注意圆心坐标的正负号。5 在碰撞检测中的应用在碰撞检测中的应用 可以在游戏中利用圆或
5、球的边界进行碰撞检测。当然也可以利用其他图形。不过圆和球都可以方便地进行数学计算,它们在检测的速度上也优于其他图形。虽然精确度不高,但是可以作为外围检测。两圆之间,如果两圆心的距离小于两圆的半径和,即发生碰撞。设两圆方程分别为:(x h1)2+(y k1)2=r12和(x h2)2+(y k2)2=r22。如果:)()()(21212212rrkkhh+,则两圆发生碰撞。由于开方运算会占用大量的处理器资源,所以建议使用平方进行比较。利用圆边界进行碰撞检测是一种较快的方法,但是极有可能会产生错误的碰撞检测结果,所以避免错误的方法是寻找一种更适合的图形来检测。只要这个图形可以用数学公式表示出来。也
6、可以使用多重圆形进行多重检测,先检测外面的圆,如果发生碰撞则检测内部的圆,减小错误判断的几率。但多重检测会消耗更多的 CPU 时间。三角函数三角函数 1 角度和弧度角度和弧度 每个角都由相交于一点的两条射线组成,我们把其中一条射线称为始边,另一条称为终边。而角的始边总是沿着 x 轴的正方向。从 x 轴正方向开始,沿逆时针方向进行旋转的角称为正角,沿顺时针方向旋转的角称为负角,注意该旋转也将决定了终边的位置。一个周角是 360。,也可以表示成R2。这是角度和弧度之间进行转换的基础。角度转换成弧度公式:角度 180R=弧度 注意:R 只是个单位符号 对于 C+中所有的三角函数,比如 sin()、c
7、os()、tan()等它们都是以弧度值作为输入的;因此在处理角度的时候,我们可以在函数开头用#define定义一个宏,完成弧度和角度的互换。#define RadToDeg 57.29577951f#define DegToRad 0.017453293f 只需把角度DegToRad即可得到相应的弧度,或弧度RadToDeg即可得到相应角度。弧度转换成角度公式:弧度 R180=角度 2 三角函数三角函数 所有的三角函数都是直角三角形中定义的。abcacb=tancossin正切:余弦:正弦:baacbc=tan1cotcos1secsin1csc余切:余割:正割:常用角度的三角函数值 (角度)
8、(弧度)sin cos tan 0 0 0 1 0 30/6 0.5 2/3=0.866 3/3=0.5774 45/4 2/2=0.7071 2/2=0.7071 1 60/3 2/3=0.866 0.5 3 90/2 1 0 不可算 120 2/3 2/3=0.866-0.5-3 c a b 180 0-1 0 270 3/2-1 0 不可算 360 0 0 1 0 在真正进入游戏主循环之前,可以建立一个三角函数的查找表,这样在游戏中需要用到三角函数值的时候就不用重新计算,只需进行查表工作就可以,大大加快运行速度。插入代码 角的正弦值在第一、第二象限是正值;角的余弦值在第一、第四象限是正值
9、;角的正切值在第一、第三象限是正值;对于所有的反三角函数,如果传入的参数是正值,那么它们的返回值都是正,即意味着该角位于第一象限;如果传入的参数为负数,那么反正弦 asin()和反正切 atan()的返回角度将位于第四象限,而反余弦 acos()的返回角度位于第二象限。3 正弦函数的图像正弦函数的图像 对于正弦函数:CxB360A,)sin(轴,偏移,周期是振幅是+=CBxAy A 越大,振幅越高 B 越大,周期越小 4 三角函数的性质三角函数的性质 单位圆性质:1sincos22=+正切和余切性质:sincoscotcossintan=正弦函数的和与差:sincoscossin)sin(si
10、ncoscossin)sin(=+=+余弦函数的和与差:sinsincoscos)cos(sinsincoscos)cos(+=+间接关系:cos)180cos(sin)90cos(sin)180sin(cos)90sin(=+=+向量运算向量运算 一、向量和标量一、向量和标量 当在游戏中使用一个量的时候,一定要区分它是标量还是向量,它们两者最大的差别就是是否具有方向。二、极坐标和笛卡儿坐标二、极坐标和笛卡儿坐标 1 极坐标 向量|A|A=,其中|A|是向量 A 的模,是方向角。2 笛卡儿坐标(分量)向量jbibB)21+=,其中 i 和 j 是 x 和 y方向上的单位向量。3 坐标转换(1)
11、极坐标转换成笛卡儿坐标 对于向量|A|A=,jaiaA)21+=,其中cos1Aa=,sin2Aa=。(2)笛卡儿坐标转换成极坐标 对于向量jbibB)21+=,2221)()(bbB+=,其中)(tan121bb=三、向量的加法和减法三、向量的加法和减法 1 向量相加 向量 A 和向量 B 相加等于 A 的头连接 B 的尾,然后从 A 的尾构造向量 C 连接到 B 的头,方向为从 A 到 B。精确相加:jbaibaBA)()(2211+=+,其中jaiaA)21+=,jbibB)21+=。2 向量相减 向量相减等于加上第二个向量的负向量。四、标量和向量相乘四、标量和向量相乘 1 标量和极坐标
12、向量相乘 对于采用极坐标形式的向量,它只包含两个部分模和方向,当用向量与之相乘时,只需把标量和模相乘即可,方向不用改变。|A|cAc=,其中 c 是标量。2 标量和笛卡儿坐标向量相乘 对于采用笛卡儿坐标形式的向量,那么只需将标量乘以每个分量即可。jcaicacA)21+=,其中 c 是标量。五、向量的单位化五、向量的单位化 单位化就是将向量的模缩放到 1 的过程。对于极坐标形式的向量,单位化只需将其模改成 1,而方向保持不变即可。对于笛卡儿坐标形式的向量,首先计算向量的模,然后将每个分量除以该数值即可。如下:2D 向量的单位化,对于向量 A=a1 a2,单位化的结果是:=AaAaAAA211)
13、六、点乘六、点乘 两个向量的点乘结果是一个标量。向量的点乘也叫做向量的数量积,这是因为向量的点乘运算返回的是一个数值。2D 向量的点乘运算:AB=a1b1+a2b2 其中,向量 A=a1 a2,向量 B=b1 b2 由上述公式可知,向量的点乘运算就是将对应的 x 分量相乘,然后加上对应的 y 分量的乘积。点乘可以获得两向量之间角度的信息。如果 AB 90;如果 AB=0,那么=90;如果 AB 0,那么 0 说明夹角小于 90。因此该物体可视。两向量之间的夹角:cosBABA=向量的点乘同时可以表示一个向量在另一个向量方向上的投影长度。七、叉乘七、叉乘 叉乘只适用于 3D 向量,返回的是一个向
14、量,因此又称为向量积。)()()(122131132332babababababaBA=叉乘得到的结果向量分别垂直于两个原始向量,也正是这个原因,它仅适用于 3D 向量。3D 向量间的夹角;sinBABA=矩阵运算矩阵运算 一、矩阵的定义一、矩阵的定义 1 矩阵的维数 设矩阵有 n 行 m 列,那么矩阵的维数是 nm。2 相等矩阵 对于两个具有相同维数的矩阵,我们把同行同列的两个元素称为对应元素。两矩阵相等的充要条件是:它们具有相同的维数,并且所有的对应元素都相同。nm 维和 mn 维不相同。二、矩阵的加减运算二、矩阵的加减运算 矩阵的加减运算要求两个矩阵具有相同的维数,因此只需在对应元素上进
15、行加减运算即可。三、矩阵与标量相乘三、矩阵与标量相乘 矩阵与标量相乘,等于标量乘以矩阵中的每个元素。=nncacacacacA100100,其中 c 是任意常量值,A 是任意大小的矩阵。=nncacacacacA100100 四、矩阵相乘四、矩阵相乘 矩阵相乘要有意义,必须满足 A 的列数等于 B 的行数。如果矩阵相乘有意义,那么 AB 的行数等于 A 的行数,列数等于 B 的列数。记法:A 每行的每个元素乘以 B 每列的对应元素的结果的和,结果放在 A 元素对应的位置。+=)()()()(11110110101100101101100010010000babababababababaAB 其
16、中,=11100100aaaaA,=11100100bbbbB。矩阵相乘不满足交换律,即 ABBA 五、矩阵转置五、矩阵转置 对于任意大小的矩阵 A 的转置矩阵表示为 AT。对于任意大小的矩阵,元素 amn在矩阵 AT中变为 anm 变换变换 矩阵在游戏编程中的具体应用:仿射变换。变换是指在空间中能让物体发生运动的操作的总称,包括前后、上下、左右移动,缩小放大、旋转等。仿射是指物体在变换之后应该保持先前的形状。一、平移一、平移 物体的平移运动既可以由矩阵的加法来完成,也可以利用矩阵的乘法来实现。如果对物体进行的仅是平移变换,那么采用矩阵加法效率更高。如果还要对物体进行缩放和旋转变换,那么应该用
17、矩阵乘法来实现。当对矩阵进行加法运算时仅仅是将对应元素相加,因此参加运算的两个矩阵的结构必须相同。利用矩阵加法实现 2D 平移:+=dydxyxyx 利用矩阵加法实现 3D 平移:+=dzdydxzyxzyx 利用矩阵乘法实现 2D 平移:=110010011yxdydxyx 注意乘法不满足交换律!利用矩阵乘法实现 3D 平移:=110001000100011zyxdzdydxzyx 注意乘法不满足交换律!二、缩放二、缩放 我们可以使用矩阵乘法对一个物体进行缩放。如果对物体的所有顶点进行了缩放,那么变换的结果便是缩放了整个物体。2D 缩放变换=110000001yxSySxyx 其中,Sx 为
18、 x 方向上的缩放因子,Sy是 y 方向上的缩放因子。如果要进行均匀缩放的话,即保持物体原先的形状,那么就要保证 Sx=Sy。当为缩放因子 Sx、Sy 赋值时,如果取值位于 0 和 1 之间,那么变换的结果将缩小物体;反之,如果大于 1,那么变换将扩大物体。如果缩放因子为负值时,那么变换会使物体产生镜像效果。3D 缩放变换=110000000000001zyxSzSySxzyx 三、旋转三、旋转 利用矩阵相乘可以对一个物体进行旋转变换。2D 旋转变换:=11000cossin0sincos1yxyx 正的旋转角度意味着沿逆时针方向进行旋转,而负的旋转角度意味着沿顺时针方向进行旋转。3D 空间中
19、的旋转问题涉及到三个平面,分别是 xy、xz、yz。其中,xy平面就是计算机屏幕所在的 2D 平面。因此,在 3D 空间的旋转就有 3 种情况,绕 x 轴、绕 y 轴、绕 z 轴。(1)绕 z 轴 3D 旋转=11000010000cossin00sincos1zyxzyx Z 轴的正方向由屏幕指向外面,因此绕 z 轴选择其实就是在屏幕空间旋转,和 2D 旋转一样。Z 轴旋转经常用来模拟飞机的横向滚动。(2)绕 x 轴 3D 旋转=110000cossin00sincos000011zyxzyx 在模拟飞行领域中,绕 x 轴选择可以看作是飞机的前倾和后仰。绕 x 轴旋转时,x 坐标值是不会改变
20、的。(3)绕 y轴旋转=110000cos0sin00100sin0cos1zyxzyx 在模拟飞行中,y轴旋转可以看做是左右偏航。四、组合变换四、组合变换 上述 3 节说提到的变换可以整合到一起,这样可以使程序在执行时更加快速,当然,这会增加编程时的难度。比如要对一个三角形(中心)以中心旋转左转 90,那么一共需要执行如下几步:将三角形的中心移动到原点,即 x 轴左移 75 个单位,y 轴移动 93 个单位。对三角形进行旋转。将中心点移回处。那么变换如下:=1100180116810110093107501100090cos90sin090sin90cos100931075011yxyxyx
21、 对于 2D 或 3D 的变换,都可以参照上述形式进行矩阵相乘。一维空间运动一维空间运动 一、速度和速率一、速度和速率 物体只要移动就会有速率,速率是用来表示物体运动的快慢。相应的,如果一个物体有速率,那么它就会有速度,速度是速率的向量形式。即速度是有方向的速率。匀速运动的公式:位移=速度 时间(D=v*t)路程=速率 时间(S=v*t)平均速度:表示时间间隔表示位移,t,xtxxtxvif=二、加速度二、加速度 加速度用来衡量速率的变化快慢程度。ififttvvtva=vf表示末速度,vi表示初速度。tf表示末速度对应的时间,vi表示初速度对应的时间。如果 a 的方向和 v 一致,那么表示加
22、速运动,如果相反,表示减速运动。三、运动方程三、运动方程 xavvattvxtvvxvvvavvifififitif+=+=+=+=+=25214)(213221222:运动方程:运动方程:运动方程:运动方程:运动方程 二维和三维空间运动二维和三维空间运动 一、使用向量一、使用向量 二维和三维空间与一维空间的运动最大区别在于它们还有其他方向。在一维空间里,我们使用正负号来表示位移、速度和加速度这些向量。但要在二维和三维空间中,就必须结合向量来描述运动。在二维空间中,我们利用末位置减去初位置来表示位移。2D 和 3D 的平均速度 为时间段。表示位移向量,其中trtrrtrvif=2D 和 3D
23、中的移动方程 221)(21attvrtvvratvviifif+=+=+=这些方程对于任意矢量 a,vf,vi和r 以及标量时间都适用。在计算时,记得要将极坐标表示的向量使用直角坐标系表示。二、抛物运动二、抛物运动 二维空间计算抛物线的方法是将向量分解成竖直分量和水平分量,然后计算。由于分量之间是完全独立的,所以可以分别对其进行计算。如果只看竖直方向,那么速度、位移、加速度就回到了一维空间的竖直运动。位移先运动到最高点,然后下落。速度在最高点时由正值变成 0,接着下落变成负值。加速度一直都是-9.8m/s2。除非有外力施加,比如弹簧,空气阻力。如果只看水平方向,那么就是匀速直线运动,排除空气
24、阻力等其他因素。牛顿定律牛顿定律 一、力一、力 当我们准备用程序来模拟物体的运动时,首先要对我们所要移动的物体进行受力分析。物体所受力的总和决定了它的运动模式。1 重力 物体运动的竖直分量加速度为-g 或-9.8m/s2。我们可以利用重力加速度和物体的质量求出物体所受重力。重力是一个向量,方向指向地心。重力公式:w=mg 其中 m 是物体质量,g 是重力加速度。如果在游戏编程中,在不同星球之间切换,要考虑各个星球的不同重力加速度。重力的单位是牛顿,记为 N,1N=1kgm/s2。2 支持力 支持力作用在物体表面,抵消重力并保证它不向下落。支持力是正交的,总是垂直于物体表面。对于斜面上的物体,支
25、持力减小了物体竖直方向的加速度。3 摩擦力 摩擦力分为两种形式,静摩擦力和滑动摩擦力。静摩擦力可以使物体保持稳定的状态,而滑动摩擦力则可以使物体减速。如果物体所受的其他力总和小于静摩擦力,那么物体保持静止。一旦其他的力大于静摩擦力,物体开始运动,静摩擦力就变成滑动摩擦力。两种摩擦力都取决于它们的接触面。接触面越光滑,摩擦力越小。要计算摩擦力,就必须知道摩擦系数。静摩擦力:NFsS=其中 N 为支持力。滑动摩擦力:NFKK=其中 N 为支持力。二、牛顿定律二、牛顿定律 牛顿第一定律:当物体所受合力为 0 时,它将保持原有的运动状态不变。牛顿第二定律:Fnet=ma。F 是合力,m 是物体质量,a
26、 是物体的加速度。即,一个物体受到合力越大,速度改变得越快。如果两个物体受到的合力相同,那么质量小的物体速度改变更快。牛顿第三定律:对于每个力,都有一个与之方向相反、大小相同的反作用力。能量能量 一、功和动能一、功和动能 功等于力乘以力方向上的位移。W=Fx 其中 x 为位移,F 为位移方向上的力。功的单位是 Nm,也就是焦耳 J。动能是物体由于运动而具有的能量。物体移动得越快,动能越大。动能的定义是质量的一半乘以速率的平方。221mvKE=其中 m 为质量,v 为速率。动能是一个标量。单位也是焦耳 J。二、势能二、势能 势能包括重力势能和弹性势能。重力势能是根据物体距离地面的高度来衡量的能量
27、。GPE=mgy 其中 m 为质量,g 为重力加速度,y为高度。弹性势能是物体由于发生弹性形变而具有的能量叫做弹性势能。弹性势能的大小与物体弹性形变的大小和弹簧的劲度系数有关。221xkE=k 是劲度系数,x 是形变距离。动量和碰撞动量和碰撞 一、跟静止物体的碰撞一、跟静止物体的碰撞 和静止物体的碰撞可以用向量反射来研究物体的运动,这种运动存在着一种对称性,球射入的角度必然等于它射出的角度,即入射角等于反射角。1 向量的轴平行反射 如果边是竖直方向的,则 vf=-vix,viy;如果边是水平方向的,则 vf=vix,-viy;入射向量:vi=vix,viy。2 向量的非轴平行反射 如右图:球的
28、入射方向为 vi,求射出方向 vf 先给公式:vf=2P+vi 其中 vi是初速度,P 为-vi 基于分界线法线的发射向量。写出边界 B 的矩阵x y;求出边界的垂直向量 N=y -x;将 N 单位化得 N=y/|N|-x/|N|;求发射向量 P,P=(-viN)N 计算反射向量 vf,vf=2P+vi 二、动量和冲量二、动量和冲量 1 动量 P=mv,其中 m 是物体的质量,v 是物体的速度。如果物体的速度用矩阵表示,那么物体的动量也用矩阵表示。2 冲量 冲量=Ft=p,其中 F 是合力,t 是时间,p 是动量增量。三、碰撞建模三、碰撞建模 动量定理的变形:m1v1i+m2v2i=m1v1f+m2v2f 下标 1 表示第一个物体,下标 2 表示第二个物体。每个碰撞的情况都介于弹性碰撞和非弹性碰撞之间。弹性碰撞是一种没有动量损失的碰撞。但现实中的碰撞往往伴随着能量损失,因此可以用还原系数 来表示能量损失的大小。(v1f v2f)=-(v1i v2i)01 vf vi B N