【问题标题】:Trying to use quadtrees for collision detection in a game尝试在游戏中使用四叉树进行碰撞检测
【发布时间】:2016-02-24 20:53:35
【问题描述】:

我目前正在使用四叉树实现碰撞检测系统。我能够实现四叉树,但我对特定情况有疑问。 假设我的初始四叉树的边界为 200x200。所以我的第一级子四叉树将有一个边界:

西北:(0, 0) ~ (100,100)

SW: (0, 100) ~ (100, 200)

NE: (100, 0) ~ (200, 100)

SE: (100, 100) ~ (200, 200)

假设在 (98, 98) 处有一个正方形对象,它的宽度和高度为 5。我将它们插入子树时取中心位置,因此该对象将放置在 NW 四叉树中。然而,由于它的宽度和高度都是 5,因此它们在技术上也在所有其他 3 个四叉树上。我是否必须检查对象的边界是否跨越四叉树的另一侧,如果是,将多个实例添加到四叉树中?

【问题讨论】:

  • 如果您要创建 2D 碰撞检测,请考虑改用固定网格。它几乎肯定会更快(尤其是在仔细选择单元格大小的情况下),因为找出对象跨越哪些单元格将是一个 O(1) 操作。

标签: c++ quadtree


【解决方案1】:

是的 - 在这种情况下,或者在插入时将您的方块分成 4 个独立的方块。更简单的是只允许将重复项存储在叶子上,并使其便宜(例如指向正方形的指针/索引)

您也可以制作一棵松散的树,您只需选择一个孩子来插入这个正方形,但扩大它的边界框以适应。在这些情况下,您有重叠的分区并且必须递归地向下搜索树,因此它有其优点和缺点。

您可以做的另一件事是允许将元素存储在分支中而不仅仅是叶子中。在这种情况下,如果一个元素想要进入多个子元素,只需将其存储在分支中,而不是进一步下降。为此,您必须在遍历期间检查每个分支处的元素,而不仅仅是叶子处。

我建议从重复开始。其他方法可能会很麻烦,无需为这种麻烦而烦恼(直到您衡量对它的需求)。

这类在任何分支的死点都有区域的元素可能会让你的树变得非常深且不平衡,因此你通常需要一个健康的停止间隙来防止这种情况永远重复出现。除非您拥有大量这样的元素,否则这通常不是什么大问题。

此外,对于 2D 案例,您有时可以使用固定网格。实际上,有时只使用 NxM 网格比四叉树效果更好,因为它构建起来非常简单(这使得快速更新非常动态的内容变得更容易,例如,精灵每帧都在屏幕上移动) ,并且没有棘手的最坏情况,因为它没有“深度”的概念,只有包含元素的单元格。

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 2014-08-05
    • 1970-01-01
    • 2011-06-26
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多