Bullet3 入门
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 如何从头实现一个物理引擎