xna - 圆和线段之间的碰撞处理

标签 xna line collision-detection intersection geometry

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

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

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

如果 XNA 有什么区别的话,我正在使用它。

谢谢,
卡梅伦

最佳答案

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

有两种解决方案:

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

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

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

关于xna - 圆和线段之间的碰撞处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1858240/

相关文章:

c# - 如何在 Mac 上的 VirtualBox 中运行 XNA?

matlab - 如何在 MATLAB 中保存带有封闭框区域的图?

Java Brickbreaker 桨碰撞检测

运行时未找到 C# 程序集

xna - 如何在XNA中正确计算FPS?

python - wc -l 和 python 行数不同

python - 如何使用python查找线段的长度

javascript - 如何在 Phaser 3 中更改图像的碰撞框形状?

java - 与矩形碰撞。相交 [Java]

C# Random() 不是很随机地工作