2D球与角落的碰撞

3
我正在尝试编写一个二维模拟程序,模拟一个球撞到固定的垂直和水平墙壁时反弹的情况。模拟与墙面碰撞很简单 - 对于垂直墙壁,只需取反X方向速度;对于水平墙壁,只需取反Y方向速度。问题在于,球还可以与墙角发生碰撞,即水平墙壁与垂直墙壁相交的位置。我已经想出了如何检测碰撞角的方法。我的问题是,球应该如何对这种碰撞做出反应 - 即其X和Y速度会发生怎样的变化。
以下是我已知或知道如何查找的内容:
- 碰撞被检测到时球心的X和Y坐标 - 球速的X和Y分量 - 角落的X和Y坐标 - 球心和角落之间的角度 - 碰撞发生前球的行进方向的角度 - 当检测到碰撞时,球与角落重叠的量
我猜最好假装角落是一个无限小的圆,这样我就可以将球与该圆的碰撞视为球与在碰撞点处切线于圆的墙壁相撞。我认为,我所需要做的就是将坐标系旋转到与这个想象中的墙壁对齐,然后在该系统下取反球的X分量,并将坐标旋转回原始系统。问题是,我不知道如何编写此程序。
顺便说一句,这是一个理想的模拟。我没有考虑摩擦力或球的旋转等任何因素。我使用Objective-C,但我真的只想要一个通用算法或一些建议。
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;

2

如果是一个锐利的(没有任何圆角)直角,它将会作为反射器,将光线沿着原路反弹回来。


但前提是球的运动轨迹必须完美地穿过角落。如果稍微偏离,球与角落之间的切线就不垂直于运动轨迹,从而导致球偏向一侧。 - Basuro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接