From f74b8401ad9ef50b8cdbf1f43a2b21f6c42b0ebc Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 2 Jan 2022 14:47:40 +0100 Subject: Implement multibody joints and the new solver --- .../solver/velocity_ground_constraint_element.rs | 81 ++++++---------------- 1 file changed, 22 insertions(+), 59 deletions(-) (limited to 'src/dynamics/solver/velocity_ground_constraint_element.rs') diff --git a/src/dynamics/solver/velocity_ground_constraint_element.rs b/src/dynamics/solver/velocity_ground_constraint_element.rs index 2d4d633..adfcfda 100644 --- a/src/dynamics/solver/velocity_ground_constraint_element.rs +++ b/src/dynamics/solver/velocity_ground_constraint_element.rs @@ -8,7 +8,7 @@ pub(crate) struct VelocityGroundConstraintTangentPart { pub gcross2: [AngVector; DIM - 1], pub rhs: [N; DIM - 1], #[cfg(feature = "dim2")] - pub impulse: [N; DIM - 1], + pub impulse: na::Vector1, #[cfg(feature = "dim3")] pub impulse: na::Vector2, pub r: [N; DIM - 1], @@ -20,27 +20,11 @@ impl VelocityGroundConstraintTangentPart { Self { gcross2: [na::zero(); DIM - 1], rhs: [na::zero(); DIM - 1], - #[cfg(feature = "dim2")] - impulse: [na::zero(); DIM - 1], - #[cfg(feature = "dim3")] impulse: na::zero(), r: [na::zero(); DIM - 1], } } - #[inline] - pub fn warmstart( - &self, - tangents1: [&Vector; DIM - 1], - im2: N, - mj_lambda2: &mut DeltaVel, - ) { - for j in 0..DIM - 1 { - mj_lambda2.linear += tangents1[j] * (-im2 * self.impulse[j]); - mj_lambda2.angular += self.gcross2[j] * self.impulse[j]; - } - } - #[inline] pub fn solve( &mut self, @@ -99,6 +83,7 @@ impl VelocityGroundConstraintTangentPart { pub(crate) struct VelocityGroundConstraintNormalPart { pub gcross2: AngVector, pub rhs: N, + pub rhs_wo_bias: N, pub impulse: N, pub r: N, } @@ -109,17 +94,12 @@ impl VelocityGroundConstraintNormalPart { Self { gcross2: na::zero(), rhs: na::zero(), + rhs_wo_bias: na::zero(), impulse: na::zero(), r: na::zero(), } } - #[inline] - pub fn warmstart(&self, dir1: &Vector, im2: N, mj_lambda2: &mut DeltaVel) { - mj_lambda2.linear += dir1 * (-im2 * self.impulse); - mj_lambda2.angular += self.gcross2 * self.impulse; - } - #[inline] pub fn solve(&mut self, dir1: &Vector, im2: N, mj_lambda2: &mut DeltaVel) where @@ -151,29 +131,6 @@ impl VelocityGroundConstraintElement { } } - #[inline] - pub fn warmstart_group( - elements: &[Self], - dir1: &Vector, - #[cfg(feature = "dim3")] tangent1: &Vector, - im2: N, - mj_lambda2: &mut DeltaVel, - ) where - Vector: WBasis, - AngVector: WDot, Result = N>, - N::Element: SimdRealField + Copy, - { - #[cfg(feature = "dim3")] - let tangents1 = [tangent1, &dir1.cross(&tangent1)]; - #[cfg(feature = "dim2")] - let tangents1 = [&dir1.orthonormal_vector()]; - - for element in elements { - element.normal_part.warmstart(dir1, im2, mj_lambda2); - element.tangent_part.warmstart(tangents1, im2, mj_lambda2); - } - } - #[inline] pub fn solve_group( elements: &mut [Self], @@ -182,26 +139,32 @@ impl VelocityGroundConstraintElement { im2: N, limit: N, mj_lambda2: &mut DeltaVel, + solve_normal: bool, + solve_friction: bool, ) where Vector: WBasis, AngVector: WDot, Result = N>, N::Element: SimdRealField + Copy, { - // Solve friction. - #[cfg(feature = "dim3")] - let tangents1 = [tangent1, &dir1.cross(&tangent1)]; - #[cfg(feature = "dim2")] - let tangents1 = [&dir1.orthonormal_vector()]; - - for element in elements.iter_mut() { - let limit = limit * element.normal_part.impulse; - let part = &mut element.tangent_part; - part.solve(tangents1, im2, limit, mj_lambda2); + // Solve penetration. + if solve_normal { + for element in elements.iter_mut() { + element.normal_part.solve(&dir1, im2, mj_lambda2); + } } - // Solve penetration. - for element in elements.iter_mut() { - element.normal_part.solve(&dir1, im2, mj_lambda2); + // Solve friction. + if solve_friction { + #[cfg(feature = "dim3")] + let tangents1 = [tangent1, &dir1.cross(&tangent1)]; + #[cfg(feature = "dim2")] + let tangents1 = [&dir1.orthonormal_vector()]; + + for element in elements.iter_mut() { + let limit = limit * element.normal_part.impulse; + let part = &mut element.tangent_part; + part.solve(tangents1, im2, limit, mj_lambda2); + } } } } -- cgit