diff options
| author | Emil Ernerfeldt <emil.ernerfeldt@gmail.com> | 2021-02-15 20:52:16 +0100 |
|---|---|---|
| committer | Emil Ernerfeldt <emil.ernerfeldt@gmail.com> | 2021-02-26 11:06:29 +0100 |
| commit | 21247a123691de7a5f53454c7edba838af83c594 (patch) | |
| tree | c9d30057755ce91c581845af1eefe0e19b0a0c9f /src/dynamics/solver/velocity_constraint.rs | |
| parent | 1c5601c84bf5ca3b7fd611cc4b4fd7030526f71f (diff) | |
| download | rapier-21247a123691de7a5f53454c7edba838af83c594.tar.gz rapier-21247a123691de7a5f53454c7edba838af83c594.tar.bz2 rapier-21247a123691de7a5f53454c7edba838af83c594.zip | |
Add restorative impulse in velocity solver
Diffstat (limited to 'src/dynamics/solver/velocity_constraint.rs')
| -rw-r--r-- | src/dynamics/solver/velocity_constraint.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/dynamics/solver/velocity_constraint.rs b/src/dynamics/solver/velocity_constraint.rs index abc46c9..dff8ff0 100644 --- a/src/dynamics/solver/velocity_constraint.rs +++ b/src/dynamics/solver/velocity_constraint.rs @@ -244,17 +244,22 @@ impl VelocityConstraint { + gcross2.gdot(gcross2)); let is_bouncy = manifold_point.is_bouncy() as u32 as Real; - let rhs = (1.0 + is_bouncy * manifold_point.restitution) - * (vel1 - vel2).dot(&force_dir1) - + manifold_point.dist.max(0.0) * inv_dt; + let is_resting = 1.0 - is_bouncy; - let impulse = manifold_point.data.impulse * warmstart_coeff; + let mut rhs = (1.0 + is_bouncy * manifold_point.restitution) + * (vel1 - vel2).dot(&force_dir1); + rhs += manifold_point.dist.max(0.0) * inv_dt; + rhs *= params.velocity_solve_fraction; + rhs += is_resting + * params.velocity_based_erp + * inv_dt + * manifold_point.dist.min(0.0); constraint.elements[k].normal_part = VelocityConstraintElementPart { gcross1, gcross2, rhs, - impulse, + impulse: manifold_point.data.impulse * warmstart_coeff, r, }; } |
