我有一个固定的矩形。当球击中三角形的顶点时,我计算接触点(矩形顶点)的切线。然后我旋转速度矢量以与切线重合,翻转速度的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;
}
但是这段代码不起作用。当球撞到角落时,它会卡住,沿着顶部边缘移动然后脱落,而不会弹回。我做得对吗?
答案 0 :(得分:0)
对您的惯例做出一些猜测,我建议:
double angle=Math.atan2(-c1x,-c1y);
如果这不起作用,我们可以做一些实验来弄清楚究竟发生了什么。
修改
好吧,我们必须从更简单的解决方案中建立起来。试试这些实验:
1)将速度设置为(0,1)并确认球在碰撞后直线向上移动。
2)将速度设置为(-1,1)并确认球向上和向左移动。
如果这些按预期工作,那么选择一个你希望以正常方式表现的轨迹,例如从上方到左方接近,然后几乎直线向上但向左稍微反弹,然后通过你的代码运行< em>但打印出碰撞中的所有值并告诉我们它们是什么。最初和每次轮换后至少c1x
,c1y
,angle
以及velocity
的值。您可能会注意到事情变得棘手,如果你不喜欢我们会的。