物理引擎基础概念

来源:马厩

 

趁自己还是自由身,发散的看一下物理引擎相关的知识,垫垫底以后碰到相关的文章也不会因为什么都不懂而错过。

 

核心的几何概念:

1.形状 (shape):物理研究的跟图形的侧重点不一样,所以对于物理来说它只需要把模型抽象成简单的形状就行了,最简单是长方体,球体,四棱锥之类的。

2.包围体层次(BVH) :包围体用途很广泛不仅仅用在物理上,它主要起到简化计算的作用,用的比较多的是碰撞检测。

(1)包围柱是包容物体的圆柱,在多数应用程序中圆柱的轴与场景竖直方向相同。圆柱是只能绕着纵向轴旋转三维物体,而不能绕着其它轴线旋转,或者只能进行平移。

(2)包围盒是一个包容物体的立方体,包围盒按照坐标系的坐标轴进行排列,这被称为按坐标轴排列的包围盒(AABB)。为了将 AABB 与通用的情况进行区分,有时将任意的包围盒称为定向包围盒(OBB)。AABB 检验物体的相交要比 OBB 更加简单,但是它的缺点是当模型旋转的时候无法随之旋转,而必须重新进行计算。

3.空间划分:对空间的划分,数据结构(通常是树) 。Bullet 中采用的主要是Dynamic AABB Tree (刚体 , 值得注意的是这里用得是曼哈顿距离) 和 Sweep and Prune (soft body)。

4.碰撞检测:检测物体之间是否存在交互,其实如果把一个物体比作电脑的话,碰撞检测相当于输入。所以,最好把碰撞检测的这个概念广义化。

5.接触点:上面刚刚说到要把碰撞检测这个概念广义化,这里就是。两个物体之间有接触,但是是否有接触就代表发生了碰撞呢?不一定,一般碰到接触点才算,还有就是,接触点不仅仅能够说明是否被碰撞了,还可以携带碰撞的类型。

6约束类型:这个涉及到运动相关的吧,碰撞后的运动。

7.运动状态(motion state):这个相当于模型对自己的一种描述,引擎通过状态判断是否操作类型。

 

完 成几何基础构建后在一个场景(collision world)内 加入 各个被模拟的物理对象(collision object)每个物理对象被映射到对映的shape, 空间划分数据结构节点. 如果再在这些对象身上附加例如速度,角速度,转动惯量等物理特征,就演化为rigid object. Soft body  情况复杂一些, 一般由mesh构成。

 

物理模拟过程:

1.Broad Phase:首先进行远距碰撞检测, 利用空间分割结构,如果不在同一个子树内的物体不可能相交不用去计算, 在同一个子树内的物体被放入 overlapping pair, 再进一步由对应的算法来计算出接触点等信息. 采用哪一种算法取决于算法配置矩阵。

2.Narrow Phase:根据overlapping pairs 的分布情况计算出碰撞对象岛(collision Island).而后依次对各个岛进行约束分析. 亦即碰撞响应. Bullet 采用的是Sequential Impulse 。

3.ConstraintSolver:其实1和2同为一个阶段,就是请求输入阶段,而约束分析阶段才是真正的响应阶段。约束分析是一个非常复杂的话题,涉及到PGS算法的简化,后文会有介绍. 约束分析会根据所设定的约束类型来计算碰撞后各个对象所对应的位置,速度等, 然后与渲染引擎同步motion state。约束分析用到了大量的刚体力学中的基础知识,以及PGS这样的数值计算算法,约束构成主要是根据约束类型来计算两个连接对象的jacobian矩阵,配合shape计算转动惯量,来更新相互连接的对象的位置,速度,来模拟连接对象受力的效果。

 

物理引擎比图形引擎难,主要是图形引擎有时候可以选择不动态,而物理引擎本身就是专门处理动态事物的。尤其是动作类游戏,玩家的操作,导致的碰撞的角度以及其他的信息是不可控的。这一方面会加大算法的难度,另一方面对程序的架构也有很高的要求,而后者对引擎的成败影响更大。

你可能感兴趣的:(基础)