var angle=Math.atan2(dY,dX);
var sine=Math.sin(angle);
var cosine=Math.cos(angle);
var x=0;
var y=0;
var xB=dX*cosine+dY*sine;
var yB=dY*cosine-dX*sine;
var vX=ball.vX*cosine+ball.vY*sine;
var vY=ball.vY*cosine-ball.vX*sine;
var vXb=ballB.vX*cosine+ballB.vY*sine;
var vYb=ballB.vY*cosine-ballB.vX*sine;
这四个公式完成了把两个圆的位置和速度进行旋转的工作,这些公式解释起来很费事,而且或许效果也不是很明显.
所以大家搞不清楚的话,可以先暂时记住他.
vX *=-1;
vXb *=-1;
xB=x+(ball.radius+ballB.radius);
碰撞后小球的速度改为反向运动,并且确保小球互相分离
ball.x=ball.x+(x*cosine-y*sine);
ball.y=ball.y+(y*cosine+x*sine);
ballB.x=ball.x+(xB*cosine-yB*sine);
ballB.y=ball.y+(yB*cosine+xB*sine);
ball.vX=vX*cosine-vY*sine;
ball.vY=vY*cosine+vX*sine;
ballB.vX=vXb*cosine-vYb*sine;
ballB.vY=vYb*cosine+vXb*sine;
最后加入小球原来所在的位置,并使用新的速度
基本的碰撞代码就算完成了,但是你会发现还有个问题:两个球无论大小,碰撞后弹回的速度都非常快,这并不符合实际的物理定律,所以为了优化这个碰撞效果,我们需要加入动量守恒的代码
var vTotal=vX-vXb;
vX=((ball.mass-ballB.mass)*vX+2*ballB.mass*vXb)/(ball.mass+ballB.mass);
vXb=vTotal+vX;
加入以上动量守恒的代码后,小球的碰撞及弹开效果就会非常的逼真