Language agnostic 求解球和矩形的交点

Language agnostic 求解球和矩形的交点,language-agnostic,physics,Language Agnostic,Physics,我有一个球和一个长方形。球可以移动,矩形是固定的(质量=无限) 球有位置、速度、半径和质量 矩形有位置、宽度和高度 我已经有了在碰撞时检测碰撞并计算正确响应的函数,但在计算正确响应之前,我遇到了解决交叉点的问题。 在图像中: 我使用Java 编辑:使用此算法求解: 计算矩形边界和球之间最近的点(我称之为P) (易于使用夹紧功能) 计算连接球中心点(我称之为C)和P的向量(我称之为n) (向量的分量是(P.x-C.x,P.y-C.y)) 计算交叉点的“长度”(我称之为偏移量) (球半径-n.长度

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

球有位置、速度、半径和质量

矩形有位置、宽度和高度

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

我使用Java

编辑:使用此算法求解:

  • 计算矩形边界和球之间最近的点(我称之为P) (易于使用夹紧功能)
  • 计算连接球中心点(我称之为C)和P的向量(我称之为n) (向量的分量是(P.x-C.x,P.y-C.y))
  • 计算交叉点的“长度”(我称之为偏移量) (球半径-n.长度)
  • 标准化n并乘以偏移量
  • 将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);
        }
    

    为了避免这些交叉点,你应该将球移离转角,直到它不再被击中为止

    一个简单的方法是计算最靠近球中心p的角点Q。然后将球从该点移开,如图所示

    P=P+(P-Q)*(r/abs(P-Q)-1) 
    
    其中r是半径。 或者,您可以使用较小的时间步长来避免交叉


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

    是否类似?是的,类似,但解决方案对我不起作用。。我会做其他测试。我认为解决方案不起作用,因为链接中的球在矩形内。我的问题是球在外面!好吧,也许我误解了你的问题。谢谢你的回答,但我用另一种方式解决了我的问题。