Visual C++高级编程 第四讲 物理动作设计
物体间的移动 匀速运动:其原理是结合定时器确定贴图位置进行连续地贴图以产生运动的状态。 为了产生运动的状态,必须设置固定的X和Y方向的速度值,在这里我们用固定时间内的位移来描述速度。 在贴图的过程中需注意运动物体是否超过显示范围(本例中通过检测物理是否到达窗口边缘来设置相反的运动方向)
变速运动 变速运动的设计是在匀速运动的基础上加入了加速度的概念:V=V0+AT 相对于匀变速运动其加速度效果的加入则只需在相同时间间隔内加入固定的位移。 而变加速运动则需要在匀速运动的基础上加入一个变化的位移,该位移的具体值依据时间来计算。 物体的运动
现实中物体运动的模拟 动量:动量=质量*速度 能量守恒:两物理相撞理想状况下有 M1*V1=M2*V2 重力:受重力影响物体运动在竖直方向上迭加大小为g的匀变速运动。 摩擦力:与物体运动方向相反的力。 下落与弹跳:摩擦力(水平方向)与重力(竖直方向)共同影响物体的运动。 物体的下落与弹跳
物体间的碰撞 碰撞检测在游戏中应用比较多,比如人物走到了窗口的尽头,或者是撞到其他物体等。 碰撞检测的方法基本上有三类: 两物体范围交叉来确定碰撞; 物理颜色交叉来确定碰撞; 行进路线交叉来确定碰撞。
通过范围检测碰撞 每一物体都具有形状,对与规则物体而言具有其本身的范围(区域)。 范围交叉来确定物体是否碰撞是最简单、最快速的检测方法。 由于真实场景为三维世界(3D)在计算机中表示为2D的平面图,则存在立体维数的丢失,这样会使范围检测存在误差。其原因在于真实的碰撞应该是物体立体区域的交叉而非平面区域的交叉。 范围检测碰撞
通过颜色检测碰撞 对于非规则物体(精灵)很难准确描述其范围。 利用颜色检测碰撞的原理是首先建立待检测中某一物体的暗图(与原物体形状、大小、位置相同,但颜色为黑色),然后在运动过程中暗图区域像素点与另一物体区域像素点做AND运算,依据物体区域是否存在黑色像素点来判断是否碰撞,当然这种检测方法的前提是另一物体中不包含黑色像素点 颜色检测碰撞
通过行进路线检测碰撞 向量的概念 具有速度值的小球是否与斜面碰撞检测原理: 碰撞条件,C在P1P2上 X O Y V P1 P2 C M N P3 P4 碰撞条件,C在P1P2上 0<M=P1C/P1P2<1 0<N=P3C/P3P4<1 平行四边形 (三角形)法则: P122
与斜面碰撞后的速度 两向量夹角计算公式: a.b=|a||b|cosθ a b 反射定理 L2 L1 L P123
与斜面碰撞范例 结合具有速度值的小球与斜面碰撞的检测和斜面碰撞后速度的计算,则可以设计出斜面碰撞效果的程序。 其步骤为: 检测当前可能碰撞到的斜面(可以视小球在一个多边形中运动,多边形的每一条边为可能碰撞斜面) 根据斜面位置和小球速度计算出碰撞后速度 碰撞范例
粒子应用 “粒子”就是颗粒状的物体,如雪花、炸弹的碎片、微粒等等。 要使用粒子则必须对其进行定义:我们可以用结构体来描述粒子的属性,如当前的位置、颜色、是否存在等。当然,如果用类描述的话则可以加入面向对象概念引入粒子中,如封装、继承等。 要产生粒子的动画效果,则必须给粒子加入运动的速度,通过定时器计算不同时刻粒子的不同位置进行连续贴图。为了真实反映出粒子运动的随机性,我们一般采用随机函数rand()来设置粒子的速度(位置的改变)。 雪花纷飞
焰火的模拟 焰火的原理跟物体爆炸是一样的,每一颗爆炸后产生的岁片可视为一颗粒子。 为了更真实地描述焰火现象,则必须更准确地对焰火粒子进行定义。如粒子大小将随时间的变化不断变小并消失、粒子的运动中可能产生颜色和亮度的变化、在某一时刻里所有粒子组成某一形状的图案等等。 焰火模拟