首页 > 其他分享 >Bullet 学习笔记之 软体仿真流程(二) 软体碰撞检测与响应

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

时间:2024-07-09 19:02:47浏览次数:13  
标签:Node Bullet 投影 碰撞 碰撞检测 三角形 软体

简述 Bullet 中软体的碰撞检测与响应算法,仅针对 Soft 类型,Deformable 类型不包含在这篇文章中。


1. 软体碰撞检测

在 Bullet Physics 中,软体的碰撞检测采用的是 “点-面” 的方法,即分别用两个软体的 m_ndbvtm_fdbvt 做碰撞检测,两个 bvh 树之间的遍历方法不在此展开,当 NodeFace 的包围盒发生碰撞时,便执行 CollideVF_SS::Process(...) 函数进行点和三角形的精确碰撞检测,该函数在 btSoftBodyInternals.h 文件中。

点和面的碰撞检测采用的是投影法(专业名词不确定),即计算点在三角形上的投影点(或最近点)。具体流程和思路如下:

btVector3 o = node->mx;      // 假设 `Node` 点为空间原点,即在 `Node` 点处建立空间坐标系,那么,将三角形的位置减去 o,再计算空间原点到三角形的投影点(或最近点)。
btVector3 p;                 // 在 `Node` 空间坐标系下,原点到三角形的投影点(或最近点) 
btScalar d = SIMD_INFINITY;  // Node 点到投影点(最近点)的距离(的平方)

ProjectOrigin(face->m_n[0]->m_x - o,
              face->m_n[1]->m_x - o,
              face->m_n[2]->m_x - o,
              p, d);

其中, ProjectOrign(...) 函数就是计算原点到三角形上的投影点(或最近点),并给出距离(的平方)。具体,可参见该函数。

接下来,便是判断 Node 点是否与 Face 碰撞。在这里,是根据 “边界”+“位移” 大于 “投影距离” 的方法。即,

const btScalar m = mrg + (o - node->m_q).length() * 2;
if (d < (m * m))
{ ... }

当发生碰撞后,便计算碰撞信息,具体碰撞信息如下:

btSoftBody::SContact c;
c.m_normal = p / -btSqrt(d);    // 法向量,即由三角形面片指向 `Node` 点
c.m_margin = m;                 // 边界,是 mrg + (o - node->m_q).length() * 2
c.m_node = node;
c.m_face = face;
c.m_weights = w;                // 投影点(或最近点)在三角形上的位置,采用质心坐标表示
c.m_friction = btMax(psb[0]->m_cfg.kDF, psb[1]->m_cfg.kDF);
c.m_cfm[0] = ma / ms * psb[0]->m_cfg.kSHR;
c.m_cfm[1] = mb / ms * psb[1]->m_cfg.kSHR;

软体碰撞的检测算法相对还是比较简单的。接下来,便是软体的碰撞响应。

2. 软体碰撞响应

标签:Node,Bullet,投影,碰撞,碰撞检测,三角形,软体
From: https://www.cnblogs.com/wghou09/p/18292413

相关文章

  • manim边学边做--BulletedList
    BulletedList是Mobjects分类中用来显示列表的class。使用BulletedList可以帮助我们快速生成一个对齐的列表结构。BulletedList在manim各个模块中的位置如上图中所示。1.主要参数BulletedList的主要参数有:参数名称类型说明itemslist列表的内容bufffloat列表内......
  • 碰撞检测
    1、做各自的obb包围盒2、找到一个轴,两个凸形状在该轴上的投影不重叠,则这两个形状不相交。 针对某一分离轴L,如果包围盒A与包围盒B在轴L上的投影的半径和小于包围盒中心点间距在L的投影距离,那么包围盒A与包围盒B处于分离状态。使用运算式来表达就是:|T*L|>rA+rB。 现在知......
  • UE4中PhysX BroadPhase(碰撞检测的粗略阶段)
    PhysX的BroadPhase(碰撞检测的粗略阶段),具体是用AABB(轴向包围盒)来做碰撞检测具体算法有两种:SAP(SinglePruningBox,单个剪枝盒)和MBP(MultiPruningBox,多个剪枝盒) SAP(Single PruningBox,单个剪枝盒)当场景中有大量的物体(大世界有百万级别)时,即使它们已按AABB的三个轴向xyz做了排序......
  • Bullet 学习笔记之 BugList 生产日记
    每天不是在改bug,就是在生产bug...在做Bullet开发的时候,总会“不由自主地”生产出各种奇奇怪怪的bug,虽然极大地丰富了工作量,但这些bug实在让人头大。记录一下。btMax()/btMin()误用:btMax(btScalara,btScalarb)可以计算得到a和b中的较大值;但btMax(btVector3......
  • 银弹:为了避免项目的成员为了一些问题争执不休,公司发明了银弹(Silver Bullet)这一工具。
    在项目管理中,银弹可以在某些情况下是有效的工具。它可以帮助解决团队成员之间的争议和分歧,促使团队更快地达成共识和决策。银弹本身并不是解决问题的方法,而是一种强制执行一方意见的手段,可以在某些情况下起到震慑作用。然而,银弹并不是万能的,它只是暂时性的解决方案。如果团队成员......
  • Unity物体之间碰撞检测的方法
    检测碰撞有两种方式,一种是利用碰撞器,另外一种就是触发器。碰撞器的种类:1.StaticCollider静态碰撞器指的是相互碰撞的两个物体没有附加刚体而只附加了Collider的游戏对象。这类对象在碰撞时会保持静止,发生碰撞时不会触发任何的方法函数。 2.RigidbodyCollider刚体碰撞器......
  • 银弹:为了避免项目的成员为了一些问题争执不休,公司发明了银弹(Silver Bullet)这一工具。
    我的答案:【第二组】答:银弹作为一种工具,其目的是为了在项目团队中解决争议,确保项目能够继续前进。然而,是否真的有用,需要从多个角度进行考量:团队沟通与协作:银弹提供了一种强制性的解决方案,可以在一定程度上减少无休止的争论,促使团队成员快速做出决策。这在某些情况下可以提......
  • 第11周:银弹:为了避免项目的成员为了一些问题争执不休,公司发明了银弹(Silver Bullet)这一
    答:银弹作为一种工具,其目的是为了在项目团队中解决争议,确保项目能够继续前进。然而,是否真的有用,需要从多个角度进行考量:团队沟通与协作:银弹提供了一种强制性的解决方案,可以在一定程度上减少无休止的争论,促使团队成员快速做出决策。这在某些情况下可以提高决策效率,避免项目停......
  • 运动规划_碰撞检测算法之分离轴定理
    运动规划:碰撞检测算法之分离轴定理附赠自动驾驶全套学习资料和量产经验:链接如上文所述,基于包围形的方法是一种粗略的碰撞检测方法,基于外接圆形的方法运算速度很快,但精度很差;基于轴对齐包围矩形(AABB)的方法适合本身就是矩形的物体,其运算速度非常快,但检测精度还是不够。1......
  • 自动驾驶运动规划:碰撞检测算法之分离轴定理
    运动规划:碰撞检测算法之分离轴定理附赠自动驾驶全套学习资料和量产经验:链接如上文所述,基于包围形的方法是一种粗略的碰撞检测方法,基于外接圆形的方法运算速度很快,但精度很差;基于轴对齐包围矩形(AABB)的方法适合本身就是矩形的物体,其运算速度非常快,但检测精度还是不够。1、OBB......