我们都希望技术性的书籍,可以潜入深,由简单到复杂。本章内容的复杂度达到了顶点。
并不是说接下来的章节会越来越容易,但是希望大家在学习本章内容时不要偷工减料。我会
带大家一步步地学习本章的概念,如果到现在为止大家都能很好地跟上我的步伐,那就再好
不过了。
及如何在 ActionScript 中应用动量。
我们很快会看到一些不同大小的桌球相互碰撞的例子。
二维坐标上,比如上一章的坐标旋转。本质上讲,就是将二维场景旋转成一个平面。最后就
可以忽略一个轴,而只对一维场景进行操作。这些都让读者很期待接下来的内容。让我们从
质量与动量开始吧。
质量
弹性以及重力。而我成功的避开了物体的质量问题。现在我们要重新讨论这个问题,严格来
讲,书中有几个地方都要在方程中加入质量。我通常只关心让物体正确地运动看起来,注重
于制作出正确的效果。最重要的是执行结果必需有很高的效率,不能让程序毁掉 Flash。
不直接面对它。
什么是质量呢?在地球上,我们通常认为质量就是物体的重量。它们之间确实关系密切,因
为重量与质量是成比例的。物体的质量越大,重量就越大。事实上,对于质量和重量我们使
用同样的测量单位:千克,磅等等。严格来说,质量是物体所承受速度大小的测量单位。
或改变方向)。
质量也与加速度和力有关。物体质量越大,给它加速度的力就越大。我的 Chevy Cavalier [注:
一款轿车的名字] 引擎可产生足够的力给小轿车作为加速度。
加速度来说是远远不够的。因为卡车的质量比较大,引擎需要更多的力。
动量
母 p 表示,质量用 m 表示,速度用 v 表示。下面这个公式应该无需解释了:
时 20 迈的速度运动就足以至人于死地。此外,子弹的质量非常轻,但是速度非常快,同样
也是致命的。
速度的向量是相同的。为了完整地描述动量,我们可以说:
动量守恒
里?如何守恒?OK,慢慢来。动量守恒可在碰撞中使用。碰撞检测一章中的碰撞反应都是仿
造出来的。而动量守恒才是碰撞反应的实际原理。
物体以 B 速度运动。碰撞之后,该物体以 C 速度运动,另一个物体以 D 速度运动。”,
分解来看,我们知道速度 v 是由速度和方向构成的,如果在碰撞之前知道了两个物体的速
度和方向,就可以求出两物体碰撞后的速度和方向。非常实用的定理,大家也是这样认为的
吧。
量,速度和方向,就可以求出碰撞后物体的运动方向和速度了。
们:在系统中,碰撞前的动量总合与碰撞后的动量总合相等。那么定理中所谓的系统是指什
么呢?它是指一个拥有动量的物体的集合。多数情况下,是指一个封闭系统,也就是不受其
它外力影响的系统。换句话讲,也就是可以忽略除实际碰撞以外的一切。对于我们而言,只
关注两个物体之的反作用力, 系统总是以物体 A 和物体 B 这样的形式出现。
就是由系统中所有物体的动量结合而成。 按照这个例子来讲,就是把物体 A 和物体 B 的动
量相加到在一起。 因此,碰撞前将动量之和,与碰撞后动量之和相同的。大家也许会问,
太好了,但是定理没有告诉我们怎么求得的动力啊。”。不要急,马上来说这个问题,说好
了,要一步步来。下面几段,要慢慢来看,因为会有公式!
家要集中看好下面几个公式的概念。 “一个数加上另一个数等于另一个数加上这个数。
这是有意义的。”。
对于两个物体——物体 0 和 物体 1——我们会得出 [ momentum :动量 ]:
或者:
解一个有两个未知数的方程需要找出另一个有两个相同未知数的方程。
一个方程,这就是动能公式。我们不需要关心动能是什么,只需要借这个公式来解决我们的
问题,用完后再还回去。动能公式如下:
大小,并不涉及方向。
或者:
(2是平方- -||)
为每个未知数求出一个等式。接下来就是代数问题了,为了让你我都不感到头痛,直接给出
最终的公式。如果您喜欢求代数式,或者想在学校拿到更高的学分的话,我建议您坐下来拿
几张纸几支笔自己算一算。那么计算出的结果应该是这样的:
v0Final = ----------------------------------------------
v1Final = ---------------------------------------------
现在大家知道为什么我一开始说这章非常之复杂了吧。
下面先在单轴上进行应用,随后制作两个轴上的运动时会加入坐标旋转。继续!
单轴上的动量守恒
加入质量(mass)这个属性。新的代码如下(Ball.as):
package {
}
运动。因此影片开始时基本的设置如图 11-1 所示。
图 11-1 单轴动量守恒运动的舞台设置
距离碰撞检测:
package {
}
}
就是物体 1,运用下面这个公式:
v0Final = ----------------------------------------------
在 ActionScript 中就变成了下面这段代码:
var vx0Final:Number = ((ball0.mass - ball1.mass) * ball0.vx +
2 * ball1.mass * ball1.vx) /
(ball0.mass + ball1.mass);
不难理解吧。那么 ball1 也是如此:
v1Final = ---------------------------------------------
代码如下:
var vx1Final:Number = ((ball1.mass - ball0.mass) * ball1.vx +
2 * ball0.mass * ball0.vx) /
(ball0.mass + ball1.mass);
private function onEnterFrame(event:Event):void {
}
时变量保存起来,而不是直接将它们赋值给 ball0.vx 和 ball1.vx。
设置物体位置
它们加到小球的位置上。这是个新内容,为什么要这么做?回忆一下,在前面的反弹例子中,
需要重置影片的位置,为的是不让它进入到墙体内。当物体与墙面接触时就对它进行移动。
这里也是如此,但是这次有两样东西需要移动,因为不想让它们彼此相互吸引。这样一看就
是错的,而且通常都会使两个物体永远地粘在一起。
都会使物体像跳到新位置上一样不自然,尤其是在运动速度很慢的情况下。
有。在第一个例子中用的是简单的解决方法只要加上新速度,就可以让两个物体分开。我认
为这是最真实也是最简单的方法——只要两句代码就能完成。随后,在“解决潜在问题”一
节中,我会给大家介绍一个更加健全的解决方法。
小。注意,ball 的大小不会对反作用力有什么影响。多数情况下,物体体积越大,则质量
就越大,可以根据两个小球的相对大小给出真实的质量。通常,我在给出质量时都是在试数,
看上去合适就可以。严格来说应该是“小球的体积扩大两倍,则质量也要扩大两倍”。
代码优化
同的等式出现了两次,如果可以减少一个就好了。OK,没有问题。
设系统中有两辆车在高速路上。其中一辆车的速度是 50 mph 另一辆车的速度是 60 mph。
坐在随便一辆车中,可以看到另一辆车是以 10 mph 或 -10 mph 的速度前进。换句话讲,
另一辆车不是在你前,就是在你后面。
var vxTotal:Number = ball0.vx - ball1.vx;
有些违反直觉,没关系试验一下:
成任何影响。 所以,又可以把两个临时变量去掉了。以下是修正后的 onEnterFrame 方法(见
文档类 Billiard2.as):
private function onEnterFrame(event:Event):void {
}
就我个人而言,在我要使用这个公式时,都会翻到第一个版本的例子中,直接复制!
两个轴上的动量守恒
用型的。只需要把两个物体的质量和速度插入公式中,就可以得到结果。
我们来看看原因。
理解原理及策略
图 11-2 一维碰撞
就是向量。回忆一下,速度向量指针表示运动的方向,长度表示速度的大小。
们的量值(长度)。现在,请看图 11-3,小球在二维空间中的碰撞。
图 11-3 二维碰撞
错误的结果。那么应该如何解决呢?
的角度并且旋转整个场景——坐标和速度——逆时针旋转。例如,如果角度是 30 度,就将
所有的物体旋转 -30 度,这与第十章的斜面反弹是一样的。结果如图 11-4 所示。
图 11-4 旋转后的二维碰撞
度的一部分——速度的一部分要依赖于角度。
严格地依照碰撞的角度来定。
图 11-5 加入 x,y 速度
图 11-6 只关心 x 速度
注意解题的步骤!)
11-7 所示。
图 11-7 新的 x 速度,y 速度不变,得出新的速度
图 11-8 将一切旋转回来