《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
应用:
一维碰撞:
点这里 显示/隐藏 媒体
优化代码:
碰撞前先求出总速度
var vxTotal:Number = ball0.vx - ball1.vx;
(但其实这里是在ball1的观点上看ball0的速度,比如ball0 速度为40 ,ball1 速度为50 ,40-50 = -10 ,正好是在ball1看到ball0的速度)
碰撞后
ball1.vx = vxTotal + ball0.vx;
难以理解的优化。。作者没细解释为什么总速度也守恒了????但他是正确的
未完待续。。。。
质量(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](http://www.nshen.net/blog/styles/default/images/icon_media.gif)
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;
}
}
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;
}
}
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;
}
}
未完待续。。。。