老實說……看書的喫力程度……令我想起了那年被普物虐的恐怖……但是更恐怖的是,其實我知道這些本不應該很難理解的……
所以,怎麼說呢,自強吧~
兩個無轉動的碰撞的計算
可以抽象爲如下問題:
兩個物體質量分別爲 m1、m2,速度分別爲 v1、v2,碰撞的法線爲 n(以v1爲參照),碰撞時損失的動量的百分比爲 r,需要求碰撞後的速度。
計算方法:
- 在 n 垂直的方向上,速度不變,只計算 n 方向上的速度變化;
- 用質心繫去理解和計算 n 方向上的速度變化。
技巧:
- 在存儲物體質量的時候,採用質量的倒數:1/m1、1/m2,從而既涵蓋infinity的情形,也方便了上邊的計算。
轉動的計算
部分原理
- 慣性張量
三維空間中的單個粒子,可以用一個3x3的矩陣來描述他的慣性張量:
通過恰當的指配相關參數,可以模擬普通剛體旋轉
2. 氣動張量
對於被風速影響的物體,如帆船和機翼等,可以用氣動張量來模擬,爲了達到最好的效果,可以在風速達到最大最小的時候分別設定,然後對實際風速進行插值。
3. 對浮力而言,可以將物體分塊並分別計算浮力,來模擬帆船傾覆等情形。
碰撞
範圍檢測
- 球形包圍盒
父親包圍所有孩子;孩子分屬於左還是右取決於在哪邊時對於球體的半徑增長最小 - 多分辨率網格
碰撞檢測
- 不規則的物體可以通過適當的分割,用一系列規則幾何體(長方體和球體)來模擬
- 球、長方體之間的碰撞,根據點、邊、面的接觸,會有多種情況:
- 分別計算最深交點、法線
- 每幀中只處理一個相交,將其加入相交集中;如果物體是運動的,那麼其後的幀中很可能不再失效;這裏可以只存儲碰撞的信息,不必存儲物體的信息
碰撞處理
- 步驟如下:
- 計算碰撞處的各種局部座標系,方便後邊使用
- 計算碰撞點處每單位衝量的速度變化值,注意線性運動和角運動都要考慮
- 根據上邊的值,計算碰撞處的速度變化
- 計算其相應的衝量的變化
- 將衝量變化轉變爲線性速度和角速度的變化
- 每單位衝量的速度變化值:
- 線性分量:質量的倒數
- 旋轉分量:力方向(碰撞法線)和到碰撞點到質心距離的叉積的倒數
- 以上二者的和
- 相交處的分離
- 如果直接法線方向,線性平移兩個物體,直至他們分離(需要計算之前走這麼遠所用的時間),那麼對於側面而來的物體,會有顯得在表面“擦”過了一段距離。
- 可以加入旋轉分離,雖然不能完全模擬真實情況,但是已經很好了
- 鬆弛法
- 每次處理一小部分內容,多次處理,使結果趨於平衡
- 防止旋轉過大
- 物體小而速度快時,可能導致無論怎麼旋轉都不能分離;物體還有另一點即將碰撞時,旋轉可能導致另一個碰撞
- 可以簡單地規定最大的旋轉距離,超出的部分轉移到線性運動上,不過建議可以根據對象尺寸來定,小物體可能需要比較大的上限
靜態接觸
- 反作用力:在作用力中加上反作用力
- 微碰撞:施加一系列較小的衝量
- 移除源自前次更新操作中的、基於加速度的速度數據
- 對於低速碰撞,降低其回彈係數
- 選擇性的忽略重力
- 摩擦力
- 可以使用上述微碰撞的方法
- 包含旋轉和平移
穩定性和優化
- 四元數漂移
- 誤差導致四元數不再是標準化的:應當適時地進行標準化
- 斜面上的相交
- 不停地相交和分離導致斜面上的物體往下移動:計算加速度引起的速度變化時,將這部分在法線方向上的分量置爲0
- 每幀計算的誤差:
- 計算每幀速度實際上是把每幀都當做勻速來看待了,當加速度較大時與實際不符,此時可以採用 距離-加速度 式
- 當每幀之間的加速度也變化很大時,例如彈簧,可以用Runga-Kutta積分
- 休眠
- 相交時,設置閾值,來處理誤差情況
- 根據碰撞情況可以設置分組