如何实现符合物理定律的碰撞及弹开

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;

加入以上动量守恒的代码后,小球的碰撞及弹开效果就会非常的逼真


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值