开始阅读前可以先浏览一下之前框架分析
在物理模拟的场景中, 一个节点首先应该具备2种属性
- 物理属性 包含 质量,速度,惯性,加速度,角速度,约束,摩擦系数 等
- 几何属性 形状, 包围体层次,碰撞检测类型掩码。world 变换。
物理属性大部分都在collosionObject 和rigidObjec 这样的类之中。
几何属性则又一次被细分为包围体层次和形状,碰撞检测类型掩码。
为了进一步介绍Dbvt的核心函数 btDbvt::collideTV
必须首先引入btDbvtProxy。btDbvtProxy 继承自 btBroadphaseProxy。
btBroadphaseProxy 基类包含了最基本的碰撞检测类型以及对象本身支持的碰撞检测类型,关于碰撞检测类型的详细描述可以参见bullet手册的第5章节有详细描述。对象可以根 据支持的碰撞检测类型选择碰撞的对象。还包含了指向物理属性对象的指针。
再看btDbvtProxy
btDbvtProxy 是一个节点,利用了代理的设计模式,连接物理属性节点与几何节点。
本身还是重合节点管理的重要组成部分。然后再看看btDbvtTreeCollider
btDbvtTreeCollider 定义了当两个几何节点在远距状态下碰撞后的处理方法,btDbvt::ICollide 定义的是接口标准btDbvtTreeCollider 是在dbvt下的一个具体实现,开发者也可以根据自己的需要嵌入不同的处理逻辑。proxy代表的是主节点,n代表的是被比较节点。
现在进入主题 btDbvt::collideTV。这个函数的主要算法是遍历所有和目标节点重合的叶子节点,然后使用已有的处理逻辑模块 btDbvtTreeCollider 来处理这两个节点。会引入新的数据结构btHashedOverlappingPairCache,可以参见后 续的btDbvtBroadphase分析