Language agnostic 求解球和矩形的交点
我有一个球和一个长方形。球可以移动,矩形是固定的(质量=无限) 球有位置、速度、半径和质量 矩形有位置、宽度和高度 我已经有了在碰撞时检测碰撞并计算正确响应的函数,但在计算正确响应之前,我遇到了解决交叉点的问题。 在图像中: 我使用Java 编辑:使用此算法求解:Language agnostic 求解球和矩形的交点,language-agnostic,physics,Language Agnostic,Physics,我有一个球和一个长方形。球可以移动,矩形是固定的(质量=无限) 球有位置、速度、半径和质量 矩形有位置、宽度和高度 我已经有了在碰撞时检测碰撞并计算正确响应的函数,但在计算正确响应之前,我遇到了解决交叉点的问题。 在图像中: 我使用Java 编辑:使用此算法求解: 计算矩形边界和球之间最近的点(我称之为P) (易于使用夹紧功能) 计算连接球中心点(我称之为C)和P的向量(我称之为n) (向量的分量是(P.x-C.x,P.y-C.y)) 计算交叉点的“长度”(我称之为偏移量) (球半径-n.长度
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
)后检查是否会发生碰撞,则可以确定碰撞的确切时间,这意味着球将在新方向上移动此迭代的剩余时间。是否类似?是的,类似,但解决方案对我不起作用。。我会做其他测试。我认为解决方案不起作用,因为链接中的球在矩形内。我的问题是球在外面!好吧,也许我误解了你的问题。谢谢你的回答,但我用另一种方式解决了我的问题。