《making things move 》第十一章

《making things move 》第十一章
这章写一半,阅读计划暂停了。。。因为我要先看as3 cookbook了但我发誓会回来接着读的。。。

质量(m):[/b]通常认为质量就是物体的重量,已经很接近了,重量是质量的一个比例,质量越大,物体的重量越重

速度(v):以前一直研究的,就是有大小有方向的一个向量

动量 (p):p = m * v ,由于速度是个向量,所以动量也是一个向量,它的方向跟速度相同,
有公式可以看出,速度很大但质量很小的物体,跟速度很小但质量很大的物体动量是可以相等的,
就像一颗很小的子弹,与一辆速度很慢的卡车都足以让你致命一样

可以这样描述一个动量 : 5 kg * 20 m/s at 23 degrees

动量守恒定律:在closed system里,碰撞的物体,碰撞之前与碰撞之后动量之和相等

转化成公式就是:

momentum0 + momentum1 = momentum0Final + momentum1Final

由于p = m * v

公式变成了

(m0 * v0) + (m1 * v1) = (m0 * v0Final) + (m1 * v1Final)

通常两物体的质量和速度我们都知道,求的是碰撞之后两物体的速度 v0Final ,v1Final

上学时候学过。。。。两个未知数得需要两个方程

动能公式: KE = 0.5 * m * v2

另人开心的是,动能也守恒!

KE0 + KE1 = KE0Final + KE1Final

或者是

(0.5 * m0 * v02) + (0.5 * m1 * v12) =
(0.5 * m0 * v0Final2) + (.5 * m1 * v1Final2)

把0.5消掉

(m0 * v02) + (m1 * v12) = (m0 * v0Final2) + (m1 * v1Final2)

现在两个未知数,两个等式,解方程吧。。。,你不爱解就看下边公式

v0Final =

(m0 − m1) * v0 + 2 * m1 * v1
----------------------------------------------
m0 + m1

v1Final =

(m1 − m0) * v1 + 2 * m0 * v0
--------------------------------------------
m0 + m1


应用:

一维碰撞:

Media 点这里 显示/隐藏 媒体

ball0.vx = 1;
ball0.mass = 1;
ball1.vx = -1;
ball1.mass = 2;
function onEnterFrame ():Void
{
 ball0._x += ball0.vx;
 ball1._x += ball1.vx;
 var dist:Number = ball1._x - ball0._x;
 //半径碰撞检测法
 if(Math.abs(dist) < ball0._width / 2 + ball1._width / 2)
 {

//碰撞后速度公式
 var vx0Final:Number = ((ball0.mass - ball1.mass) *
 ball0.vx + 2 * ball1.mass *
 ball1.vx)
 / (ball0.mass + ball1.mass);
 var vx1Final:Number = ((ball1.mass - ball0.mass) *
 ball1.vx + 2 * ball0.mass *
 ball0.vx)
 / (ball0.mass + ball1.mass);
//得到速度付值给 ball 们

 ball0.vx = vx0Final;
 ball1.vx = vx1Final;
/*

注意这里是修正位置的一个手法,以前碰墙检测,如果碰到了要修正位置到小球应该到的位置

但两个小球碰撞就没办法这样做了,这个手法就欺骗一下观众,等于多运行了一帧让小球分开

*/
 ball0._x += ball0.vx;
 ball1._x += ball1.vx;
 }
}

优化代码:

碰撞前先求出总速度

var vxTotal:Number = ball0.vx - ball1.vx;
(但其实这里是在ball1的观点上看ball0的速度,比如ball0 速度为40 ,ball1 速度为50 ,40-50 = -10 ,正好是在ball1看到ball0的速度)

碰撞后

ball1.vx = vxTotal + ball0.vx;

难以理解的优化。。作者没细解释为什么总速度也守恒了????但他是正确的
ball0.vx = 2;
ball0.mass = 1;
ball1.vx = -1;
ball1.mass = 3;

onEnterFrame = function()
{
 ball0._x += ball0.vx;
 ball1._x += ball1.vx;
 var dist:Number = ball1._x - ball0._x;
 if(Math.abs(dist) < ball0._width / 2 + ball1._width / 2)
 {

 var vxTotal:Number = ball0.vx - ball1.vx;

 ball0.vx = ((ball0.mass - ball1.mass) *
 ball0.vx + 2 * ball1.mass * ball1.vx)
 / (ball0.mass + ball1.mass);

 ball1.vx = vxTotal + ball0.vx;

 ball0._x += ball0.vx;
 ball1._x += ball1.vx;
 }
}

未完待续。。。。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值