aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/velocity_solver.rs
diff options
context:
space:
mode:
authorEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-02-03 18:18:03 +0100
committerEmil Ernerfeldt <emil.ernerfeldt@gmail.com>2021-02-08 17:15:28 +0100
commitd999e0e8c61aa2f115dc256e8011543cda8af7ef (patch)
tree2248cea87b31398039e2d0f2ec9107c3285450b5 /src/dynamics/solver/velocity_solver.rs
parent17ef7e10f9235db12aaee98b5106201824d16bfc (diff)
downloadrapier-d999e0e8c61aa2f115dc256e8011543cda8af7ef.tar.gz
rapier-d999e0e8c61aa2f115dc256e8011543cda8af7ef.tar.bz2
rapier-d999e0e8c61aa2f115dc256e8011543cda8af7ef.zip
Apply accelerations during velocity solver
Closes https://github.com/dimforge/rapier/issues/97 Instead of applying accelerations from gravity and external forces as a separate step, this PR switches to applying them in the velocity solver.
Diffstat (limited to 'src/dynamics/solver/velocity_solver.rs')
-rw-r--r--src/dynamics/solver/velocity_solver.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/dynamics/solver/velocity_solver.rs b/src/dynamics/solver/velocity_solver.rs
index 89cf34e..4f35f3b 100644
--- a/src/dynamics/solver/velocity_solver.rs
+++ b/src/dynamics/solver/velocity_solver.rs
@@ -32,6 +32,18 @@ impl VelocitySolver {
self.mj_lambdas
.resize(bodies.active_island(island_id).len(), DeltaVel::zero());
+ // Initialize delta-velocities (`mj_lambdas`) with external forces (gravity etc):
+ bodies.foreach_active_island_body_mut_internal(island_id, |_, rb| {
+ let dvel = &mut self.mj_lambdas[rb.active_set_offset];
+
+ dvel.linear += rb.force * (rb.effective_inv_mass * params.dt);
+ rb.force = na::zero();
+
+ // dvel.angular is actually storing angular velocity delta multiplied by the square root of the inertia tensor:
+ dvel.angular += rb.effective_world_inv_inertia_sqrt * rb.torque * params.dt;
+ rb.torque = na::zero();
+ });
+
/*
* Warmstart constraints.
*/