与角落的2D球碰撞

时间:2009-12-22 10:57:15

标签: 2d collision-detection simulation

我正在尝试编写一个从固定的垂直和水平墙壁反弹的球的2D模拟。模拟与墙壁的碰撞非常简单 - 只是否定垂直墙的X速度或水平墙的Y速度。问题是球也可能与墙角碰撞,水平墙与垂直墙相交。我已经想出了如何检测与角落发生碰撞的时间。我的问题是球应该如何应对这种碰撞 - 也就是说,它的X和Y速度将如何发生变化。

以下列出了我已经知道或知道如何找到的内容:

  • 检测到碰撞时框架中心的X和Y坐标
  • 球速度的X和Y分量
  • 角落的X和Y坐标
  • 球的中心与角落之间的角度
  • 碰撞前球正在行进的角度
  • 检测到碰撞时球与角重叠的数量

我猜最好假装角落是一个无限小的圆圈,所以我可以对待球和那个圆圈之间的碰撞,好像球正在碰撞一个与圆圈相切的墙壁。碰撞点。在我看来,我需要做的就是旋转坐标系以与这个假想的墙对齐,在此系统下反转球的速度的X分量,并将坐标旋转回原始系统。问题是我不知道如何编程。

顺便说一句,这是一个理想的模拟。我没有考虑摩擦或球的旋转等因素。我正在使用Objective-C,但我真的只是喜欢一般算法或一些建议。

2 个答案:

答案 0 :(得分:4)

正如您所说,您可以将角落视为具有无限小半径的圆圈。在这种情况下,碰撞平面的法线由从接触点到球心的单位矢量给出:

float nx = ballX - cornerX;
float ny = ballY - cornerY;
const float length = sqrt(nx * nx + ny * ny);
nx /= length;
ny /= length;

反映你执行此操作的速度矢量:

const float projection = velocityX * nx + velocityY * ny;
velocityX = velocityX - 2 * projection * nx;
velocityY = velocityY - 2 * projection * ny;

答案 1 :(得分:2)

如果它是一个尖锐的直角角落,它将充当retrorefector并沿着它进入的路径反弹回来。 (我的意思是没有任何圆角)