球在矩形拐角处的碰撞响应



我有一个固定的矩形。当球碰到三角形的顶点时,我计算接触点(矩形顶点)的切线。然后我旋转速度向量以与切线重合,翻转速度的y值并将其旋转回来。这是我左上角的代码:

double c1x=rec.x-ball.getX();
double c1y=rec.y-ball.getY();
if(c1*c1+c2*c2<ball.getRadius()*ball.getRadius())
    {
        double angle=Math.atan2(-c1x,c1y); //angle made by tangent
        Vector2D v=ball.velocity.rotate(angle); //rotate velocity vector by 'angle'
        if(v.y<0.0f)     //ball is already moving away from corner
            return;
        v.setY(-v.y);    //flip y
        ball.velocity=v.rotate(-angle);   //rotate back
        return;
    }

但是这个代码不起作用。当球碰到角落时,它会被卡住,沿着上边缘移动,然后掉下来,而不会反弹回来。我做得对吗?

对您的约定进行一些猜测,我建议这样做:

double angle=Math.atan2(-c1x,-c1y);

如果这不起作用,我们可以做一些实验来弄清楚到底发生了什么

编辑:

好吧,我们必须从更简单的解决方案开始。试试这些实验:

1) 将速度设置为(0,1),并验证碰撞后球是否直线向上移动。

2) 将速度设置为(-1,1),并验证球是否向上和向左移动。

如果这些工作如预期,那么选择一个你希望以正常方式表现的轨迹,例如从上方和左侧接近,然后几乎笔直地向上反弹,但稍微向左反弹,然后通过你的代码运行它,但打印出碰撞中的所有值,并告诉我们它们是什么。这至少是c1xc1yangle,以及每次旋转开始和之后的velocity的值。你可能会注意到哪里出了问题,如果你不注意,我们会的。

最新更新