Bullet 物理引擎 简析

作者: 马良 (www.iphonephysics.com ) 

原帖地址  http://www.cocoachina.com/bbs/read.php?tid-10237-fpage-5.html



0 前提假设
    计算机图形学中的物理模拟实际上只是追求视觉近似,而并非精确的物理模拟
    同时物理引擎从简化计算考虑, 不与渲染引擎共享对象数据采用独立的一套数据.

1 架构分析
  物理模拟的基础是建立在一些核心几何结构之上. 
核心的几何概念有 

  1. 形 状 (shape) : shape 抽象出了几何形状的特征, 比如长方体, 球, 四面体,凸包. bullet中的形状类型非常丰富有几十种之多. 由于几何形状的特征是和具体对象无关的,所以一种形状只要维持一个实例即可, 所有映射到该shape的对象可以共享这个实例.
  2. 包围体层次(BVH) 这个的概念可以在书中查找,一般有AABB, OBB, K-Dop, Convex Hull. Bullet 中采用的是AABB
  3. 空间划分数据机构节点 bullet 采用AABB
  4. 空间划分数据结构(通常是树) Bullet 中采用的主要是Dynamic AABB Tree (刚体 , 值得注意的是这里用得是曼哈顿距离) 和 Sweep and Prune (soft body)
  5. 碰撞检测算法(这里也有很多选择完全根据检测对象来定,GJK ,sweep prune 是复杂的, box2box, shpere2shpere .... 比较简单.
  6. 接触点(contract point, manifold)
  7. 约束类型(bullet 提供了6种,见bullet 手册)
  8. 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.



  1. 理论准备:本科的数学分析,理论力学,线性代数。 尤其是理论力学中的朗格朗日动力学部分
      最好能回忆起来。 碰撞检测上面列的两本书的内容就足够了,如果进一步挖掘需要看
      计算几何方面的书
  2. 补一个架构图 引自[1]的12页,其中的STC即为上次分析中的islandmanager  


 

碰撞响应的分析

  1.   约束分类:可积约束,不可积约束 ,摩擦力(见[1]第四章)
  2. 整个bullet在动力学方面的核心就是btSequentialImpulseConstraintSolver 这个类及其实现
    这个类名字可以翻译为基于顺序冲量处理方法的约束求解过程(这是个缩略的函数名不可直译)。
    这个名字的含义很重要,表示了这个求解方法是按照顺序来处理约束以及接触点,摩擦力,one by one
    并且求解的结果是冲量的范数。整个的原理部分可以参照[1]的第4章节,[2]的第7章。  
  3. btSequentialImpulseConstraintSolver 的全部重心在于solveGroupCacheFriendlySetup 
    负责对于三种约束进行计算准备(包括计算一些解方程要用到的常量以及中间变量等)和 solveGroupCacheFriendlyIterations 
    负责应用PGS[9]求解。



solveGroupCacheFriendlySetup 分析

  1. 首先是关于可积约束的计算准备:首先是遍历约束数组,每一个约束都需要计算自己的jacbian(关键概念参照[1]的第四章)
    初始化一些常量和中间变量 这里有些概念和公式比如惯性张量等都可以在[1],[8]中找到
  2. 关于接触点约束的计算准备:这里有个重要的函数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的作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值