圆和线段之间的碰撞处理

时间:2009-12-07 06:35:19

标签: xna line collision-detection intersection geometry

我正在实施一个小游戏,但我很难让物理系统正常工作。 在这个游戏中,有一个球(一个圆逐帧移动,可能会改变半径)和几个墙(线段也会逐帧变化和移动)。我可以正确地检测到碰撞,并且让球以正确的方向反弹是没有问题的。

在球与一帧中的线相交,然后在后续帧中再次相交的情况下会出现困难,从而导致双重反弹。我可以沿着线的法线向后移动球,直到它处于有效位置,但是当有关线被沿其轴线击中时,这会导致非常奇怪的行为(想象一个乒乓球落在直立的牙签上并且突然转移到一边,使它在牙签的一侧......)。当球在给定的框架中与多条线相交时,也存在一些问题(想象四条线一起形成一个矩形,并且球与所述矩形的角相交) - 它应该从哪个方向反弹?它应该向哪个方向移动?

我真的没有具体的问题,但我正在寻找提示或一些有用的教程。到目前为止,我设法找到的所有2D都只覆盖了矩形交叉点。

如果它有任何不同,我正在使用XNA。

谢谢,
卡梅伦

2 个答案:

答案 0 :(得分:2)

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

有两种解决方案:

便宜的是增加更新频率。以10个较小的步长移动物体而不是单个较大的物体,你的穿透力较小,因此通过将球偏离墙壁来固定它将不那么明显。

昂贵的是连续碰撞检测。有一些算法可以告诉你,给定一个移动和静止的物体,它们将会相交的确切时间点。谷歌“扫过球体矩形交叉点”找到其中的一些。

然后您可以像这样更新:球需要移动1.0个单位。检查是否有碰撞。在0.25个单位之后发生碰撞,因此将球移动0.25个单位,计算反射向量(使球从墙上反弹),用剩余的0.75个单位重复碰撞检查(直到你知道球的最终位置)。这样可以完全避免穿透,即使你的球移动得如此之快以至于通常会在一次更新中跳过墙壁,也会检测到碰撞。

答案 1 :(得分:1)

人们普遍认为,由于时间步长,您的碰撞将在更新之间超过可接受的点。

基本上,你必须回插到碰撞真正发生的最后一帧和当前帧之间的点,将物体移回那个点,然后计算力等。