Xna 圆与线段之间的碰撞处理

Xna 圆与线段之间的碰撞处理,xna,line,collision-detection,intersection,geometry,Xna,Line,Collision Detection,Intersection,Geometry,我正在执行一个小游戏,在让物理正常工作方面遇到了困难。 在这个游戏中,有一个球(一个从一帧到另一帧移动的圆,可能会改变半径)和几面墙(也会从一帧到另一帧移动的线段)。我可以正确地检测碰撞,使球在正确的方向反弹是没有问题的 当球在一帧中与一条线相交,然后在下一帧中再次与该线相交,导致双重反弹时,会出现困难。我可以沿着线的法线将球向后移动,直到它处于有效位置,但当所讨论的线沿着其轴线被击中时,这会导致非常奇怪的行为(想象一个乒乓球落在直立的牙签上,然后突然移到一边,使它位于牙签的一侧……)。当球在给

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

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

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

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

谢谢,

Cameron

一般认为,由于时间步长的原因,在两次更新之间,碰撞将穿过一个可接受的点


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

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

有两种解决方案:

便宜的方法是增加你的更新频率。以10个较小的步骤移动对象,而不是一个较大的步骤,这样穿透力会降低,因此通过将球从墙上偏移来固定对象的效果会降低

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


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

您检查过Farseer物理引擎吗?事实上,我刚在问了我的问题后下载了它。我正要尝试一下--到目前为止它看起来不错(我一直在阅读文档)!最后,我无法让引擎实现我想要的功能,而且文档也有点缺乏,因此我回到了我的定制物理引擎,并使用下面的一些建议对其进行了改进。我认为我遇到的大多数问题都可以通过找到初始碰撞来解决,不要让球在给定的帧中与它相交的每个物体碰撞。谢谢你的回复!当我有更多的时间时,我一定会用谷歌搜索你的建议。我通过对从最后一帧到当前帧的所有物体的位置进行很小百分比的插值(精确到足以使球移动一个像素),直到检测到碰撞为止(效率是次要目标),从而解决了我的物理中的大多数纠结。