(转)Bullet 物理引擎 简析[1]
原创帖子, 转载请注明出处,作者信息.
这个是自己分析bullet的代码过程中的笔记,比较简陋, 希望抛砖引玉, 欢迎板砖
作者: 马良 (http://www.iphonephysics.com/ ) (此blog需Over GW)
前提假设
计算机图形学中的物理模拟实际上只是追求视觉近似,而并非精确的物理模拟
同时物理引擎从简化计算考虑, 不与渲染引擎共享对象数据采用独立的一套数据.
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.
待续... ( 可能具体分析一下碰撞响应, 这块是目前各类文献中都比较少涉及的)
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superwiles/archive/2009/11/08/4784826.aspx