Data structures 应该使用什么技术来修剪二维碰撞检查?

Data structures 应该使用什么技术来修剪二维碰撞检查?,data-structures,collision-detection,spatial,broad-phase,Data Structures,Collision Detection,Spatial,Broad Phase,从一开始,碰撞检测就感觉像是一个O(n^2)问题 您有一堆对象,您需要检查每个对象是否与任何其他对象发生碰撞。然而,我知道,对照所有其他对象检查每个对象是非常不有效的。如果两个球彼此不近,为什么要在它们之间进行相对昂贵的碰撞检查 下面是我正在进行的简单程序的示例: 如果您有1000个球,那么如果您使用naive碰撞检测,您将有1000^2次收集检查(一百万次)!这种冲突检查很快成为我的应用程序中的瓶颈。我需要实现一些广泛的阶段修剪 在处理二维圆形对象时,应该使用哪些技术来修剪碰撞检查?我读过关

从一开始,碰撞检测就感觉像是一个O(n^2)问题

您有一堆对象,您需要检查每个对象是否与任何其他对象发生碰撞。然而,我知道,对照所有其他对象检查每个对象是非常不有效的。如果两个球彼此不近,为什么要在它们之间进行相对昂贵的碰撞检查

下面是我正在进行的简单程序的示例:

如果您有1000个球,那么如果您使用naive碰撞检测,您将有1000^2次收集检查(一百万次)!这种冲突检查很快成为我的应用程序中的瓶颈。我需要实现一些广泛的阶段修剪

在处理二维圆形对象时,应该使用哪些技术来修剪碰撞检查?我读过关于四叉树、BSP、空间散列等的内容,但很难找出最适合这个用例的方法


有人知道什么最有效吗?

空间哈希。请看。

我不会使用四叉树或任何复杂的东西,因为当球在树之间移动时,你会不断地平衡和重新平衡树。只要有一个网格可能会更有效——每次你移动一个球,你就可以计算出它所在的网格单元,如果它改变了,就把它扔进去。每次你需要做碰撞检查的时候,你可以只检查球的中心在你的网格中,或者如果你足够靠近边缘的话,在相邻的网格中

您可以尝试网格大小以找到最佳值。你可能会发现这取决于你有多少球

我在下面的评论中说过,但我认为这应该是答案的一部分:
只有当某个东西移动时才进行冲突检测,因此您只需对照其方格中的东西(以及上面提到的相邻的东西)检查移动的东西。这样,如果底部有一堆东西没有移动,很快这些对象就不会被检查碰撞,因为它们的网格内没有任何东西移动,也没有任何东西进出网格。

我支持网格方法。球的2D模拟不会受益于四叉树(通常在角色和建筑等复杂几何体中使用)或BSP(如果在多人游戏或策略游戏中,对象的分散/集中非常不均匀,如高集中区域和低集中区域,则应选择BSP)

将相关问题添加到我的答案中,并从你的答案中删除该问题,因为它会分散注意力。看上图,你会说这是一个不够集中的问题吗?通常情况下,窗户更大,球落在底部。你还会建议使用网格而不是BSP吗?BSP是一种不规则的网格,我建议使用规则的象棋式网格。不同之处在于,与BSP相比,象棋式网格易于实现和调试,甚至更适合于专业游戏。如果你的表现有问题,你可以把你的网格上升到一个BSP,或者作为个人的挑战在你的情况下,注意力实际上是不均衡的,下面你有很多球,上面的球很少。所以你可以在底部使用更细的网格,这是专家知识的应用,因为你知道会发生什么,而且这不是一个真正的一般情况,就像台球桌。一旦你把球放在底部,我假设它们的速度会很快降到零,因此,您不必检查它们是否与任何物体发生碰撞(尽管您必须检查是否有任何物体与它们发生碰撞)。因此,请进一步扩展-仅在移动物体时进行碰撞检测,因此,一旦网格正方形中的所有物体均为零,您就不必再检查该正方形。