tips: 关键点在于:FaellerVorrueckeFahrzeug -> childNodes -> Physical System -> childNodes -> FaellerVorrueckeFahrzeug (RBD) -> childNodes -> Interconnections (RBD - RBD) -> childNodes -> HingeJoint: Motorwagen_RBD <–> Mittelgelenk_RBD -> extension -> JointHinge: Motorwagen_RBD <–> Mittelgelenk_RBD set isLocked

HingeJoint(铰链):两刚体之间本来有 6 个相对自由度(DoF)。铰链会约束 5 个(3 个平移 + 2 个旋转),只留下 1 个旋转自由度,就是“绕铰轴转动”。

把铰链设为 Locked:把最后这 1 个旋转自由度也禁掉 → 变成 Fixed/Weld Joint(刚性焊接) 的效果。两边不能再发生任何相对运动。

通过断点调试,问题没有出现在代码里,就是因为一设 isLocked 引擎就会把原来的 Hinge 销毁并换成 Fixed/锁死版本,从而重建了刚体的 constraint 列表,形成了一个union。这个和你树里的关节矛盾,所以直接报错。你手里的旧容器/旧指针还在被迭代 → 元素越界/悬空;

我之前的用轮子判断也是崩溃的 所以判断是因为树里面的刚体和isLocked之后不符合

alt text

崩溃不是在你的 ExtensionCheckRollover 里,而是发生在 VSPluginRBDynamXD.dll 里的一个别的扩展——名字就写在栈上:

VSPluginRBDynamX::ExtensionGetCOG::slotPostDynamXInitialized(...)
→ VSPluginRBDynamX::ExtensionGetCOG::getTotalCOGofConnectedRB(...)
→ VSPluginRBDynamX::ExtensionRigidBody::getCOG(...)
→ VSLibRBDynamX::Ptr<...>::operator T*()   // 这里炸,this = 0x850

一旦把关节设为 isLocked,引擎会把 Hinge 换成 Fixed/焊接,重建约束容器;凡是还拿着旧容器/旧元素去遍历的代码,都会在 Ptr::operator T*() 这种地方爆。

问题出现在外部ExtensionRigidBody::getCOG(),在ExtensionCheckRollover中的算的COG没有走到这一步呢。

定位问题:为什么一点isLocked就不进入我的代码的地方了。

9.22 定位形成一个union后,39个刚体变成38个了。

Union 刚体,而 Union 是场景临时生成的聚合节点,没有对应的 ExtensionRigidBody

[COG] ext=null for “Union_(Motorwagen_RBDRB_Motorwagen_(++)+Mittelgelenk_RBDRB_Mittelgelenk_(+))”

1. 静态稳定判据的力学基础(为什么用“COM 投影 ∈ 支撑域”)

这就是经典的ZMP/支撑多边形思想在“静态/准静态”下的简化版本。


2. 我们在代码里做了哪些几何运算?

2.1 用重力定义“水平参考平面”

结论:无论地面怎么倾斜,只要重力方向正确,判据不受场景“坐标系水平与否”的影响。

2.2 支撑点与支撑域(AABB)

注:AABB 是对真实支撑多边形(应取凸包)的保守近似,优点是计算超快;缺点是某些不规则接触分布时略保守。需要更严谨可把 AABB 换成凸包 + 点在多边形内测试。


3. 整车质心(COM)的计算与投影

重要:COM 的高度不影响此静态判据(投影只用水平坐标)。高度在动态翻覆(大加速度/俯仰/侧倾角速度时)会通过惯性项影响“等效力/力矩”,那是 ZMP/瞬时支撑力分布才需要考虑的内容(见 §6)。


4. 判定阈值、滞回与去抖(为什么能“止闪烁”)

小推导:在水平地面、近似“矩形轮距×轴距”的车辆上,若 COM 水平偏移量达到半宽就会绕边翻。我们用 $12\%/18\%$ 的最短边比例(或绝对 $12/18$ cm)作为“危险/安全”阈值,既有尺度自适应,又能覆盖小车与大车。


5. 退化与极端情况的处理


6. 适用边界与扩展(何时足够,何时需要“更物理”)

什么时候足够?

什么时候需要更物理(ZMP/惯性力)?


7. 若要从 AABB 升级到“凸包判定”


8. 典型应用场景的“脑补图”和调参建议


9. 小结(拿来即用的理解)

这份逻辑跟你现有代码 1:1 对应,方便以后查式子/改参数/换支撑域实现(AABB→凸包)。