基于网格的碰撞检测

本文介绍了在大量物件碰撞检测中使用基于网格的方法,以减少检测次数,提高效率。通过划分网格,先检查格子内的物件,然后检测与相邻格子的交集,仅检查关键的四个方向。在代码实现中,使用一维数组优化存储,并提供详细检查函数实现。

1)碰撞检测有两种常用方法:将所有物件两两测试,当物件数量少的时候,用这种方式既简单又快速; 基于网格检测,先将整个区域划分成格子,再基于格子检测,遍历所有格式,先检查本格中的所有物件,再将本格和相邻格中的物件一一检测,当物件数量多时,需要用这种方式进行检测,将大大减少检测数量;

2)划分格式时,应确保格子的尺寸比“最大的物件”尺寸还要大,必须能保证格式一定能将物件包住;

3)每个格子在检测时,只用检测“右边”、”左下边“、”下边“、”右下边“这四个格子就行,不用检测周边的八个格子;

4) 用一维数组来保存格子,通过在索引上做文章来识别它以属于第几行,这样能提高性能。

==========================================

private function checkGrid(): void

{

for(var i: int=0; i < _grid.length; i++)

{

for(var j: int=0; j < _grid[ i ].length; j++)

{

// 检测第一个格子内的对象间是否发生碰撞

checkOneCell(i, j);

checkTwoCells(i, j, i+1, j); // 右边的格子

checkTwoCells(i, j, i-1, j+1); // 左下角的格子

checkTwoCells(i, j, i, j+1); // 下边的格子

checkTwoCells(i, j, i+1, j+1); // 右下角的格子

}

}

}



private function checkOneCell(x: int, y: int): void

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值