【问题标题】:QuadTree for 2D collision detectionQuadTree 用于 2D 碰撞检测
【发布时间】:2011-05-24 23:25:16
【问题描述】:

我目前正在开发 2D 射击类型的游戏,并且我正在使用四叉树进行碰撞检测。我编写了一个工作四叉树,可以正确地将我的演员推入它们在树中所属的节点/叶子中。但是,我遇到了一些问题。

首先,我如何实际使用我的四叉树来选择一个对象应该针对哪些其他对象测试碰撞?我不确定这是如何完成的。

这就引出了第二个问题。假设我在节点中有一个对象不是另一个节点的邻居,但是该对象足够大以至于它跨越了几个节点,我如何检查实际的碰撞,因为我猜测树可能认为它不是足够接近以与“远处”节点中的对象发生碰撞?不完全适合节点的对象是否应该保留在父节点中?

在我的游戏中,大多数物体大小不一,并且四处移动。

我已经阅读了大量关于四叉树的博客/文章,但大多数只是解释了如何构建一棵树,而这并不是我真正想要的。

欢迎任何帮助/信息。

【问题讨论】:

  • 如果你制作的游戏真的很像你链接的视频,那是你根本不应该使用空间索引,一个未排序的实体列表可能会更快,最多移动几百个对象。
  • 取决于我认为的碰撞......可能对于基于圆的碰撞,可能不是基于像素的碰撞。此外,对于较少数量的对象,在一维排序的实体列表中查找邻居通常是最快的,IIRC。但是对于纯粹的经验来说,实现一个工作四叉树是值得的。 (而且,子弹地狱趋势射击游戏可以轻松拥有数百个移动物体:))

标签: c++ data-structures collision-detection quadtree


【解决方案1】:

您可以建立一个约定,即每个元素都包含在完全包含它的最小四叉树节点中

然后,当您检查节点 A 的冲突时,您可以这样进行:

  1. 当前节点 = 根节点
  2. 直接在当前节点检查 A 与每个元素的冲突
  3. 如果A可以完全包含在当前节点的任何子节点中,则将当前节点设置为该子节点,然后再转到2
  4. 最后,递归地检查 A 与当前节点的子节点中的所有元素的冲突。

请注意,对象越小,它们在四叉树中的位置就越深,因此比较少。

【讨论】:

  • 顺便说一句- not 仅叶子可以包含元素的约定可能不是唯一存在的约定-只是我想到的第一个约定。您可能偶然发现了其他采用不同假设并因此需要不同方法的变体。
  • 所以我基本上需要对游戏中的每个对象重复这 4 个步骤来测试它是否有任何潜在的碰撞?
  • 是的,在一般情况下。但是您可以同时拥有几棵树 - 例如子弹不会与子弹碰撞,因此您甚至可以为子弹拥有单独的树并为敌人分开,并检查每颗子弹与敌人的树等。检查你的逻辑想想你在这个变体中实际需要多少棵树:)
猜你喜欢
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多