周筆記(12/52) - 過一下《遊戲物理引擎開發》的書。。。

老實說……看書的喫力程度……令我想起了那年被普物虐的恐怖……但是更恐怖的是,其實我知道這些本不應該很難理解的……
所以,怎麼說呢,自強吧~

兩個無轉動的碰撞的計算

可以抽象爲如下問題:

兩個物體質量分別爲 m1、m2,速度分別爲 v1、v2,碰撞的法線爲 n(以v1爲參照),碰撞時損失的動量的百分比爲 r,需要求碰撞後的速度。

計算方法:

  1. 在 n 垂直的方向上,速度不變,只計算 n 方向上的速度變化;
  2. 用質心繫去理解和計算 n 方向上的速度變化。

技巧:

  1. 在存儲物體質量的時候,採用質量的倒數:1/m1、1/m2,從而既涵蓋infinity的情形,也方便了上邊的計算。

轉動的計算

部分原理

  1. 慣性張量
    三維空間中的單個粒子,可以用一個3x3的矩陣來描述他的慣性張量:

I=IxIxyIxzIyxIyIyzIzxIzyIz(1)

通過恰當的指配相關參數,可以模擬普通剛體旋轉
2. 氣動張量
對於被風速影響的物體,如帆船和機翼等,可以用氣動張量來模擬,爲了達到最好的效果,可以在風速達到最大最小的時候分別設定,然後對實際風速進行插值。
3. 對浮力而言,可以將物體分塊並分別計算浮力,來模擬帆船傾覆等情形。

碰撞

範圍檢測

  1. 球形包圍盒
    父親包圍所有孩子;孩子分屬於左還是右取決於在哪邊時對於球體的半徑增長最小
  2. 多分辨率網格

碰撞檢測

  1. 不規則的物體可以通過適當的分割,用一系列規則幾何體(長方體和球體)來模擬
  2. 球、長方體之間的碰撞,根據點、邊、面的接觸,會有多種情況:
    • 分別計算最深交點、法線
    • 每幀中只處理一個相交,將其加入相交集中;如果物體是運動的,那麼其後的幀中很可能不再失效;這裏可以只存儲碰撞的信息,不必存儲物體的信息

碰撞處理

  1. 步驟如下:
    • 計算碰撞處的各種局部座標系,方便後邊使用
    • 計算碰撞點處每單位衝量的速度變化值,注意線性運動和角運動都要考慮
    • 根據上邊的值,計算碰撞處的速度變化
    • 計算其相應的衝量的變化
    • 將衝量變化轉變爲線性速度和角速度的變化
  2. 每單位衝量的速度變化值:
    • 線性分量:質量的倒數
    • 旋轉分量:力方向(碰撞法線)和到碰撞點到質心距離的叉積的倒數
    • 以上二者的和
  3. 相交處的分離
    • 如果直接法線方向,線性平移兩個物體,直至他們分離(需要計算之前走這麼遠所用的時間),那麼對於側面而來的物體,會有顯得在表面“擦”過了一段距離。
    • 可以加入旋轉分離,雖然不能完全模擬真實情況,但是已經很好了
    • 鬆弛法
      • 每次處理一小部分內容,多次處理,使結果趨於平衡
    • 防止旋轉過大
      • 物體小而速度快時,可能導致無論怎麼旋轉都不能分離;物體還有另一點即將碰撞時,旋轉可能導致另一個碰撞
      • 可以簡單地規定最大的旋轉距離,超出的部分轉移到線性運動上,不過建議可以根據對象尺寸來定,小物體可能需要比較大的上限

靜態接觸

  1. 反作用力:在作用力中加上反作用力
  2. 微碰撞:施加一系列較小的衝量
    • 移除源自前次更新操作中的、基於加速度的速度數據
    • 對於低速碰撞,降低其回彈係數
    • 選擇性的忽略重力
  3. 摩擦力
    • 可以使用上述微碰撞的方法
    • 包含旋轉和平移

穩定性和優化

  1. 四元數漂移
    • 誤差導致四元數不再是標準化的:應當適時地進行標準化
  2. 斜面上的相交
    • 不停地相交和分離導致斜面上的物體往下移動:計算加速度引起的速度變化時,將這部分在法線方向上的分量置爲0
  3. 每幀計算的誤差:
    • 計算每幀速度實際上是把每幀都當做勻速來看待了,當加速度較大時與實際不符,此時可以採用 距離-加速度 式
    • 當每幀之間的加速度也變化很大時,例如彈簧,可以用Runga-Kutta積分
  4. 休眠
  5. 相交時,設置閾值,來處理誤差情況
  6. 根據碰撞情況可以設置分組
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章