diff options
| author | Sébastien Crozet <sebcrozet@dimforge.com> | 2024-04-21 18:55:11 +0200 |
|---|---|---|
| committer | Sébastien Crozet <sebastien@crozet.re> | 2024-04-30 23:10:46 +0200 |
| commit | f58b4f7c195ab7acf0778ea65c46ebf37ac8188c (patch) | |
| tree | 16a5009b1decbf0395b93657b5c992b277bff8f9 /src/dynamics/solver/velocity_solver.rs | |
| parent | da79d6fb5b28dd12e17ef4c8985fb589a37c9f9c (diff) | |
| download | rapier-f58b4f7c195ab7acf0778ea65c46ebf37ac8188c.tar.gz rapier-f58b4f7c195ab7acf0778ea65c46ebf37ac8188c.tar.bz2 rapier-f58b4f7c195ab7acf0778ea65c46ebf37ac8188c.zip | |
feat: add warmstarting to contact constraints resolution
Diffstat (limited to 'src/dynamics/solver/velocity_solver.rs')
| -rw-r--r-- | src/dynamics/solver/velocity_solver.rs | 56 |
1 files changed, 8 insertions, 48 deletions
diff --git a/src/dynamics/solver/velocity_solver.rs b/src/dynamics/solver/velocity_solver.rs index 85d2211..7ea48ab 100644 --- a/src/dynamics/solver/velocity_solver.rs +++ b/src/dynamics/solver/velocity_solver.rs @@ -1,5 +1,4 @@ use super::{JointConstraintTypes, SolverConstraintsSet}; -use crate::dynamics::integration_parameters::DISABLE_FRICTION_LIMIT_REAPPLY; use crate::dynamics::solver::solver_body::SolverBody; use crate::dynamics::{ solver::{ContactConstraintTypes, SolverVel}, @@ -180,6 +179,10 @@ impl VelocitySolver { joint_constraints.update(params, multibodies, &self.solver_bodies); contact_constraints.update(params, substep_id, multibodies, &self.solver_bodies); + if params.warmstart_coefficient != 0.0 { + contact_constraints.warmstart(&mut self.solver_vels, &mut self.generic_solver_vels); + } + for _ in 0..params.num_internal_pgs_iterations { joint_constraints.solve(&mut self.solver_vels, &mut self.generic_solver_vels); contact_constraints @@ -203,60 +206,17 @@ impl VelocitySolver { /* * Resolution without bias. */ - let compute_max_dlinvel = |vels: &[SolverVel<Real>]| { - vels.iter() - .map(|v| v.linear.norm()) - .max_by_key(|v| OrderedFloat(*v)) - .unwrap_or_default() - }; - - let mut prev_dlinvel = f32::MAX; - let mut prev_solver_vels = self.solver_vels.clone(); - - for kk in 0..params.max_internal_stabilization_iterations { - prev_solver_vels.clone_from_slice(&self.solver_vels); + for _ in 0..params.num_internal_stabilization_iterations { joint_constraints .solve_wo_bias(&mut self.solver_vels, &mut self.generic_solver_vels); contact_constraints.solve_restitution_wo_bias( &mut self.solver_vels, &mut self.generic_solver_vels, ); - - if DISABLE_FRICTION_LIMIT_REAPPLY { - contact_constraints - .solve_friction(&mut self.solver_vels, &mut self.generic_solver_vels); - } - - for (prev, new) in prev_solver_vels.iter_mut().zip(self.solver_vels.iter()) { - *prev -= *new; - } - - let new_max_linvel = compute_max_dlinvel(&self.solver_vels); - - println!(">> {} >> max_linvel: {}", kk, new_max_linvel); - - if new_max_linvel > prev_dlinvel { - break; - } - - prev_dlinvel = new_max_linvel; - - if prev_solver_vels - .iter() - .zip(self.solver_vels.iter()) - .all(|(diff, vels)| { - diff.linear.norm() < 1.0e-3 - || diff.linear.norm() <= 0.2 * vels.linear.norm() - }) - { - break; - } - - // if (new_max_dlinvel - max_dlinvel).abs() <= 0.2 * max_dlinvel { - // println!("Num effective stab steps: {}", kk + 1); - // break; - // } } + + contact_constraints + .solve_friction(&mut self.solver_vels, &mut self.generic_solver_vels); } } |
