从一开始,碰撞检测就像是一个O(n^2)问题。
您有一堆对象,您需要检查每个对象是否与任何其他对象发生冲突。然而,我知道,检查每个对象与所有其他对象是极其无效的。如果两个球甚至不是很接近的话,为什么要进行比较昂贵的碰撞检查呢?
下面是我正在做的简单程序的例子:

如果你有1000个球,那么如果你去了天真的碰撞检测,你会有1000^2收集检查(一百万)!这种碰撞检查很快就成了我的应用程序的瓶颈。我需要实施一些广泛的阶段修剪。
当使用2d -圆形对象时,应该使用什么技术来修剪碰撞检查?我读过关于QuadTrees、BSP、空间散列等的文章,但是很难确定哪种方法最适合这个用例。
有没有人知道什么最有效?
发布于 2009-01-05 21:31:09
空间散列。见雨果·伊莱亚斯的网页。
发布于 2009-01-05 21:32:18
我不会使用QuadTrees或任何复杂的东西,因为当球在它们之间移动时,您将不断地平衡和重新平衡树。它可能会更有效,只要有一个网格--每次你移动一个球,你就可以计算它在哪个网格单元格里,如果它被改变了,你可以把它扔进去。每次你需要做碰撞检查时,你只需要检查球的中心在你的网格中,或者在相邻的球中,如果你离边缘足够近的话。
您可以试验网格大小,以找到最佳的。你可能会发现这取决于你有多少个球。
我是在下面的评论中这样说的,但我认为它应该是答案的一部分:只有当某物移动时才进行排序检测,所以您只需要检查移动的东西与其网格正方形中的东西(以及上面提到的其他东西)。那样的话,如果底部有一堆没有移动的东西,那么这些物体很快就不会被检查是否有碰撞,因为在它们的网格中没有任何东西在移动,也没有任何东西在它们的网格中移动。
发布于 2009-01-06 06:52:00
我第二次使用网格方法。对球的二维模拟不会受益于QuadTrees (当您有复杂的几何图形(如字符和建筑物)或BSPs (如果您在多人游戏或策略游戏中有非常不均匀的分散/集中的对象,比如高集中区和低集中区)时,通常使用它)。
https://stackoverflow.com/questions/414553
复制相似问题