解决球与矩形之间的交叉

时间:2013-04-19 13:45:54

标签: language-agnostic physics

我有一个球和一个矩形。球可以移动,矩形是固定的(质量=无限)。

球具有位置,速度,半径,质量。

矩形具有位置,宽度和高度。

我已经有碰撞时检测碰撞并计算正确响应的函数,但是在计算正确响应之前我有问题要解决交点。 在图像中:

http://i.stack.imgur.com/Xq5Vk.png

我使用Java。

编辑:使用此算法解决:

  1. 计算矩形边界和球之间的最近点(我称之为P) (使用Clamp功能很容易)
  2. 计算连接球中心点(我称之为C)和P的向量(我称之为n) (向量的分量是(P.x - C.x,P.y - C.y))
  3. 计算交叉点的“长度”(我称之为偏移量) (ball.radius - n.length)
  4. 规范化n并乘以偏移量。
  5. 将n减去球位置矢量。
  6. 在Java代码中:

        private void resolveIntersectionWith(Ball ball){
            double closestX = clamp(ball.position.x, left(), right());
            double closestY = clamp(ball.position.y, top(), bottom());
    
            Vector n = new Vector(closestX - ball.position.x, closestY - ball.position.y);
            double offset = ball.radius - n.length;
            n.normalize().multiply(offset);
            ball.position.subtract(n);
        }
    

2 个答案:

答案 0 :(得分:0)

为了避免这些交叉点,你应该将球移向远离rektangle的地方,直到它不再被击中为止。

这样做的一个简单方法是计算最靠近球心P的球场中的点Q.然后将球从这一点移开

P=P+(P-Q)*(r/abs(P-Q)-1) 

其中r是半径。 另外,您可以使用较小的时间步长来避免交叉

编辑:Missclick

答案 1 :(得分:0)

问题可能是由于您检测到碰撞的原因造成的。我假设您检查球是否在矩形边界内或之内。在这种情况下,您已经将位置更新为矩形。但是,如果在将速度添加到其位置(x += v * dt)后检查是否会发生碰撞,您将能够确定碰撞的确切时间,这意味着球将移动剩余的时间。这个迭代在新的方向。