我正在实现一个小游戏,但无法让物理正常工作。 在这个游戏中,有一个球(一个在帧之间移动的圆,并且可能会改变半径)和几个墙(也会在帧之间变化和移动的线段)。我可以正确检测碰撞,并且让球朝正确的方向反弹是没有问题的。
如果球在一帧中与一条线相交,然后在下一帧中再次与该线相交,从而导致两次弹跳,则会出现困难。我可以沿着线的法线将球向后移动,直到它处于有效位置,但是当有问题的线沿着其轴线被击中时,这会导致非常奇怪的行为(想象一下一个乒乓球落在直立的牙签上,并且突然移到一边,使其位于牙签的一侧......)。当球在给定帧中与多条线相交时,还会出现一些问题(想象四条线一起形成一个矩形,并且球与所述矩形的角相交)——它应该向哪个方向反弹?应该朝哪个方向移动?
我确实没有具体的问题,但正在寻找提示或一些有用的教程。到目前为止我找到的所有 2D 都只覆盖矩形交叉点。
如果 XNA 有什么区别的话,我正在使用它。
谢谢,
卡梅伦
最佳答案
这是大多数物理库的普遍问题。如果你用谷歌搜索“渗透深度”(我建议与“物理”一起使用,或者你可能会发现完全不同的东西:D),你会发现即使这些库也使用像你这样的技巧。
有两种解决方案:
最便宜的方法是增加更新频率。以 10 个较小的步骤(而不是一个大的步骤)移动物体,你的穿透力就会降低,因此通过将球偏离墙壁来修复它会不太明显。
最昂贵的是连续碰撞检测。有一些算法可以告诉您,给定一个移动的物体和一个静止的物体,两者将相交的确切时间点。谷歌“扫描球体矩形交点”来找到其中的一些。
然后您可以这样更新:球需要移动 1.0 个单位。检查是否有碰撞。碰撞发生在 0.25 个单位后,因此将球移动 0.25 个单位,计算反射矢量(因此球从墙上弹回),对剩余的 0.75 个单位重复碰撞检查(直到知道球的最终位置)。这完全避免了穿透,即使你的球移动得如此之快以至于它通常会在一次更新中跳过墙壁,碰撞也会被检测到。
关于xna - 圆和线段之间的碰撞处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1858240/