0

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

球有一个位置、一个速度、一个半径、一个质量。

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

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

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

我使用Java。

编辑:通过使用此算法解决:

  1. 计算矩形边界和球之间的最近点(我称之为 P)(用 Clamp 函数很容易做到)
  2. 计算连接球中心点(我称其为 C)和 P 的向量(我称其为 n)(向量的分量为 (Px - Cx, Py - Cy))
  3. 计算交叉点的“长度”(我称之为偏移量)(ball.radius - n.length)
  4. 归一化 n 并乘以偏移量。
  5. 将 n 减去球位置向量。

在 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);
    }
4

2 回答 2

0

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

于 2013-04-20T12:19:09.747 回答
0

为了避免这些交叉点,您应该将球移离rektangle,直到它不再被击中。

一个简单的方法是计算距离球中心 P 最近的 rektangle 中的点 Q。然后将球从该点移开

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

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

编辑:Missclick

于 2013-04-19T14:05:06.330 回答