交叉口测试之外的碰撞检测

时间:2013-07-08 16:06:49

标签: testing 2d collision-detection intersection

为了澄清这个目的,想象一个二维游戏,其中玩家控制一个可以给予任意速度的小精灵。它仅受重力作用。它最初位于跨越屏幕底部大部分的大平台上,而它上方的一小段距离是另一个更小的平台。如果精灵直线向上跳,它将能够从平台的底部向上传递,在它上方移动一点,然后下降并降落在上部平台的顶部。它可以通过底部传递,但不能通过顶部向下传递。

可以通过在屏幕上查看对象的每个实体边缘作为可以从右侧,左侧或两者传递的向量来实现此目的;在示例中,您需要一个边缘作为主基础平台的顶部(如果它从右角指向左角,它将从右侧不透水),另一个用于较小平台的顶部,还有几个对于精灵(四个,如果它是一个小矩形)。如果一个点从错误的方向通过边缘,它会向碰撞解决算法发送一个信号,确保该点不会这样做。

这一切都很有效,唯一的问题是效率不高。使用传统的碰撞检测机制,正方形是一个对象。如果你有一个 n 方块的列表来测试它们之间的碰撞,你必须运行 - 最多;大多数方法缩小了这个数字 - n 平方碰撞测试。使用点边方法,每个方格具有大约四个边,每个边具有两个待测端点。这意味着对于 n 方块,您将运行大约(8 n )平方碰撞测试。碰撞试验次数是64次;这太可怕了。

所以,差不多,是否有任何广泛使用或更多公认的碰撞检测方法可以完成与边缘方法相同的操作,但不会过度增加计算机的处理能力?请注意,这仅适用于2D;它意味着让事物层代表一种轴上,而3D完全能够代表所有三维空间,不需要增加。

1 个答案:

答案 0 :(得分:0)

这通常使用四叉树的边界框来完成。树的每个节点都有包围其直接子节点的边界。对于 n 节点,您最多需要 k log n )比较。这是二维搜索。

请注意,边界框不一定与您的方块完全对应。它们通过范围比较进行网格对齐,以便进行廉价的命中测试。

一旦你击中了一个原子的边界框,就对原子进行完全命中测试。

这种方法通常与多边形命中测试结合使用,对于具有多个边的多边形来说这是非常昂贵的(不要将它们称为复杂多边形,复杂多边形是与交叉边“扭曲”的多边形)。 / p>