本節書摘來異步社群《遊戲開發實體學(第2版)》一書中的第1章,第1.6節,作者: 【美】david m bourg , bryan bywalec 譯者: 崔力強 , 魏廣程 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
物體的屬性——品質(mass)、質心(center of mass)和轉動慣量(moment of inertia),總體來講被稱為品質特性(mass properties)——對于研究力學來說是至關重要的,因為物體的線性運動、角運動及物體對于給定外力的響應都是品質特性的函數。是以,為了準确模組化物體的運動,你需要知道或者有能力計算這些品質特性。讓我們先看幾個定義。
通常來講,人們認為品質是用來衡量一個物體中含有物質的多少。從研究力學的角度來講,也可以認為品質是用來衡量物體對于運動或者運動中的變化的阻力。是以物體的品質越大,就越難讓它動起來,或者說越難改變它的運動狀态。
在力學以外的術語中,質心(也被稱為重心(center of gravity))是物體上的一個點,該物體的品質均勻的分布在質心的周圍。在力學中,質心是這樣一個點,當任何的外力施加在該點上的時候,都不會引起該物體的轉動。
雖然大多數人熟悉品質(mass)和重心(center of gravity)這樣的術語,但是轉動慣量就沒有那麼熟悉了;然而在力學中,它們都是一樣重要的。一個物體的轉動慣量是當物體在一個坐标軸上的轉動的時候,用來衡量該物體品質的放射性分布名額。品質是物體對于線性運動的阻力[1],類比之下,可以認為轉動慣量是用來衡量物體對轉動的阻力的。
現在你已經知道這些屬性是什麼意思了,我們來看看如何計算它們。
對于由多部分組成的物體,總品質可以通過簡單地把每個部分的品質加起來得到。每個部分的品質可以通過密度乘以體積得到。假設該物體的密度是統一的,那麼該物體的總品質就可以簡單地用密度乘以物體的總體積得到。這個可以使用下面的方程表示:

