aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/velocity_ground_constraint.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamics/solver/velocity_ground_constraint.rs')
-rw-r--r--src/dynamics/solver/velocity_ground_constraint.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/dynamics/solver/velocity_ground_constraint.rs b/src/dynamics/solver/velocity_ground_constraint.rs
index a3a5563..4e195cd 100644
--- a/src/dynamics/solver/velocity_ground_constraint.rs
+++ b/src/dynamics/solver/velocity_ground_constraint.rs
@@ -64,6 +64,8 @@ impl VelocityGroundConstraint {
push: bool,
) {
let inv_dt = params.inv_dt();
+ let velocity_based_erp_inv_dt = params.velocity_based_erp_inv_dt();
+
let mut rb1 = &bodies[manifold.data.body_pair.body1];
let mut rb2 = &bodies[manifold.data.body_pair.body2];
let flipped = manifold.data.relative_dominance < 0;
@@ -156,16 +158,18 @@ impl VelocityGroundConstraint {
let r = 1.0 / (rb2.effective_inv_mass + 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 *= is_bouncy + is_resting * params.velocity_solve_fraction;
+ rhs += is_resting * velocity_based_erp_inv_dt * manifold_point.dist.min(0.0);
constraint.elements[k].normal_part = VelocityGroundConstraintElementPart {
gcross2,
rhs,
- impulse,
+ impulse: manifold_point.data.impulse * warmstart_coeff,
r,
};
}