您将以何种方式提出一种算法来检测不同对象之间的冲突?

时间:2009-03-14 19:21:13

标签: python collision-detection

在开展一个真正有趣的项目时,我遇到了一些问题。

有一个2D世界,有圆球,尖角三角形和瘦线(也许还有其他野生动物)。它们都是WorldCreatures的子类。他们可以进入这个世界。当他们相遇时,会发生碰撞。

我想做的是找出一种检测它们之间碰撞的方法。这就是我现在站在的地方:

  • 对我来说Ball-Ball很简单,我只是计算他们与位置的距离,然后将它们与''尺寸'的总和进行比较。
  • 球与世界边缘之间的碰撞也很简单 - 我只是检查距离它的距离,在笛卡尔坐标系中,它很简单。
  • 更常见的问题是 - 如何检测Line(在某些点开始和结束)或其他对象之间的碰撞?线和点之间的距离也可以很容易地计算出来,但我想要的是

如果对象A与对象B发生碰撞,则说某种通用方式。现在的代码看起来有点像:

class WorldCreature:
    def detectCollision(self, otherObject):
        # do something 
        if collision:
            self.onCollision(otherObject)
            otherObject.onCollision(self)
class Ball(WorldCreature):
    # someing here
class Line(WorldCreature):
    # someing here

现在,碰撞检测机制应该取决于哪些物体可以碰撞。效果也一样。

我应该只保留内存中所有对象的列表,并在每个步骤中循环遍历所有这些对象吗?或者,是否有更好的方法来改善此任务的性能?

4 个答案:

答案 0 :(得分:5)

使用quadtree。它们用于消除您知道在碰撞半径之外的大区域,并且它们可以让您快速搜索最近的点。

就实际碰撞检测而言,由于您只使用凸对象,请查看Metanet Software's tutorial上的the separating axis theorem。在他们的旗舰游戏中,他们实际上使用网格来查找要检查碰撞的所有对象,但是使用四叉树不应该太难。

(我记得在四面体上阅读一篇文章,在网格中使用圆圈来说明如何在半径范围内找到这些点。但我似乎无法找到它。)

答案 1 :(得分:1)

这个问题的答案取决于许多因素,例如有多少个物体,有多少物体在移动与不移动,移动速度等等。我认为正确的起点是获得核心冲突检测和行为代码是正确的,同时忽略了修剪冲突检查等可能做的优化。

核心代码正确无误后,您就可以开始运行实验,看看哪些内容适合您。我会推荐某种空间细分技术,比如kd-trees(尽管在2d中你也可以使用四叉树)。

但从根本上说,可能没有单一的正确答案,除了您可以通过编写游戏编码并进行实验来确定。

答案 2 :(得分:1)

的Python。有点奇怪的野兽对我来说8)

我有创建游戏的c ++经验 - 所以我从这个角度谈谈。

首先(如果对象数量较少,可以跳过此步骤)需要进行广角碰撞检测。已经提到的四叉树只是一种可能的实现方式。 需要宽相来找到可能碰撞的物体对。

然后进入狭窄阶段 - 检查对时。

我使用了以下方案(请注意 - 这是基于原语创建的,如果你需要多面体碰撞 - 只需使用GJK和球体,加上光线,片段):

需要碰撞的所有东西都有CollisionObject来处理变换并存储CollisionPrimitive(盒子,球体等)

每个CollisionPrimitive都有type_id - 当你编写A_B_CheckIntersection时 - 第一个对象总是有较低的type_id

对于从宽泛阶段获得的列表中的每个对 - 如果需要,您可以交换对象并索引一个数组,其中存储指向特定碰撞函数的指针。 当然 - 为此你应该让他们有相同的接口(c ++),但它很容易8)

至于具体的碰撞程序:访问http://realtimerendering.com/intersections.html 这是开始的好地方

答案 3 :(得分:0)

我认为Hough Transform应该以某种方式提供帮助。