SDL2碰撞检测

时间:2014-02-08 18:42:46

标签: c++ collision-detection sdl-2

我正在创建各种物理模拟器,我有数千个同时移动的点状物体(单个像素)。我目前这种设置的方式是每个点每帧只移动一个像素,这样可以很容易地在二维数组中跟踪它们并检查它们是否会发生碰撞。然而,该解决方案不允许帧独立移动,这是必要的,因为碰撞检测非常慢。在这种情况下,进行碰撞检测的最有效方法是什么?

1 个答案:

答案 0 :(得分:2)

好的,首先要做的事情是:

在任何现代操作系统上,您的应用都将是

  1. 与另一个应用程序或操作系统本身共享处理器时间,这是大致相同的事情
  2. 在不同时间执行不同数量的工作 - 例如,在后台加载资源,重建碰撞树或玩Pac-Man
  3. 战斗飞行烤面包机
  4. 此外,您永远不会知道您的应用程序(如果已分发)将运行哪种硬件。这需要很多麻烦,但首要的是你在编译时从不知道帧之间经过了多少实时。

    (最近出现了一个有趣的情况,当一个客户在关闭笔记本电脑,上飞机并重新打开它之后想要一个轨道计算是正确的。很容易修复,但你可能希望预计每个12小时框架情况。)

    那么,你怎么处理这个?

    任何框架都会提供某种计时器。我不确定SDL如何处理这个问题,但通常情况下,在Windows上,您使用GetTickCount()来获取帧之间经过的毫秒数。每个粒子都有一个速度,以每秒单位表示。 (请使用米。拯救世界单位的痛苦用户1868866)。

    移动粒子时,

    pos + = velocity * elapsed_time;

    或者,作为一个具体的例子,如果我在一辆以50英里/小时的速度行驶的汽车,

    位置+ = 50英里/小时* 2小时= 100英里。

    这样做可以解决粒子在帧时间内移动而不是模拟/游戏/实时的问题。

    现在,碰撞检测问题。因为我们在这里工作2D ...

    对于少数几个对象,您无法在合理的时间内将每个对象与每个其他对象进行比较,以确定它们是否发生碰撞。

    所以,我们有像Quadtrees这样的花哨的东西。我们的想法是将您的空间递归地划分为象限,每个象限实际上都是一个数据结构,它以某种方式“包含”所有属于其范围的项目。然后,您只需检查同一四叉树节点中的项目之间的冲突。

    为特定应用程序实现四叉树的方式太长,不适合SO答案,但我鼓励您研究它,尝试并实施它,并回到这里解决您遇到的任何问题。另一个很好的资源是gamedev.stackexchange.com,它比SO更关注游戏/图形。

    祝你好运。