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

Python 您将以何种方式提出一种算法来检测不同对象之间的碰撞?,python,collision-detection,Python,Collision Detection,在做一个纯粹为了好玩的项目时,我遇到了一些问题 这是一个二维世界,充满了圆球、尖三角形和细线(也许还有其他野生动物)。它们都是世界生物的亚类。他们可以在这个世界里移动。当它们相遇时,就会发生碰撞 我想做的是找到一种检测它们之间碰撞的方法。我现在站在这里: 对我来说,球很容易,我只是计算出它们与位置之间的距离,并将其与它们的“大小”之和进行比较 球和世界边缘之间的碰撞也很简单——我只是检查了它和球之间的距离,在笛卡尔坐标系下,这很简单 更一般的问题是-如何检测直线(在某些点开始和结束)或其他可能

在做一个纯粹为了好玩的项目时,我遇到了一些问题

这是一个二维世界,充满了圆球、尖三角形和细线(也许还有其他野生动物)。它们都是世界生物的亚类。他们可以在这个世界里移动。当它们相遇时,就会发生碰撞

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

  • 对我来说,球很容易,我只是计算出它们与位置之间的距离,并将其与它们的“大小”之和进行比较
  • 球和世界边缘之间的碰撞也很简单——我只是检查了它和球之间的距离,在笛卡尔坐标系下,这很简单
  • 更一般的问题是-如何检测直线(在某些点开始和结束)或其他可能存在的对象之间的碰撞?直线和点之间的距离也可以很容易地计算出来,但我想要的是
一种通用的方式,表示对象
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
现在,碰撞检测机制应该取决于哪些对象可以碰撞。效果也是如此

我是否应该保留内存中所有对象的列表,并在每个步骤中循环所有对象?或者,是否有更好的方法来提高此任务的性能?

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

至于实际的碰撞检测,由于您只使用凸面对象,请查看。在他们的旗舰游戏中,他们实际上使用网格来查找所有要检查碰撞的对象,但使用四叉树应该不会太难


(我记得读过一篇关于四叉树的文章,文章中使用了网格中的圆来说明如何找到半径内的点。但我似乎找不到。)

这一问题的答案取决于许多因素,例如有多少对象,有多少对象在移动,有多少对象在移动,有多少对象在不移动,它们移动的速度有多快,我认为正确的出发点是让核心冲突检测和行为代码正确无误,同时忽略可能进行的优化,以减少冲突检查,等等

一旦核心代码是正确的,您就可以开始运行实验,看看什么将对您有好处。我会推荐一些空间细分技术,比如kd树(尽管在2d中,您也可以使用四叉树)


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

我认为应该会有所帮助。

Python。对我来说有点奇怪(8)

我有C++的游戏体验——所以我从这个角度谈。

首先(如果对象数量较少,可以跳过此步骤),您需要广泛的相位碰撞检测。前面提到的四叉树只是一种可能的实现。 要找到可能发生碰撞的对象对,需要进行宽相位

然后进入狭窄阶段——当检查对时

我使用了以下方案(注意——这是在考虑基本体的情况下创建的,如果需要多面体碰撞——只需使用GJK和球体,加上光线和线段):

所有需要碰撞的东西都有CollisionObject,它处理变换和存储碰撞原语(长方体、球体等)

每个CollisionPrimitive都有类型\u id——当您编写一个\u B\u CheckIntersection时——第一个对象总是有较低的类型\u id

对于从broad phase获得的列表中的每一对对象,如果需要,可以交换对象,并为存储特定冲突函数指针的数组编制索引。 当然——为此,您应该让它们具有相同的接口(c++),但这很简单(8)

至于具体的碰撞程序:请访问
对于四叉树来说,这是一个很好的开始。另一个问题是,您想检测实际碰撞还是仅检测交叉点。实际碰撞将要求您扫描形状。