【问题标题】:OpenGL C++ Circle vs Circle CollisionOpenGL C++ 圆与圆碰撞
【发布时间】:2016-02-26 11:22:13
【问题描述】:

我正在制作一个 2D 游戏,我创建了两个圆圈,一个命名为玩家,一个命名为敌人。圆圈是通过调用 drawPlayerCircle 和 drawEnemyCircle 函数绘制的,这两个函数都在我的 display() 函数中调用。目前我的项目不是面向对象的,你可能已经知道了。我的碰撞适用于两个圆圈,因为我已经计算了穿透向量和归一化向量等......但是我的问题是,通过在游戏中拥有 10-20 个敌人来进一步扩展这个游戏,我怎样才能快速计算出与每个敌人的碰撞而不是手动计算我的玩家和游戏中每个敌人之间的穿透和归一化向量,这显然是非常低效的。我猜想将我的玩家和敌人实体分成他们自己的类,但我仍在努力想象碰撞将如何工作。

任何帮助将不胜感激! :)

【问题讨论】:

  • 这是closest pair of points problem的变体。
  • 既然是圆形,要检测碰撞,您只需检查中心之间的距离是否小于 r1+r2。因此,一次检查需要两次减法、三次乘法、两次加法和一次比较。
  • 我了解碰撞背后的数学如何与两个圆半径一起工作'但我的问题是如何以最有效的方式扩展它,以便我的程序跟踪玩家和所有敌人之间的距离
  • 如果你只想检查与玩家的碰撞,我会说有 10-20 个敌人,只在列表中比较它们会很有效。您当然可以在进行乘法之前添加一些检查,但它们可能不值得。如果每个人的半径都相同,那么计算就更简单了,所以任何花哨的东西都可能不值得。无论如何,您只需要检查运动。

标签: c++ collision-detection collision geometry


【解决方案1】:

两个圆圈之间的碰撞非常容易测试。只需检查圆心点之间的距离是否小于两个半径之和即可。

我会首先将玩家与其他所有敌人进行比较。进行 20 次比较不会对过去 10 年的任何计算机征税。我坚信只需编写您现在需要的代码,而不是使事情复杂化,尤其是在您刚刚开始的时候。

但是,如果您最终拥有数百万个圈子,并且您分析了代码并发现测试所有圈子的速度很慢,那么有很多选择。最简单的方法可能是在游戏区域上方放置一个网格。

每个网格单元在游戏区域上覆盖固定数量的空间并存储一个圆圈列表。每当一个圆圈移动时,计算它应该在哪个网格单元格中。从它当前所在的网格单元格中删除它,并将它添加到它应该在的网格单元格中。然后你可以只比较与玩家网格重叠的圆圈细胞。

【讨论】:

    【解决方案2】:

    Space partitioning. 具体来说,如果您在 2D 中,您可以使用 quadtree 来加速碰撞检测。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2022-09-25
      相关资源
      最近更新 更多