游戏开发者联盟

bullet物理引擎(1)

概况

三大物理引擎之第三。独立性、模块化都做的比较好,易于集成。同时支持常见的PC和移动平台。性能不是最强大,功能不是最多,胜在易用、尚可用。

  • Godot : git 27K+星,使用了它。
  • LayaAir 3D ,也使用了它。
  • 自带的ExampleBrowser里有3000物体模拟示例。

还有不少项目里也使用了bullet,总之,bullet实用性毋庸置疑。

文档

  • 英文用户手册,只有40页,介绍了bullet特性、基本概念和架构,以及常见使用方式。读完这个文档,基本就可以使用bullet了。

特性:(最有趣的是碰撞、刚体和角色控制器)

•离散和连续碰撞检测,包括射线和凸扫描测试。碰撞
形状包括凹凸网格和所有基本图元
•通过以下方式连接的最大坐标6自由度刚体(btRigidBody)约束(btTypedConstraint)以及广义坐标多体
(btMultiBody)由动员者使用铰接式身体算法连接。
•快速稳定的刚体动力学约束求解器,车辆动力学,角色控制器和滑块,铰链,通用的6DOF以及用于布娃娃的锥形扭曲约束
•具有双向相互作用的布料,绳索和可变形体积的软体动力学刚体,包括约束支撑。

bullet内部处理流程

手册里有一个图:Rigid Body Physics Pipeline,这个图的下半部分就是处理流程,从左到右,处理流程都是可选、可替换的。
QQ图片20200123093549
编程流程:

  • 创建世界:btDynamicsWorld
    btDiscreteDynamicsWorld(默认) 或者 btSoftRigidDynamicsWorld。
  • 创建物体:btRigidBody或者btCollisionObject,并放入世界中。物体有以下重要属性:
    • 质量:0是静态物体,大于0的物体参与物理模拟。
    • CollisionShape:碰撞形状:长方体,球体,胶囊,凸多面体,三角形mesh
    • 材质属性:摩擦力 friction 、弹性restitution
  • stepSimulation :就是update,每帧驱动调用、驱动模拟。它内部采用60赫兹的固定频率来检测碰撞、物理模拟,并调用物体的setWorldTransform方法更新物体状态。

基本数据类型和数学库

bullet采用右手坐标系,这基本没啥影响。基本数据类型都来自数学库,数学库在LeanerMath中。

  • btScalar:浮点数,可以自定义是float还是double。
  • btVector3:矢量,它和unity和UE中的vector概念一样,不过它多了一个w,不用管。
  • btQuaternion和btMatrix3x3:用来表示3D方向和旋转。
  • btTransform:包含位置和方向,代表物体的当前状态。不允许缩放和剪切。

btDynamicsWorld的分类

  • btDiscreteDynamicsWorld - Simplest physics world, only handles rigid bodies, maybe it has better performance. 如果没有高速物体(比如1秒十几米、几十米的子弹),就选这个。
  • btSoftRigidDynamicsWorld - The only physics world that can work with large jello moulds
  • btContinuousDynamicsWorld - If you have really fast objects this will prevent them from prenetrating each other or flying through each other, but is otherwise like a btDiscreteDynamicsWorld。如果有告诉物体,就选这个,这个是连续碰撞检测,专门为了检测子弹的。不过到目前为止,尚未开发完成,不可用。

相关文章: