2

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

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

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

如果有任何区别,我正在使用 XNA。

谢谢,
卡梅伦

4

2 回答 2

2

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

有两种解决方案:

便宜的一个是增加你的更新频率。以 10 个较小的步骤移动物体而不是一个大的步骤,这样您的穿透力就会降低,因此通过将球偏离墙壁来固定它会不太明显。

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

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

于 2009-12-10T07:39:08.467 回答
1

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

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

于 2009-12-08T21:53:24.050 回答