【问题标题】:Collision Handling Between Circle and Line Segments圆和线段之间的碰撞处理
【发布时间】:2009-12-07 06:35:18
【问题描述】:

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

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

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

如果有什么不同,我会使用 XNA。

谢谢,
卡梅伦

【问题讨论】:

  • 您检查过 Farseer 物理引擎吗? codeplex.com/FarseerPhysics
  • 其实我刚问完问题就下载了。我正要试一试——到目前为止它看起来不错(我一直在阅读文档)!
  • 最后,我无法让引擎做我想做的事,而且文档有些缺乏,所以我回到了我的自定义物理引擎并使用以下一些建议对其进行了改进

标签: xna line collision-detection intersection geometry


【解决方案1】:

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

有两种解决方案:

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

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

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

【讨论】:

  • 感谢您的回复!当我有更多时间时,我一定会用谷歌搜索你的建议。我设法解决了我物理学中的大部分问题,方法是将最后一帧到当前帧的所有位置插入一个很小的百分比(正好足以让球移动一个像素),直到检测到碰撞(效率为次要目标)。
【解决方案2】:

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

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

【讨论】:

  • 我认为我遇到的大部分问题都可以通过找到初始碰撞来解决,而不是让球与给定帧中与之相交的每个对象发生碰撞。
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多