Bullet 物理引擎 簡析
- 前提假設
計算機圖形學中的物理模擬實際上只是追求視覺近似,而並非精確的物理模擬
同時物理引擎從簡化計算考慮, 不與渲染引擎共享物件資料採用獨立的一套資料. - 1 架構分析
物理模擬的基礎是建立在一些核心幾何結構之上.
核心的幾何概念有
- 形狀 (shape) : shape 抽象出了幾何形狀的特徵, 比如長方體, 球, 四面體,凸包. bullet中的形狀型別非常豐富有幾十種之多. 由於幾何形狀的特徵是和具體物件無關的,所以一種形狀只要維持一個例項即可, 所有對映到該shape的物件可以共享這個例項.
- 包圍體層次(BVH) 這個的概念可以在書中查詢,一般有AABB, OBB, K-Dop, Convex Hull. Bullet 中採用的是AABB
- 空間劃分資料機構節點 bullet 採用AABB
- 空間劃分資料結構(通常是樹) Bullet 中採用的主要是Dynamic AABB Tree (剛體 , 值得注意的是這裡用得是曼哈頓距離) 和 Sweep and Prune (soft body)
- 碰撞檢測演算法(這裡也有很多選擇完全根據檢測物件來定,GJK ,sweep prune 是複雜的, box2box, shpere2shpere .... 比較簡單.
- 接觸點(contract point, manifold)
- 約束型別(bullet 提供了6種,見bullet 手冊)
- motion state 是對渲染引擎提供的一個介面, 便於渲染引擎更新渲染物件的位置
完 成幾何基礎構建後在一個場景(collision world)內 加入 各個被模擬的物理物件(collision object)每個物理物件被對映到對映的shape, 空間劃分資料結構節點. 如果再在這些物件身上附加例如速度,角速度,轉動慣量等物理特徵,就演化為rigid object. Soft body 情況複雜一些, 一般由mesh構成 尚在分析中.
物理模擬過程分為2個主要階段.
- Broad Phase: 首先進行遠距碰撞檢測, 利用空間分割結構,如果不在同一個子樹內的物體不可能相交不用去計算, 在同一個子樹內的物體被放入 overlapping pair, 再進一步由對應的演算法來計算出接觸點等資訊. 採用哪一種演算法取決於演算法配置矩陣(見bullet 手冊)
- Narrow Phase: 根據overlapping pairs 的分佈情況計算出碰撞物件島(collision Island).而後依次對各個島進行約束分析. 亦即碰撞響應. Bullet 採用的是Sequential Impulse ConstraintSolver(http://www.gphysics.com/archives/28 ) 約束分析是一個非常複雜的話題,涉及到PGS演算法的簡化,後文會有介紹. 約束分析會根據所設定的約束型別來計算碰撞後各個物件所對應的位置,速度等, 然後與渲染引擎同步motion state.
原創帖子, 轉載請註明出處,作者資訊.
這個是自己分析bullet的程式碼過程中的筆記,比較簡陋, 希望拋磚引玉, 歡迎板磚
作者: 馬良 (www.iphonephysics.com ) (此blog需Over GW)
//應朋友要求在最後附上書目
- 理論準備:本科的數學分析,理論力學,線性代數。 尤其是理論力學中的朗格朗日動力學部分
最好能回憶起來。 碰撞檢測上面列的兩本書的內容就足夠了,如果進一步挖掘需要看
計算幾何方面的書 - 補一個架構圖 引自[1]的12頁,其中的STC即為上次分析中的islandmanager
碰撞響應的分析
- 約束分類:可積約束,不可積約束 ,摩擦力(見[1]第四章)
- 整個bullet在動力學方面的核心就是btSequentialImpulseConstraintSolver 這個類及其實現
這個類名字可以翻譯為基於順序衝量處理方法的約束求解過程(這是個縮略的函式名不可直譯)。
這個名字的含義很重要,表示了這個求解方法是按照順序來處理約束以及接觸點,摩擦力,one by one
並且求解的結果是衝量的範數。整個的原理部分可以參照[1]的第4章節,[2]的第7章。 - btSequentialImpulseConstraintSolver 的全部重心在於solveGroupCacheFriendlySetup
負責對於三種約束進行計算準備(包括計算一些解方程要用到的常量以及中間變數等)和 solveGroupCacheFriendlyIterations 負責應用PGS[9]求解。
solveGroupCacheFriendlySetup 分析
- 首先是關於可積約束的計算準備:首先是遍歷約束陣列,每一個約束都需要計算自己的jacbian(關鍵概念參照[1]的第四章)
初始化一些常量和中間變數 這裡有些概念和公式比如慣性張量等都可以在[1],[8]中找到 - 關於接觸點約束的計算準備:這裡有個重要的函式convertContact, 把從碰撞檢測階段獲得的接觸點轉化為不可積約束並初始化常量和中間變數,
以及初始化摩擦力的相關資料,摩擦力計算參照[1]第4章第6節 其中引用的公式也來自[1] 但是考慮到實時性,並不完全一致。
solveGroupCacheFriendlyIterations 分析
- 分別根據[9]中的PGS演算法求解3類約束,重點是基於SIMD的優化,以及遞迴次數10的設定。
對於PGS的理解最好從Gauss-Sidel數值解法入手。
對於各類約束型別對應的jacbian 參照[1]第四章節71頁 - 核心的資料結構
btSolverConstraint 儲存每個約束的計算常量中間變數
btSolverBody 幾何剛體物件和動力學求解物件的連線體 - 其它
整個過程中涉及到了穿透矯正[1]111頁,時間遞進[1]90頁,bullet 沒有采用多接觸點同時求解的方法,會帶來一些誤差
[1]的第4章是整個動力學模擬的靈魂,理解了這章,整個求解過程都容易理解
下一步計劃寫softbody的分析
參考書目
[1]Stable, Robust, and Versatile Multibody Dynamics Animation
Kenny Erleben
關於多剛體-動力學模擬必讀的文章 bullet很多實現都參考了此文
很好的一篇綜述論文,實際上是下面這本書的草稿
網上可以下到免費的pdf版本
[2]physics based animation
Kenny Erleben
同作者的一本全面且用較為嚴格的數學語言描述物理模擬的經典好書
涵蓋剛體,流體,非剛體
國內尚未引進,目前暫無電子版。 適合深度挖掘者使用。
[3]Game Physics, David H. Eberly
從遊戲開發角度來闡釋物理模擬,比較實用,內容稍顯陳舊。 有電子版,不好找
[4]Physics.Engine.Development
同樣是闡述物理模擬,不過是為入門讀者準備,比較淺顯易懂。 有電子版
[5]Collision Detection in Interactive 3D Environments
對照作者自己實現的solid碰撞檢測引擎來講述,很好的一本書。又電子版
[6]Real-Time Collision Detection
比較全面的闡述了碰撞檢測,是一個初步入門的好書, 有電子版
[7]Computational Geometry in C
如果想在幾何結構方面進一步挖掘,這本書不錯,清華翻譯的二版有賣,翻譯的也好
三版已出,似乎還沒引進
[8]Classical Mechanics. Prentice Hall, 3rd edition, January 2002.
理論力學,很多東西忘記了可以檢視這本書 有電子版
[9]Iterative Dynamics with Temporal Coherence
一篇在GDC2005?上的ppt,簡短描述有關PGS演算法的問題,是Box2D的作者