diff --git a/src/dynamics/integrator/semi_implicit_euler.rs b/src/dynamics/integrator/semi_implicit_euler.rs index 5c9ffaf7..ee902ff5 100644 --- a/src/dynamics/integrator/semi_implicit_euler.rs +++ b/src/dynamics/integrator/semi_implicit_euler.rs @@ -77,13 +77,9 @@ pub fn integrate_velocity( // However, the basic semi-implicit approach can blow up, as semi-implicit Euler // extrapolates velocity and the gyroscopic torque is quadratic in the angular velocity. // Thus, we use implicit Euler, which is much more accurate and stable, although slightly more expensive. - let effective_inertia = locked_axes.apply_to_rotation(inv_inertia.0).inverse(); - delta_ang_vel += solve_gyroscopic_torque( - *ang_vel, - rotation.0, - Inertia(effective_inertia), - delta_seconds, - ); + let delta_ang_vel_gyro = + solve_gyroscopic_torque(*ang_vel, rotation.0, inv_inertia.inverse(), delta_seconds); + delta_ang_vel += locked_axes.apply_to_angular_velocity(delta_ang_vel_gyro); } if delta_ang_vel != AngularVelocity::ZERO.0 && delta_ang_vel.is_finite() {