canvas动画包教不包会:撞球物理
- 质量
- 动量
- 动量守恒
F = m × a
p = m × v
公式1
(相对两个物体object0和object1):(m0 × v0) + (m1 × v1) = (m0 × v01) + (m1 × v11)
v11
分别是object0和object1碰撞后的速度,要求得这两个速度向量,我们还必须借助动能公式:EK = m × v^2 × 0.5
公式2
:(0.5 × m0 × v0^2) + (0.5 × m1 × v1^2) = (0.5 × m0 × v01^2) + (0.5 × m1 × v11^2)
公式1
和公式2
,我们可以得出:v01 = ((m0 - m1) × v0 + 2 × m1 × v1) ÷ (m0 + m1);
v11 = ((m1 - m0) × v1 + 2 × m0 × v0) ÷ (m0 + m1);
function Ball(x, y, radius) {
this.x = x;
this.y = y;
this.radius = radius;
this.angle = 0;
this.vx = 0;
this.vy = 0;
this.mass = 1;
};
ball0
和ball1
(忽略y轴)。我们已经知道计算碰撞后的速度公式,所以创建一个获取速度的方法getFinalSpeed()
,传入两个球对象作为参数。function getFinalSpeed(ballA,ballB){
var mass = ballA.mass + ballB.mass;
var vx01 = ((ballA.mass - ballB.mass) * ballA.vx + 2 * ballB.mass * ballB.vx) / mass;
var vx11 = ((ballB.mass - ballA.mass) * ballB.vx + 2 * ballA.mass * ballA.vx) / mass;
return {
vx01: vx01,
vx11: vx11
};
};
if(Math.abs(dist) < (ball0.radius + ball1.radius)) {
var vFinal = getFinalSpeed(ball0,ball1);
ball0.vx = vFinal.vx01;
ball1.vx = vFinal.vx11;
};
没有加入任何阻力,所以会一直碰撞下去。
3.2 双轴上的动量守恒
单轴上的动量守恒比较简单,因为两个速度向量都在x轴上,我们可以直接加减它们的值,但是双轴上的动量守恒就相对复杂了,先看下图: