在简单的游戏设计中,我们总会不可避免的使用到球类物体,在对两个运动小球做区域检测碰撞时,由于传统的区域检测只能检测到两个小球在相同高度上是否发生碰撞,即判断两个小球图片长度是否已经相交,若相交,则说明发生了碰撞。但是,当小球处于不同高度时,运用该方法则会产生错误。
摘 要:该文改进了传统的区域检测碰撞算法不能检测处于不同高度的运动小球是否发生碰撞的状况,通过比较两球圆心距与其半径和的大小,分析并设计实验来检测两球在不同高度上是否发生碰撞,但由于采集图片的问题以及球的半径不够精确,会出现两球并未真正发生碰撞却检测出碰撞的结果。实验最终可以检测两运动小球在不同高度上是否发生碰撞。
关键词:游戏软件论文,区域碰撞,高度
基于上诉问题,本文设计了检测不同高度的小球在发生碰撞时的算法。即通过比较两球圆心距与其半径和的大小,当圆心距小于半径和时即检测为碰撞,从而克服了区域检测碰撞中的高度限制,而且实验中实现了多次检测碰撞,即两球球心连线与水平线成不同角度时分别检测碰撞结果,使得碰撞检测更为全面。
1 数学模型
如图1、图2所示,传统的区域检测中,两个小球处于同一高度,对其检测碰撞,只需判断图片长度是否已经相交。换言之,仅仅判断左边小球图片的左上角的x坐标与左边小球的图片长度是否大于右边小球图片的左上角的x坐标即可。若大于,表示两球发生碰撞,反之未发生碰撞。
上述数学模型只能检测到水平线上发生的碰撞,为了使碰撞检测更全面,设计了以下数学模型。如图3、图4,通过比较两球的圆心距与其半径和的大小来作为其是否发生碰撞的标准,换言之,假设两球中一球圆心坐标为(x,y),另一球圆心坐标为(m,n),且其半径大小均为r,p,则当其球心距小于其半径和时,则检测为碰撞,以下为其图片及具体公式:
2 检测结果及分析
本实验刻画了两个小球,球A垂直方向做匀速运动,水平方向上以每次50单位的速度向右移动,球B沿对角线方向从左向右运动,这样保证了两球一定能够发生碰撞,一旦两球球心距小于其半径和时即检测为碰撞,当两球发生碰撞后,静止两秒,继续按照原来的运动轨迹运行,当A球超出右边边界时实验结束,这样设计是为了可以多次检测到不同方位的碰撞。如图5、图6所示,小球在运动过程中均能检测出碰撞。
为了消除随机性,图7、图8显示了两个小球在垂直方位和斜对角方位也检测到碰撞,从而证明该算法可以检测到两球在不同位置发生碰撞的过程。
以下为两球处于不同位置时发生碰撞的图片
图5 检测碰撞 图6 检测碰撞
图7 检测碰撞 图8 检测碰撞
在整个过程中,由于图片采集以及球的半径不够精确的原因,可能会出现两球并未相撞但检测为碰撞的情形,如下:
图9 发生不精确的检测
3 结束语
本文通过比较两球圆心距与其半径和的大小,分析并设计实验来检测两球在不同高度上是否发生碰撞,解决了区域检测碰撞不能实现检测运动小球在不同高度上是否发生碰撞的情况,使得检测更加灵活。
但是,该实验暂且只适合于规则形状、取得其范围大小的球类物体,但是经常会遇到不规则的图形,为了节约碰撞检测的时间,若在允许范围内仍采用区域检测碰撞。
参考文献:
[1]肖永亮.Visual C++游戏编程基础[M].北京:电子工业出版社,2005.
[2]范昭炜.实时碰撞检测技术研究[D].浙江大学,2003.
[3]肖永亮.计算机游戏程序设计[M].北京:电子工业出版社,2005.
[4]叶展,叶丁.游戏的设计与开发[M].北京:人民交通出版社,2003.
[5]鲍虎军,金小刚,彭群生.计算机动画算法基础[M].北京:科学出版社,2000.
[6]Addrew Rollings,Dave Morris.Game Architecture and Design.the Coriolis Group,2000.
[7]Charles Petzold.Programming Windows.Microsoft,1998.
[8]Jim Blinn,Jim Blinn’s Corner.A Trip Down the Graphics Pipeline.Morgan-Kaufmann,1996.
[9]Direct X 9.0 SDK.Microdift Cooperation,2003.
[10]Daniel Sanchez-Crespo Dalmau.Core Techniquesn and Algorithms in Game Programming.New Riders Publishing,2003.