From 9bb8d12c1b280521df702e755fb94da7ce765af4 Mon Sep 17 00:00:00 2001 From: Jorrit Rouwe Date: Tue, 30 Sep 2025 21:01:27 +0200 Subject: [PATCH] Fix Generic6DOFJoint3D not respecting angular limits A 6DOF constraint that constrains all rotation axis in combination with a body that has some of its rotation axis locked would not constrain the rotation in the unlocked axis. Fixes #109018 --- .../RotationEulerConstraintPart.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/thirdparty/jolt_physics/Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h b/thirdparty/jolt_physics/Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h index ec84776a46f..387c0d9737c 100644 --- a/thirdparty/jolt_physics/Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h +++ b/thirdparty/jolt_physics/Jolt/Physics/Constraints/ConstraintPart/RotationEulerConstraintPart.h @@ -143,8 +143,21 @@ public: mInvI2 = inBody2.IsDynamic()? inBody2.GetMotionProperties()->GetInverseInertiaForRotation(inRotation2) : Mat44::sZero(); // Calculate effective mass: K^-1 = (J M^-1 J^T)^-1 - if (!mEffectiveMass.SetInversed3x3(mInvI1 + mInvI2)) - Deactivate(); + Mat44 inertia_sum = mInvI1 + mInvI2; + if (!mEffectiveMass.SetInversed3x3(inertia_sum)) + { + // If a column is zero, the axis is locked and we set the column to identity. + // This does not matter because any impulse will always be multiplied with mInvI1 or mInvI2 which will result in zero for the locked coordinate. + Vec4 zero = Vec4::sZero(); + if (inertia_sum.GetColumn4(0) == zero) + inertia_sum.SetColumn4(0, Vec4(1, 0, 0, 0)); + if (inertia_sum.GetColumn4(1) == zero) + inertia_sum.SetColumn4(1, Vec4(0, 1, 0, 0)); + if (inertia_sum.GetColumn4(2) == zero) + inertia_sum.SetColumn4(2, Vec4(0, 0, 1, 0)); + if (!mEffectiveMass.SetInversed3x3(inertia_sum)) + Deactivate(); + } } /// Deactivate this constraint