3

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

以下是我已经知道或知道如何找到的列表:

  • 检测到碰撞时的帧中球中心的 X 和 Y 坐标
  • 球速度的 X 和 Y 分量
  • 角点的 X 和 Y 坐标
  • 球心与角球的夹角
  • 球在碰撞前行进的角度
  • 检测到碰撞时球与角重叠的量

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

顺便说一句,这是一个理想的模拟。我没有考虑摩擦或球的旋转之类的东西。我正在使用 Objective-C,但我真的只是想要一个通用算法或一些建议。

4

2 回答 2

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;
于 2009-12-22T11:03:42.780 回答
2

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

于 2009-12-22T23:10:11.367 回答