2024年2月29日 星期四

2.1 Forces and Newton’s Laws of Motion

根據牛頓的運動定律,力的定義是

力是會導致有質量的物體加速的向量

既然談到力,就一定要知道牛頓的三大運動定律。

Newton's First Law

牛頓第一運動定律說的是:

靜者恆靜;動者恆動

以上的敘述並沒有提到力所扮演的角色,更詳細包含力所扮演角色的敘述是:

物體不受力或合力為零時,靜者恆靜;動者恆做等速直線運動

也就是說,物體如果沒有受到力的作用,或者作用在身上的力都互相抵銷了,那它的速度和運動方向就不會改變。從這裡可以看出來,根據第一運動定律,物體有維持原運動狀態的傾向,所以第一運動定律又叫「慣性定律」。

根據第一運動定律,在模擬的時候,如果作用在物體的合力為零,那物體的速度向量就會維持不變。換句話說,除非是在合力不為零的情況下,否則Mover類別的update()方法中,是不應該用任何數學運算來改變velocity這個向量的。

Newton's Third Law

接下來,先來看第三運動定律,然後再回過頭來看第二運動定律。

第三運動定律通常是這麼說的:

對於每一個作用力,都會有一個大小相同方向相反的反作用力

根據第三運動定律,當你推一堵牆的時候,會有一股大小相同的反作用力作用在你身上。不過,這並不是說這堵牆因為不爽被你推,所以主動回擊,也推你一把。第三運動定律真正的意思是,當你出力推那堵牆時,你的力量包含了作用力及反作用力這兩股成對的力量。

由於第三運動定律原先的敘述容易引起誤解,下面的敘述方式應該會比較好:

作用力和反作用力總是成雙成對的出現,它們的大小相同,但方向相反。

看到「大小相同方向相反」,可別以為成對出現的力會互相抵銷,導致合力為零。這裡要注意的是,作用力和反作用力,它們的作用對象不同,所以不會互相抵銷。當你推牆的時候,一股力是作用在牆上,另一股力則是作用在你身上。

雖然作用力和反作用力大小相等,但這並不代表它們對兩個物體在運動方面的影響是一樣的。例如,把一顆球丟向牆壁。雖然作用在牆壁和球的力量相等,但牆壁不動如山,而球則反彈回來。作用力和反作用力究竟會對物體的運動造成怎樣的影響,還得考慮物體的質量、摩擦力等等其他的因素才能知道。

使用pygame來寫模擬程式時,牛頓第三定律可以改成這樣敘述:

假設f是pygame.Vector2物件,當計算物體A作用在物體B的力量f時,必須同時考慮物體B作用在物體A的力量-f。

一個簡單的例子就是模擬兩個物體間的萬有引力,這時候必須處理大小相同方向相反,分別作用在這兩個物體上的力。不過,畢竟我們只是利用自然界的物理定律來建造虛擬的世界,不是真的要鉅細靡遺精準地重現真實世界,所以有時候我們並不會去管反作用力的部分。例如,當我們在模擬環境中的風時,就不會去管當風吹在物體上時,施加在空氣上的反作用力,畢竟我們要模擬的是風對環境中物體所造成的影響,而不是去模擬環境中的空氣。

Newton's Second Law 

牛頓第二運動定律說的是:

力等於質量乘上加速度

寫成數學式就是

$\vec{F}=m\vec{a}$

其中$\vec{F}$是力;$m$是物體的質量;$\vec{a}$是加速度。

從牛頓第二運動定律的數學式可以看出來,加速度和作用力成正比,而和物體的質量成反比。所以,如果你去推一顆籃球,用的力量越大,球滾動的速度會越快;如果你用相同的力量去推一顆比籃球重得多的鉛球,那鉛球的滾動速度將會比籃球慢。

Weight vs. Mass

  • 質量(mass) 是用來衡量物體含有多少物質的量,單位是公斤(kg)。
  • 重量(weight) 是重量作用在物體上的力量。由牛頓第二運動定律,物體的重量等於物體的質量乘上重力加速度($w=mg$)。重量是力,單位是牛頓(N)。
  • 密度(density) 的定義是,單位體積含有多少質量。例如,每立方厘米有幾克。

一個物體的質量不會因地點不同而不同,但在不同的地點,重量可能會不一樣。例如,具一公斤質量的物體,不管是在地球還是月球,質量都是一公斤;但是在月球上,這個物體的重量,卻只有在地球時的六分之一。

前面提到質量在真實世界中的定義,那在模擬的世界中,質量又是什麼呢?我們由比較簡單的狀況談起,先假設在模擬的世界中,所有物體的質量都是1。所以,由牛頓第二運動定律 $$ \vec{a}=\frac{\vec{F}}{m} = \frac{\vec{F}}{1} = \vec{F} $$ 也就是說,在我們的模擬世界中,物體的加速度和施加於其上的力是相等的。

在第一章中,我們知道了物體的加速度、速度、位置間的關係,也就是

velocity += acceleration 
position += velocity

現在再加上作用力和加速度間的關係,也就是

acceleration = force

所以,在模擬的世界中,力才是一切的源頭。

既然物體的加速度和施加於其上的力是相等的,我們可以在Mover這個類別加入一個apply_force()方法,用來施加力量給物件。例如

mover.apply_force(wind)
mover.apply_force(gravity)

這裡的wind和gravity都是pygame.Vector2物件。這個施加力量給物件的方法,實作如下:

def apply_force(self, force):
    self.acceleration = force

這樣子所實作出來的apply_force(),看起來挺不賴的,但仔細想想,卻會有個大問題。假設現在有wind和gravity兩股力量作用在mover這個Mover類別的物件上,程式很自然會這樣寫

mover.apply_force(wind)
mover.apply_force(gravity)
mover.update()
mover.show()

前兩二行程式所做的事情,就相當於是

mover.acceleration = wind
mover.acceleration = gravity

所以,我們原本是希望wind和gravity都作用在mover上,但最後卻只有gravity作用在mover上。一開始wind是有作用的,但後來被gravity給取代掉了。顯然這樣子的寫法,是沒辦法處理有許多個力同時作用的情況。那該怎麼寫呢?下一節見分曉。

沒有留言:

張貼留言

4.9 Image Textures and Additive Blending

粒子系統可以用來製作視覺特效(visual effect, VFX),而怎麼呈現粒子的外觀,以及粒子具有怎樣的紋理(texture),都會影響特效所展現出來的效果。例如在下圖中,可以很清楚地看到,使用兩種不同的粒子紋理所呈現出來的特效效果,就有很大的不同。 要賦予粒子不同的紋理...