@@ -310,7 +310,6 @@ impl MassProperties {
310310 let mass = 1.0 / self . inv_mass ;
311311 let diag = shift. length_squared ( ) ;
312312 let diagm = Matrix :: from_diagonal ( Vector :: splat ( diag) ) ;
313- let shift = Vector :: new ( shift. x , shift. y , shift. z ) ;
314313 matrix + ( diagm - shift. kronecker ( shift) ) * mass
315314 } else {
316315 matrix
@@ -605,11 +604,16 @@ impl approx::RelativeEq for MassProperties {
605604 max_relative,
606605 ) ;
607606
607+ // Compare either the inertia matrix or its inverse, whichever is most precise.
608608 #[ cfg( feature = "dim3" ) ]
609609 let inertia_is_ok = self . reconstruct_inverse_inertia_matrix ( ) . relative_eq (
610610 & other. reconstruct_inverse_inertia_matrix ( ) ,
611611 epsilon,
612612 max_relative,
613+ ) || self . reconstruct_inertia_matrix ( ) . relative_eq (
614+ & other. reconstruct_inertia_matrix ( ) ,
615+ epsilon,
616+ max_relative,
613617 ) ;
614618
615619 inertia_is_ok
@@ -626,10 +630,8 @@ impl approx::RelativeEq for MassProperties {
626630mod test {
627631 use super :: MassProperties ;
628632 #[ cfg( feature = "dim3" ) ]
629- use crate :: math:: AngVector ;
630- #[ cfg( feature = "dim3" ) ]
631633 use crate :: math:: Rotation ;
632- use crate :: math:: Vector ;
634+ use crate :: math:: { Vector , AngVector } ;
633635 use crate :: shape:: { Ball , Capsule , Shape } ;
634636 use approx:: assert_relative_eq;
635637 use num:: Zero ;
@@ -690,35 +692,18 @@ mod test {
690692 assert_relative_eq ! ( m1m2m3 - m1, m2 + m3, epsilon = 1.0e-6 ) ;
691693 assert_relative_eq ! ( m1m2m3 - m2, m1 + m3, epsilon = 1.0e-6 ) ;
692694 assert_relative_eq ! ( m1m2m3 - m3, m1 + m2, epsilon = 1.0e-6 ) ;
693- assert_relative_eq ! ( m1m2m3 - ( m1 + m2) , m3, epsilon = 1.0e-6 ) ;
695+ assert_relative_eq ! ( m1m2m3 - ( m1 + m2) , m3, epsilon = 1.0e-5 ) ;
694696 assert_relative_eq ! ( m1m2m3 - ( m1 + m3) , m2, epsilon = 1.0e-6 ) ;
695697 assert_relative_eq ! ( m1m2m3 - ( m2 + m3) , m1, epsilon = 1.0e-6 ) ;
696- assert_relative_eq ! ( m1m2m3 - m1 - m2, m3, epsilon = 1.0e-6 ) ;
698+ assert_relative_eq ! ( m1m2m3 - m1 - m2, m3, epsilon = 1.0e-5 ) ;
697699 assert_relative_eq ! ( m1m2m3 - m1 - m3, m2, epsilon = 1.0e-6 ) ;
698700 assert_relative_eq ! ( m1m2m3 - m2 - m3, m1, epsilon = 1.0e-6 ) ;
701+ assert_relative_eq ! ( m1m2m3 - m2 - m3, m1, epsilon = 1.0e-6 ) ;
699702
700703 // NOTE: converting the inverse inertia matrices don't work well here because
701704 // tiny inertia value originating from the subtraction can result in a non-zero
702705 // (but large) inverse.
703- #[ cfg( feature = "dim2" ) ]
704- assert_relative_eq ! (
705- ( ( ( m1m2m3 - m1) - m2) - m3) . principal_inertia( ) ,
706- 0.0 ,
707- epsilon = 1.0e-3
708- ) ;
709- #[ cfg( feature = "dim3" ) ]
710- {
711- let result = ( ( ( m1m2m3 - m1) - m2) - m3) . principal_inertia ( ) ;
712- let expected = AngVector :: ZERO ;
713- assert ! (
714- ( result. x - expected. x) . abs( ) < 1.0e-3
715- && ( result. y - expected. y) . abs( ) < 1.0e-3
716- && ( result. z - expected. z) . abs( ) < 1.0e-3 ,
717- "Expected {:?} to be close to {:?}" ,
718- result,
719- expected
720- ) ;
721- }
706+ assert_relative_eq ! ( ( ( ( m1m2m3 - m1) - m2) - m3) . principal_inertia( ) , AngVector :: default ( ) , epsilon = 1.0e-2 ) ;
722707 assert_relative_eq ! ( ( ( ( m1m2m3 - m1) - m2) - m3) . mass( ) , 0.0 , epsilon = 1.0e-6 ) ;
723708 }
724709
0 commit comments