Bullet 学习笔记之 软体仿真流程(二) 碰撞检测

下面梳理 Bullet Physics 中关于软体的碰撞检测流程及算法。

在 Bullet Physics 中,涉及软体的碰撞检测主要由函数 btDiscreteDynamicsWorld::performDiscreteCollisionDetection() 和函数 btDeformableRigidDynamicsWorld::softBodySelfCollision() 完成。


1、碰撞检测类型

涉及软体的碰撞检测,其类型主要包括如下:

enum _
{
	RVSmask = 0x000f,  ///Rigid versus soft mask
	SDF_RS = 0x0001,   ///SDF based rigid vs soft
	CL_RS = 0x0002,    ///Cluster vs convex rigid vs soft
        SDF_RD = 0x0003,   ///DF based rigid vs deformable
        SDF_RDF = 0x0004,   ///DF based rigid vs deformable faces

	SVSmask = 0x00F0,  ///Rigid versus soft mask
	VF_SS = 0x0010,    ///Vertex vs face soft vs soft handling
	CL_SS = 0x0020,    ///Cluster vs cluster soft vs soft handling
	CL_SELF = 0x0040,  ///Cluster soft body self collision
        VF_DD = 0x0050,    ///Vertex vs face soft vs soft handling
	/* presets	*/
	Default = SDF_RS,
	END
};

分为 “刚体 vs 软体” 和 “软体 vs 软体” 两类,又细分为不同的算法。其算法定义在 btSoftColliders 中。通过 btSoftBody.cpp 可知,仅实现了 fCollision::SDF_RS(SDF based rigid vs soft)、 fCollision::CL_RS(Cluster vs convex rigid vs soft)、 fCollision::SDF_RD(DF based rigid vs deformable) 三种碰撞检测。


2、碰撞检测信息

btSoftBody 中,碰撞所需要的信息,主要涉及以下成员变量:

// m_leaf 存在与 Feature 中
btDbvtNode* m_leaf;  // Leaf data

btVector3 m_bounds[2];             // Spatial bounds
bool m_bUpdateRtCst;               // Update runtime constants
btDbvt m_ndbvt;                    // Nodes tree
btDbvt m_fdbvt;                    // Faces tree
btDbvt m_cdbvt;                    // Clusters tree

btAlignedObjectArray<btVector3> m_quads; // quadrature points for collision detection

在软体的碰撞检测中,是通过建立类型为 btDbvt 的数据结构,从而实现快速碰撞检测的。它由 btDbvtNode 组成树状结构。官方表述为:a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree)
Node Face Tetra 等特征(Feature)中,均包含 btDbvtNode* m_leaf 信息。在软体初始化阶段,插入 Node Face Tetra 等时,都会将相应的 btDbvtNode 插入到相应的 btDbvt 中。


3、碰撞检测函数

执行碰撞检测是由函数 btSoftBody::defaultCollisionHandler(..) 完成。具体内容,是在 btSoftColliders 类中完成。


4、碰撞检测结果

碰撞检测得到的结果,存放在 btSoftBody 的成员函数中,如下:

btAlignedObjectArray<DeformableNodeRigidContact> m_nodeRigidContacts;
btAlignedObjectArray<DeformableFaceNodeContact> m_faceNodeContacts;
btAlignedObjectArray<DeformableFaceRigidContact> m_faceRigidContacts;
tSContactArray m_scontacts;        // Soft contacts

(这儿有个小小的疑问。刚体与软体的碰撞,在刚体中,会不会也有一份存储呢?)


5、碰撞检测流程

碰撞检测的流程,应该包括 初始化状态更新检测结果处理 等几个步骤。具体细节如下:

5、1 初始化
5、2 状态更新
5、3 检测
5、4 结果处理

小结

posted @   wghou09  阅读(1158)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示