在實踐中,你通常不需要做體積的積分來得到物體的品質,尤其是我們将要考慮的那些物體(例如汽車和飛機)的密度并不是均勻的。是以你可以把物體分解成為比較容易計算品質的部分,計算每個部分的品質,然後簡單地把每個部分的品質加起來,進而得到總品質。
物體重心的計算更複雜點。首先,把物體分為有限個基本的質塊,每個質塊的中心使用參考坐标系的軸來定位,使用mi來引用這些質塊。接下來取每個質塊的相對于參考坐标軸的一階距(first moment),再把它們加起來。一階距求解方法如下:先得到沿着某個給定的坐标軸從原點到質塊中心的距離,該距離與該質塊品質的乘積即為一階距。最後把所有質塊的一階距的和除以物體總品質,就可以得到該坐标軸上的物體質心的坐标。你必須對每個次元都做這樣的計算,也就是說,對2d做兩次計算,對3d做三次計算。下面是物體質心3d坐标的方程。
其中(x,y,z)c是物體質心的坐标,而(x,y,z)o是每個質塊的質心坐标。量xodm、yodm和zodm表示質塊品質dm關于坐标軸的一階距。
這裡,不用太擔心這些積分方程。在實踐中你隻需将有限的品質相加,方程看起來會友好很多,如下所示:
注意,你可以輕易地将這些方程中的品質替換為重量,因為重力加速度g會同時出現在分子和分母中,是以會從等式中消去。記住,物體的重量就是它的品質乘以重力加速度g,g在海平面為9.8 m/s2。
計算物體總品質和離散粒子系統重心的方程可以很友善地寫作向量符号形式如下:
其中mt是總品質,mi是每個系統中每個粒子的品質,cg是合并後的重心,而cgi是每個粒子在設計或參考坐标下的重心。注意cg和cgi是向量,因為它們表示笛卡爾坐标系中的位置。這樣做是為了友善你能夠一次處理x、y、和z(或者在二維中的x和y)。
在稍後的示例代碼中,讓我們假設組成物體的粒子由一種資料結構組成的數組表示,每個這種資料結構都包含對應點粒子的設計坐标和品質。這個資料結構同樣會包含稍後計算的粒子相對于組合後剛體質心的坐标。
這裡是示範如何計算總品質以及合并元素重心的代碼:
現在解出了合并後的重心位置,你就可以計算每個粒子的相對位置如下:
為了計算轉動慣量,你需要取組成物體的每個粒子對于每條坐标軸的二階矩。之後用所得二階矩乘以品質與距離平方的積。這個距離不是沿計算質心時的坐标軸到粒子中心的距離,而是從我們計算轉動慣量相對的坐标到粒子中心的垂直距離。
三維中的任意物體如圖1-2所示,當計算對于x軸的轉動慣量ixx時,距離rx将會在yz平面上,rx2=y2+z2。同樣的,對于關于y軸的轉動慣量 iyy,r y2 = y2 + z2,而對于關于z軸的轉動慣量izz,r z2 = y2 + z2。
三維中相對于坐标軸的轉動慣量方程為:
讓我們看一眼實際中矩的更通常的情況。假設給定物體對于穿過物體質心的中性軸(neutral axis)的轉動慣量為io,而你想知道對于平行與這個中性軸但有一定距離的另一個軸的轉動慣量i,你可以使用坐标變換,或者平行軸定理(parallel axis theorem)來确定對于這個新軸的轉動慣量。需要使用的公式如下:
其中m是物體的品質,而d是兩軸之間的垂直距離。
這裡有一個重要的實用觀測:新的轉動慣量是兩坐标軸分開距離平方的函數。這表明當io比較小而d比較大時,你可以安全地忽略io,因為md2項将占主導地位。當然,在這裡你需要盡力判斷。這個用于變換坐标軸的公式同時表明了物體的轉動慣量在相對于過物體重心的軸計算時最小。物體對于任何不通過物體質心的平行軸的轉動慣量将會增大md2。
在實踐中,除了對密度均勻的簡單形狀,計算轉動慣量都是一個很複雜費力的過程,是以我們通常會将物體對于一個過其質心的轉動慣量使用近似物體的基礎形狀的公式來進行近似求解。進一步,我們會将複雜物體分成小元件,并利用某些元件的io相對于其md2對于整個物體轉動慣量的可以忽略的特性簡化計算。
圖1-3到圖1-7展示了一些能夠輕松地計算轉動慣量的簡單幾何實體。在圖題中展示了這些簡單密度均勻的幾何體相對于三個坐标軸的轉動慣量公式。你可以輕易地在大學動力學教材中找到其他基礎幾何體的類似公式。
正如你所見到的,這些公式實作起來相對簡單。這裡用到的技巧就是将一個複雜物體分為一系列小而簡單的有代表性的幾何形,它們組合起來會近似于複雜物體的慣性屬性。這個聯系很大程度上是一種考慮期望精度水準的判斷。
讓我們通過一個簡單的2d示例來展示如何應用本節中讨論過的公式。假設你正在編寫一個自頂向下視圖的自動賽車遊戲,想在其中使用基于2d剛體動力學仿真汽車精靈。在遊戲最開始,玩家的汽車處于起跑線,加滿油并準備出發。在開始仿真之前,你需要計算初始狀态時車、司機和燃料載重的品質特性。在這個例子中,物體(body)由三部分組成:車、司機和滿載的燃料。之後在遊戲中,物體的品質會随着燃料燃燒和司機在車禍中被甩出去變化。現在,讓我們隻注意圖1-8所示的初始狀态。
示例中每個元件的屬性在表1-2中給出。注意,長延x軸測量,寬延y軸,高會向外伸出螢幕。同時注意每個元件中心坐标,即寫作(x,y)形式是在全局坐标系下書寫的。
我們需要計算的第一個品質特性是物體的品質。由于我們已經有了汽車和司機的重量,這個計算就很簡單了。餘下的燃料重量就是我們所謂唯一缺少重量分量。由于我們有了燃料的密度和油箱形狀,我們可以計算出油箱體積并乘以密度和重力加速度來得到油箱中燃料的重量。得出燃料為920.6n,如下:
重力加速度(acceleration due to gravity)是正在下落的物體向地面掉落時的加速度。一個物體的重量等于它的品質乘以重力加速度。符号g用于表示重力加速度,g在地球海平面高度的值大約是9.8 m/s2 。重量在公制系統中的機關是牛頓n。
現在,物體的總重量為:
為了得到物體的品質,你隻要簡單地将重量除以重力加速度。
我們需要的下一個品質特性是物體的重心位置。在這個示例中我們将會計算相對于全局坐标系原點的物體中心坐标。我們同樣會将一階矩公式應用兩次,一次對于x坐标,另一次對于y坐标:
注意,我們在這些公式中使用了重量而非品質。記住,由于重量中的重力加速度是個常量,并且同時出現在分子、分母中而被消去,是以我們可以這麼做。
現在到了計算物體轉動慣量的時候了。在這個2d示例中計算過程足夠簡單,因為我們隻有一個轉動軸指向紙張外,是以我們隻需要進行一次計算。第一步是計算每個元件相對于自己中性軸的局部轉動慣量。由于我們對于每個元件幾何形和品質分布資訊了解是有限的,我們将會進行一個簡化的近似,通過将每個元件表示為一個方柱體,是以可以應用圖1-5中相應的轉動慣量公式。在下列等式中,我們将會用小寫的w表示寬度,以便不與它的重量混淆,我們之前用大寫的w表示重量。
由于這些結果是每個元件關于它自己中性軸的轉動慣量,我們現在需要用平行軸定理将這些矩轉換成相對于過我們剛計算得出的物體重心的中性軸的轉動慣量。
為了進行這個計算,我們必須解出從物體重心到每個元件重心的距離。從每個元件重心到物體重心的距離平方為:
現在我們可以應用平行軸定理如下:
注意計算司機和燃料的icg時它們是如何被md2項所主導的。在這個例子中,司機和燃料的局部慣性相應的隻有它們各自md2的2.7%和2.1%。
最終我們通過将每個元件貢獻的icg相加得到物體對于自己中性軸的合轉動慣量如下:
表1-3展示了物體的品質特性,即車、司機和整箱燃料的總和。
清楚地了解這個例子中所展示的概念非常重要,因為當我們接下來過渡到更複雜的系統,尤其是3d中的一般運動時,這些計算隻會變得更加複雜。此外,我們需要仿真的物體運動是這些品質特性的函數,其中品質将會決定這些物體會如何被力所影響,質心将會用于追蹤位置,而轉動慣量将會用于決定在受到不過中心的力時物體如何轉動。
至此,我們已經看到了在3d空間中關于三條坐标軸的轉動慣量。
但是,在一般3d剛體動力學中,即使局部坐标軸通過物體質心,物體也可能繞任意軸轉動,而不是必須繞三條坐标軸之一。這種複雜性表示我們必須給物體的i添加一些項來處理一般轉動。我們将會在本章的後面解決這個問題,但是在此之前我們需要詳細地複習牛頓第二運動定律。