我有一个固定的矩形。当球碰到三角形的顶点时,我计算接触点(矩形顶点)的切线。然后我旋转速度向量以与切线重合,翻转速度的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),并验证球是否向上和向左移动。
如果这些工作如预期,那么选择一个你希望以正常方式表现的轨迹,例如从上方和左侧接近,然后几乎笔直地向上反弹,但稍微向左反弹,然后通过你的代码运行它,但打印出碰撞中的所有值,并告诉我们它们是什么。这至少是c1x
、c1y
、angle
,以及每次旋转开始和之后的velocity
的值。你可能会注意到哪里出了问题,如果你不注意,我们会的。