【问题标题】:What technique should be used to prune 2d collision checks?应该使用什么技术来修剪 2d 碰撞检查?
【发布时间】:2010-09-29 16:43:48
【问题描述】:

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

你有一堆物体,你需要检查每个物体是否与其他物体发生碰撞。但是,我知道将每个对象与所有其他对象进行检查是非常低效的。如果两个球甚至不靠近,为什么还要在两个球之间进行相对昂贵的碰撞检查?

这是我正在处理的简单程序的示例:

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

在处理二维圆形物体时,应该使用哪些技术来修剪碰撞检查?我读过关于 QuadTrees、BSP、空间散列等的信息,但很难找出最适合这个用例的方法。

有人知道什么是最有效的吗?

【问题讨论】:

    标签: data-structures collision-detection spatial broad-phase


    【解决方案1】:

    我不会使用 QuadTree 或任何复杂的东西,因为当球在它们之间移动时,你会不断地平衡和重新平衡树。仅仅拥有一个网格可能会更有效 - 每次移动球时,您都可以计算它所在的网格单元,如果它发生变化则将其扔在那里。每次您需要进行碰撞检查时,您只需检查中心在您的网格中的球,或者如果您足够靠近边缘,则在相邻的球中。

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

    我在下面的评论中说过这一点,但我认为它应该成为答案的一部分: 仅在物体移动时进行碰撞检测,因此您只需检查移动物体与其网格正方形中的物体(以及如上所述的相邻物体)。这样,如果底部有一堆没有移动的东西,很快就不会检查这些对象是否发生碰撞,因为它们的网格内没有任何东西在移动,也没有任何东西移入或移出它们的网格。

    【讨论】:

    • 在我的答案中添加了相关问题,并从您的答案中删除了该问题,因为它会分散注意力。
    【解决方案2】:

    空间散列。见Hugo Elias's page about it

    【讨论】:

      【解决方案3】:

      我支持 Grid 方法。球的 2D 模拟不会受益于 QuadTree(通常在您具有复杂的几何形状,如角色和建筑物时使用)或 BSP(如果您的物体分散/集中度非常不均匀,则应该选择它,例如高浓度区域和低浓度区域,在多人或策略游戏中)

      【讨论】:

      • 看上图,你说这是否构成了不够集中?通常情况下,窗口会更大,而球则位于底部。你还会建议使用 BSP 上的网格吗?
      • BSP 是不规则的网格,我建议使用规则的类似国际象棋的网格。不同之处在于,与 BSP 相比,类似国际象棋的网格易于实现和调试,甚至更适合专业游戏。如果性能有问题或作为个人挑战,您可以将 Grid 升级为 BSP
      • 在你的情况下,浓度实际上是不均匀的,下面有很多球,上面有更少的球。因此,您可以在底部使用更精细的网格大小,这是专家知识的应用,因为您知道会发生什么,而且它不是一个真正的通用情况,例如台球桌。
      • 一旦你把球放在底部,我认为它们的速度会很快降到零,所以你不必检查它们是否与任何东西发生碰撞(尽管你会检查是否有任何东西与它们发生碰撞)。
      • 所以扩展一下 - 仅在您移动某物时进行碰撞检测,因此一旦网格正方形中的所有内容都为零,您就不再需要检查该正方形。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2016-08-19
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多