代码之家  ›  专栏  ›  技术社区  ›  Cameron

圆与线段碰撞处理

  •  2
  • Cameron  · 技术社区  · 16 年前

    我正在执行一个小游戏,无法使物理正常工作。 在这个游戏中,有一个球(一个可以从一帧移动到另一帧,并且可以改变半径的圆)和几个墙(也可以从一帧移动到另一帧的线段)。我可以正确地检测碰撞,使球以正确的方向弹起是没有问题的。

    当球在一个帧中与一条线相交,然后在随后的帧中再次与之相交,从而导致双弹跳时,就会出现困难。我可以沿着直线法向移动球,直到球处于正确的位置,但是当有问题的直线沿着它的轴被击中时,这会导致非常奇怪的行为(想象一个乒乓球落在一个直立的牙签上,然后突然移到一边,这样它就在牙签的一边…)。当球与给定帧中的多条线相交时,也存在一些问题(假设四条线在一起形成一个矩形,球与矩形的角相交)——它应该从哪个方向弹起?它应该朝哪个方向移动?

    我没有具体的问题,但我在找一些提示或一些有用的教程。到目前为止,我所找到的所有二维图都只包括矩形交叉点。

    我用的是XNA,如果有什么区别的话。

    谢谢,
    卡梅伦

    2 回复  |  直到 16 年前
        1
  •  2
  •   Cygon    16 年前

    这是大多数物理图书馆普遍存在的问题。如果你在谷歌上搜索“渗透深度”(和“物理”,我建议,或者你可能会发现完全不同的东西:d),你会发现即使是这些库也会使用像你这样的技巧。

    有两种解决方案:

    便宜的方法是增加更新频率。用10个小步骤移动物体,而不是用一个大的步骤,这样你的穿透力就会小一些,所以通过将球从墙上偏移来固定它的效果就不那么明显了。

    最昂贵的是连续碰撞检测。有一些算法可以告诉你,给定一个运动物体和一个静止物体,两个物体的精确时间点将相交。谷歌“扫描球面矩形交叉点”来找到其中一些。

    然后你可以这样更新:球需要移动1.0个单位。检查有无碰撞。碰撞发生在0.25个单位之后,所以移动球0.25个单位,计算反射向量(使球从墙上反弹),用剩下的0.75个单位重复碰撞检查(直到你知道球的最终位置)。这可以完全避免穿透,即使你的球移动的太快,它通常会在一次更新中跳过墙,碰撞也会被检测到。

        2
  •  1
  •   Joel Martinez    16 年前

    人们普遍认为,由于时间步长的原因,在两次更新之间的冲突将相交超过一个可接受的点。

    基本上,您必须将其插值回发生碰撞的最后一帧和当前帧之间的点,将对象移回该点,然后计算力等。