2d碰撞检测

      碰撞检测分为两个步骤,一个是筛选目标,一个是进行计算是否碰撞。

 一:网格碰撞      

        网格碰撞检测筛选目标的经典传统算法,英雄无敌,三国志这类SLG,甚至是MOBA类游戏中都常用这种方法。思路就是在大地图中划分格子形成网格,每个战斗单位占据一个格子,当地图生成对象的时候,在对应的格子里面添加对象,删除的时候移除出来,对象位置,模型改变的时候,更新格子信息。检测碰撞只要单位时间内把以角色为中心点的9个格子的所有对象添加到列表中,然后遍历列表对象和角色进行碰撞检测。

2d碰撞检测_第1张图片

A位置的对象 获取周边的格子对象得到的列表是[B],只需要检测A和B是否碰撞就可以了,减少了不必要的A和别的对象的碰撞检测,这样确保了即使对象很多,只要不再相邻格子里都无需计算,只需要更新位置信息即可,网格的优点是当数据比较疏松,格子大小均匀的时候效率高,缺点是1:对于大场景特别消耗内存,而且不太适合做无限延展的场景,2:查询每个对象周围的东西时候,不太方便,格子的粒度越细,速度越慢。3:如果数据比较精密,冗余数据多,重复计算碰撞。


二:四叉树碰撞检测

       四叉树QuadTree,广泛用于图像处理,空间数据索引,2d中的快速碰撞检测等(3d中多了个维度,使用八叉树)。QTree的每个节点下至多有四个孩子节点,把一部分二维空间分解为四个象限,在区域内存储相关信息到节点中,这个区域是可以正方形,矩形或是任意形状。

如下图左边的黑点会构造成右边的四叉树

      2d碰撞检测_第2张图片

其思路是,首先四叉树的节点会有包围盒边界(根节点的边界就是大地图的边界),保证节点内所有的对象都在该边界内。

若该节点内的对象大于某个数量n(n>=1),则在该节点的包围盒继续再次划分4个象限,每个象限为一个子节点插入到父节点中。

最后计算碰撞检测的时候,只需要把同一个节点下的对象进行检测即可。




       


你可能感兴趣的:(游戏)