Bullet3 入門
Bullet3 簡介
Bullet 是一個開源免費(Zlib)的物理引擎,廣泛應用於游戲、動畫、電影和機器人仿真等領域。Blender、Maya、Unity3D 插件、gazebo、V-rep、Roboschool 等都使用了這個物理引擎。
其他的物理引擎還有PhysX 、Havok 等。
物理引擎的主要功能
- 連續和離散物體的碰撞檢測,物體形狀包括網格和基本幾何體的。
- 快速穩定的剛體約束求解器,包括車輛動力學、人體、直線約束、鉸鏈約束等等。
- 軟體物體動力學,包括衣服、繩子、可變形體等,同時支持約束。
- 自定義格式.bullet, 支持 URDF 格式,和 bsp 格式。
整體架構
呈分層結構,每個模塊都可以單獨拿來使用。
下圖展示了引擎運行的流程圖
引擎從左向右執行,從施加重力開始,到位置改變,坐標系變換結束。
數據結構
幾何模型
- 形狀: shape 類 抽象出了幾何形狀的特征, 比如長方體, 球, 四面體,凸包. bullet 中的形狀類型非常豐富,有幾十種之多. 由於幾何形狀的特征是和具體對象無關的,所以一種形狀只要維持一個實例即可, 所有映射到該 shape 的對象可以共享這個實例.
- 包圍體(BVH): 采用的是 AABB, 一般有 AABB, OBB, K-Dop, Convex Hull.
- 空間划分: 主要是 Dynamic AABB Tree (剛體,曼哈頓距離) 和 Sweep and Prune (soft body)
- 碰撞檢測算法:GJK ,sweep prune,box2box, shpere2shpere 等
- 接觸點:
- 約束: 六種約束類型,見文檔
- motion state: 對渲染引擎提供的一個接口, 便於渲染引擎更新渲染對象的位置
完成幾何基礎構建后,在一個場景(collision world)內 加入 各個被模擬的物理對象(collision object)每個物理對象被映射到對映的 shape, 空間划分數據結構節點. 如果再在這些對象身上附加例如速度,角速度,轉動慣量等物理特征,就演化為 rigid object. Soft body 情況復雜一些, 一般由 mesh 構成
物理仿真
- Broad Phase: 首先進行遠距碰撞檢測, 利用空間分割結構,如果不在同一個子樹內的物體不可能相交不用去計算, 在同一個子樹內的物體被放入 overlapping pair, 再進一步由對應的算法來計算出接觸點等信息. 采用哪一種算法取決於算法配置矩陣(見 bullet 手冊)
- Narrow Phase: 根據 overlapping pairs 的分布情況計算出碰撞對象島(collision Island).而后依次對各個島進行約束分析. 亦即碰撞響應. Bullet 采用的是 Sequential Impulse ConstraintSolver(http://www.gphysics.com/archives/28 ) 約束分析是一個非常復雜的話題,涉及到 PGS 算法的簡化,后文會有介紹. 約束分析會根據所設定的約束類型來計算碰撞后各個對象所對應的位置,速度等, 然后與渲染引擎同步 motion state.
碰撞響應
相關資料
網頁
- https://blog.csdn.net/lxdfigo/article/details/8279783 Bullet HelloWorld
- https://blog.csdn.net/vagrxie/article/details/5952310 不完全指南
- https://blog.csdn.net/pizi0475/article/details/9955585 工作流程簡析,推薦了相應書目
- https://www.cnblogs.com/lancidie/category/262768.html 內容比較多的介紹
- https://rondsny.github.io/2017/02/06/301-bullet3_init_world/ 創建世界(場景)及常見函數
- https://rondsny.github.io/2017/02/07/302-bullet3_init_shape/ 常見物體和初始化
- https://blog.csdn.net/cfzjxz/article/details/23110611?utm_source=blogxgwz1 物體碰撞與屬性簡單實例
- https://rondsny.github.io/2017/02/16/304-bullet3_collision_detection/ 三種碰撞檢測及實現
- https://blog.csdn.net/pyang1989/article/details/40744775?utm_source=blogxgwz5 剛體與軟體的碰撞
- https://blog.csdn.net/qq_28088659/article/details/51405240 Bullet 約束的使用
- https://blog.csdn.net/qq_28088659/article/details/51428119 Bullet 通過高度圖數據創建 3D 地形
- https://blog.csdn.net/vagrxie/article/details/5930269 Bullet 3D Max 插件
- https://blog.csdn.net/summericeyl/article/details/50862647 在 OpenGL 中的應用
教材
- https://github.com/tianxiao/Recent-Advances-in-Real-Time-Collision-and-Proximity-Computations-for-Games-and-Simulations- 包含了各種物理引擎的資料
- BulletQuickstart 快速入門教程
- 《游戲物理引擎開發》: 講述了物理引擎的設計方法,實現了一個簡單的物理引擎 cyclone.
- Physics-Based Modeling and Simulation 物理建模和仿真的大學課程,只有演示文稿和參考文獻
- 《Learning Game Physics with Bullet Physics and OpenGL》
視頻
- https://www.lynda.com/Maya-tutorials/Dynamic-Simulations-Bullet-Physics-Maya/184454-2.html 在 Maya 中使用 Bullet 引擎
- 3D Physics Engine Course 如何從頭實現一個物理引擎