來源:http://www.vbgamedev.com/OTHER/pz.htm
動力學模擬基礎—細長桿
BY:張皓(ZH1110)
動力學是以牛頓運動定律為基礎全面的研究物體的運動與作用與物體上的力的關系,其對象被理想化為質點和質點系,研究剛性、彈性碰撞,當然也包括變形的固體和流體。借助與計算機可模擬各種真實的運動,如飛機在天空受空氣阻力及慣性作用下的飛行姿勢,篩子落到桌面后的滾動等均可用其模擬,對于現代游戲開發具有一定意義。
本章介紹了動力學中剛性運動的模擬過程,碰撞采用離散碰撞檢測算法。
首先我們研究細長桿的運動,查物理用表或積分得到細長桿運動時慣性量度,當我們已知剛體受的力矩(或外力)就可通過其求解出運動規律。
細長桿在未受任何外力的情況下屬于平面運動(可以看作是在宇宙空間中),其任意點角度位置是相對于重心的單值連續函數,具此可求出所有離散點上細長桿兩端點位置:
D3DXVec3Add l.p, l.p, l.V '平動的位置
l.ang = l.ang - l.angv '轉動角度,這里我們假設順時針旋轉為正方向
l.ver1.x = l.p.x + Cos(l.ang) '第一個端點的位置(不妨設桿長為2)
l.ver1.y = l.p.y + Sin(l.ang)
l.ver2.x = l.p.x - Cos(l.ang) '第二個端點的位置
l.ver2.y = l.p.y - Sin(l.ang)
細長桿剛體的動能包括平動的動能和轉動的動能,當其與其他物體發生碰撞后兩個動能都會發生改變,但總動能與動量是平衡的
如計算桿與地面碰撞,因地面的質量無限大,不吸收動能,碰撞后桿完全反彈,得到第一個式子:
1.
這個式子有兩個未知量,求解還須其他方程.
如圖,我們假設碰撞生產的力為F,作用時間為t,桿質量為M. 力F可分解為作用于重心力矩和對桿產生平移的力.

得到第二,第三個式子:
2.
3.
現在通過以上三個式子求解碰撞后的速度V'及角速度ω':
將2,3兩式削去Ft/M,合并得:
將ω'代入第一個方程,簡化方程...
最后,用求根公式解出我們所要的速度V',再用V'去求我們需要的其他兩個答案:

式中d為重心到撞擊力的垂直距離,可以通過兩個單位向量的點積求出,從中我們還可看到結果與物體的質量并無直接的關系。改變相應旋轉半徑數值,公式也可適用于非細長桿物體.
桿與桿之間的碰撞:
桿與桿之間的碰撞與上面類似,動能平衡方程應建立在兩個桿上,且因為作用力與反作用力的關系,受反作用力一方F取負值

建立方程組如下:

計算得到的V1'如下,代入另幾個方程計算出需要的其他答案

計算碰撞的精確位置

我們檢測到的狀態兩桿已經相交,但我們需要的是碰撞一剎那或即將發生碰撞的位置,這可通過二分法計算,對于任意狀態:
1.判斷如果已經相交則兩桿狀態向后T=T/2周期
2.判斷如果未相交則兩桿狀態向前T=T/2周期
3.計算誤差是否達到允許值,如果達到退出循環
4.轉到過程1
經過幾次的細分計算后誤差就基本達到我們的要求了
有待解決的問題:當一桿穿過另一桿即發生'刺穿'現象,程序未檢測到相交,產生錯誤的判斷,對于扁平的物體這個問題尤其突出,考慮使用連續算法進行輔助的計算。還有一個問題既當多個物體同時發生碰撞時不能很有效的處理。

盡管離散碰撞檢測算法存在一些問題,但由于其檢測過程的快速性能較好,所以仍是目前碰撞檢測算法研究的重點。
最后,如果有什么問題(本文包括代碼)可以告訴我(ZH1110)。