高级碰撞检测(二)——居于格子的大量单位的检测方法

来源:互联网 发布:阿里云系统手机root 编辑:程序博客网 时间:2024/05/05 16:17

对于大多数引擎来说,大量对象之间的移动和碰撞会引发很多的问题,一个不留意就会把渲染速度给降下来,所以对大量对象的碰撞检测有很多的探讨余地,当然这也要结合项目的具体情况来实现。

如果只有6个相互作用的对象进行两两检测时,假设给定对象为A、B、C、D、E、F,那么它们需要进行以下15次检测:

AB、AC、AD、AE、AF

BC、BD、BE、BF

CD、CD、CF

DE、DF

EF

那么可以得到这种检测方法的次数是(N*N - N)/2,可以看到,检查的次数会随着对象的数量而飞速增长,100个单位单独检查的话,需要完成4950次,相信基本哪个引擎都经不起这样的折腾的,如果是应用上一节的hitTest方法,那能撑到50个就已经很了不起了。那么,居于格子的碰撞检测方法就可以有很好的施展空间了,具体以下进行讲解。

所谓居于格子检测方法,就是将地图分成一个个格子来考虑,一般我们习惯用一个二维数组存取每一个格子的数据,注意,单元格至少要和最大的对象一样大,然后根据对象中心所在的位置将各个对象分配到该网格的某个单元格中。如果一切正常,给定单元格中的对象只可能与其周围的8个单元格中的对象发生碰撞,如图:

当然,在实际检测中这还可以继续优化,如果是一次性判断全部的碰撞,那么,不是边缘情况,只需检测如图这些区域就可以全部都检测碰撞完,边缘的话把超过的去掉就行,如图所示:


对象A只需检测标有灰色的格子上的单位,依次类推,那么每个单位都能检测周围的8个格子,可以在纸上模拟一下,很容易发现规律的。

对于每个格子上的单位检测的时候,我们最多要处理5个单元格:所检查的主单元格,右边单元格,以及下面的单元格,A比较结束之后,再检测A的下一个单元格,顺序是从左往右,从上往下依次进行,那么100个对象之间实际发生的碰撞检测的平均次数在100次至200次之间,比所有对象相互比较的4950次节约了4800次左右,从这可以看出它的优势所在了。实现代码效果如下:



具体的代码我就不贴了,可以在这下载,不用积分,只为能交流下思想吐舌头

http://download.csdn.net/detail/lbq09047128/8281857



0 0