如何实现快速,准确的2D碰撞检测?


11

我很清楚如何检测两个或多个2D对象是否碰撞,但是我对如何决定是否检查碰撞感兴趣。在以前的项目中,我只是让每个对象都与其他每个对象进行检查(我知道,O(n ^ 2)级的愚蠢程度),并且创建的游戏性不那么流畅。

各种论坛都赞扬四叉树,B树以及您能想到的任何其他种类的树或结构的伟大之处。

确定是否应检查碰撞的最有效结构是什么?


1
您可能要考虑的一件事是仅检查已移动物体的碰撞,并且仅检查靠近您的物体的碰撞。我当前的系统运行良好(成千上万个对象),这就是我正在做的。
ultifinitus 2011年

我认为gamedev.stackexchange.com/questions/14369 / ...可以帮助您很多。它最初是用于并行处理的算法,但我认为同一算法也可以改善单线程应用程序。
Ali1S232 2011年

1
@ultifinitus本质上就是我要问的问题。如何确定附近没有哪些对象,而又不遍历每个对象并检查其位置?
Mike Cluck

迈克,您可以通过电子邮件将我使用的某些特定代码发送给我,它是用c ++编写的,或者我可以为您提供基本的结构,尽管它可能因此变得模棱两可和复杂。
ultifinitus

1
它不是重复的,因为我在问哪种类型的结构最适合确定我们是否应该打扰检查碰撞。另一个问题是询问透明与非透明碰撞。更不用说,这个问题是在您链接到该链接的一年之前提出的。
Mike Cluck 2014年

Answers:


12

对于2D游戏,除非2D对象在地图的一侧具有非常重的分布,否则几乎总是要使用统一的网格。内存复杂度是直截了当的(与您的地图尺寸成比例),并且分布合理,具有O(1)查找时间和log(numberOfObjects /(rows * column))的平均值)^ 2个交集测试每个单元完成。您可能决定只检查其中有对象移动的像元,这使静态几何更有效率。动态修改统一网格很容易(与基于树的解决方案相比,痛苦不大),并且易于实现。我唯一不说要在2D游戏中不使用它的情况是,当统一网格的内存要求变得太大时(例如,空间级别稀疏但巨大的空间模拟)。


此解决方案如何处理与2或4个网格单元接壤的对象?
ashes999 2012年

1
对象重叠的任何单元格都被认为位于其中,因此一个对象可以位于多个单元格中。大多数空间数据结构将以类似方式处理重叠问题。
达西·雷纳

哇,真漂亮。+1干杯。
ashes999 2012年


1

如果您的世界具有一个非常“长”的维度(称为X),与其他维度相比,您可以将这些对象保留在一个有序列表中,可以在它们移动时对其进行重新排序,然后碰撞检测意味着仅检查那些在X轴上重叠。

另一个可能性是保留对象的主动/被动列表,并且不打扰被动对象(根本不会移动)。

如果它们都是播放器在屏幕上可见的中等大小的对象,那么一切对一切可能都还不错。

除此之外,我和Darcy在一起,统一的网格是很好的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.