aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/rigid_body.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/rigid_body.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/rigid_body.rs')
-rw-r--r--src/dynamics/rigid_body.rs16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs
index 210713b..7d9f964 100644
--- a/src/dynamics/rigid_body.rs
+++ b/src/dynamics/rigid_body.rs
@@ -135,16 +135,20 @@ impl RigidBody {
self.active_set_timestamp = 0;
}
- pub(crate) fn integrate_accelerations(&mut self, dt: Real, gravity: Vector<Real>) {
+ pub(crate) fn add_gravity(&mut self, gravity: Vector<Real>) {
if self.effective_inv_mass != 0.0 {
- let acceleration = self.force * self.effective_inv_mass;
- self.linvel += (gravity * self.gravity_scale + acceleration) * dt;
- self.force = na::zero();
+ self.force += gravity * self.gravity_scale * self.mass();
}
+ }
- let angular_acceleration = self.effective_world_inv_inertia_sqrt
+ pub(crate) fn integrate_accelerations(&mut self, dt: Real) {
+ let linear_acc = self.force * self.effective_inv_mass;
+ let angular_acc = self.effective_world_inv_inertia_sqrt
* (self.effective_world_inv_inertia_sqrt * self.torque);
- self.angvel += angular_acceleration * dt;
+
+ self.linvel += linear_acc * dt;
+ self.angvel += angular_acc * dt;
+ self.force = na::zero();
self.torque = na::zero();
}