六自由度约束金字塔摆动限制在质心外的关节锚点处可能会超出限制

作者: nikolay-egorov创建于 2026年4月29日更新于 2026年5月3日

描述

在 Godot 中 公开 API 后,我一直在使用 SixDOFConstraint 来设置角度限制,并发现引擎忽略了一些角度限制。 具体来说,如果关节位于肢体的近端,而身体的质心位于肢体的中间,在持续的扭矩作用下,受限的身体可以旋转远远超过配置的角度限制。 使用 ESwingType::PyramidSixDOFConstraint 在约束锚点偏离动态体的质心时,无法牢固地强制实现角度限制。 该问题似乎特定于金字塔摆动路径。 简单的情况下,锚点位于体的质心上,或者扭矩轴与锚点偏移方向一致,则正确地限制。 ##### 重现案例 重要的一点是要区分单关节和多关节。 在后者中,偏移会产生累积效应 两关节链的重现案例: - 静态锚点 -> 上肢 -> 下肢 - 关节锚点位于肢体末端,质心位于肢体中心 - 锁定平移 - 金字塔摆动 - 不对称扭转限制: [-4, 135] 度 - 摆动 Y/Z 限制: [-60, +60] 度 - 稳定的混合轴扭矩,为 360 个模拟步骤 请查看附件中的测试: Add_regression_tests_to_showcase_failures_with_pyramid_swing_limit_clamping.patch ##### 预期结果与实际结果 对于两关节测试,测量的摆动/扭转值应保持在以下范围内: - 扭转: [-19, +150] 度, ~ 26 度 具有 10 度 的限制 - 摆动 Y/Z: [-75, +75] 度, 偏移 ~ -41 度 具有 -4 度 的下限 ##### 可能的修复 在 SwingTwistConstraintPart::CalculateConstraintProperties 中,金字塔摆动路径似乎使用基于受限和当前摆动方向的单个合并摆动校正轴。 这对于锥形/椭圆形摆动限制更好,但金字塔摆动在 (swing_y, swing_z) 空间中是矩形。 当 Y 和 Z 摆动都受限时,应独立处理违规情况。

内容来源: jrouwe/JoltPhysics