5.4.1 牛頓第一運動定理的影響
由於自然界物體有保持原運動狀態的特性,當所受之作用力改變時,在改變 其運動狀態的同時必須考慮其原本之移動狀態的影響,而不是直接改變其運動狀 態。原運動狀態的速度向量不會消失,將與新的速度向量做結合,其結合的方式 為單純的向量相加:
其中 為該物體在指定時間點t的最後運動狀態, 為其原本之運動狀態。
是目前作用力在物體上造成的速度,其值可藉由牛頓第二運動定理推導而 出。
5.4.2 方法:慣性定律--與前移動的結合
在前一個小節中,我們為任兩個關聯的 VM 物件以它們的距離計算出彈簧 力的影響,但為了不讓移動狀態(anis)不斷的增加,我們限制一個參考關係只 能產生一個移動狀態,如果這個參考關係是第一次產生移動狀態,那就直接加入
anis。但如果同一個參考關係產生了第二個移動狀態,根據慣性定律,我們不能 捨去前一個移動狀態,我們必須將兩個移動狀態作結合,這個結合很簡單,就是 前一個小節的向量加法:
54
以速度向量表示,實際上這些向量可能是作用力在某個時間點作用在物體上 時的瞬間速度,也可能是已經消失的作用力所殘留的運動速度。我們在動畫之中 僅僅關注物體在上一個動畫頁面與下一個動畫頁面的位移量,因此上述的向量加 法中的速度皆是指作用力在每個動畫頁面產生的時間點上作用於物體的瞬間速 度,是作用力在上一個動畫頁面中的速度,加上下一個動畫頁面產生時由演算法 運算出的瞬間加速度而成。
5.4.3 牛頓第二運動定理的影響
如果我們將這個公式與虎克定理做結合,即:
F = ma = - kx
經過簡單的數學轉換,我們可以得到彈簧型長度變化為x 時,其受到來自彈 簧的加速度a 為:
a = - kx / m
由於加速度(a)為單位時間內的速度(v)變化量,我們可以得知在某個時間點 t 時,力對物體所產生的速度變化 v 等於加速度 a 乘以經過的時間 t。最後,我們 得出在某個時間點 t 時,彈力對物體所產生的速度變化 v 為:
55
float newL = computeDistance(vm->Position, infVM->Position);
//新長度與彈簧長度的差距決定力的大小 float dL = newL - _spring_length;
//牛頓第二運動定律,加速度依照F=kx=ma 的物理公式算出 float a = _spring_factor * dL / M;
5.4.5 牛頓第三運動定律的影響
作用力與反作用力定理在理解上較前面更抽像一點,沒有好的方法去用數學 算式表達。在此,我們僅針對 xDIVA 中的彈簧力系統裡的物件行為去作反作用
56
力的應用說明。
當 xDIVA 中一個物件發生移動造成彈簧的長度改變量為 x 時,這個物件使 彈簧產生了大小為 kx 的回復力,由於使用者拖拉的物件為固定端,我們視為這 個物體以 kx 大小的拉力去拉扯彈簧另一端的物件。
在這個情況發生的同時,依據反作用力定律,另一端的物件也以吸同大小的 力拉扯這個被移動的物件,由於被使用者拖拉的物件為固定端,因此我們僅僅看 見另一端的物件被彈簧改變了其運動狀態。但,如果使用者不再拖拉這個物件,
或者這個物件的移動非使用者拖拉所造成(簡而言之,其不為固定端),則它應 受到另一端同樣大小為 kx 的拉力,即兩端的物體互相拉扯,且拉扯的力度相同 方向相反。值得注意的是,以上說明的只是我們以兩個物件作用的觀點去探討作 用力與反作用力而可以得到的一個簡易的結果。
如果我們要更進一步的了解這個反作用力的來源,可以以彈簧的觀點來看,
彈簧兩端的物體互相拉扯其實可以視為彈簧的回復力欲將彈簧回復原本的長度 而拉扯兩端的物體,其中更加複雜的物理作用我們就不再討論,在這裡我們只關 心與物件的移動有關的作用。
5.4.6 方法:作用力與反作用力
在使用者啟動彈簧陳列後,我們就會打開 xDIVA 的動畫機制,開始運算
57
Layout 範圍內的 VM 物件與其關聯物件的距離和彈簧長度的差異,產生彈力。
在使用者啟動彈簧陳列的同時,系統會呼叫彈簧陳列的 doLayout 這個方法:(以 下程式碼為簡化過的版本,我們捨去了程式碼中不重要的瑣碎部分,請注意紅色 部分與註解)
程式碼 5-3 doLayout 方法
在這個方法中我們可以看到:在針對一個 vm 物件計算其造成的彈簧力(身 為施力者)後,我們會再加上因為牽引這個 vm 物件而產生的反作用力(身為受 力者)計算。