aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-02-04 18:07:09 +0100
committerGitHub <noreply@github.com>2021-02-04 18:07:09 +0100
commita0230408252c9e3f06d4cee4c45831922df0143e (patch)
treef1e555b706450b046840c7868f98b1b628dea752
parent88cde90425364ee66b6b04f1c5e384423b96e369 (diff)
parent4c1aac25a7c27fe904a8b5af48d978c881f77b86 (diff)
downloadrapier-a0230408252c9e3f06d4cee4c45831922df0143e.tar.gz
rapier-a0230408252c9e3f06d4cee4c45831922df0143e.tar.bz2
rapier-a0230408252c9e3f06d4cee4c45831922df0143e.zip
Merge pull request #103 from EmbarkStudios/energy-inspection
Add functions for kinetic and potential energy of a RigidBody
-rw-r--r--src/dynamics/rigid_body.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/dynamics/rigid_body.rs b/src/dynamics/rigid_body.rs
index 5fb6183..d42de30 100644
--- a/src/dynamics/rigid_body.rs
+++ b/src/dynamics/rigid_body.rs
@@ -569,6 +569,36 @@ impl RigidBody {
let dpt = point - self.world_com;
self.linvel + self.angvel.gcross(dpt)
}
+
+ /// The kinetic energy of this body.
+ pub fn kinetic_energy(&self) -> Real {
+ let mut energy = (self.mass() * self.linvel().norm_squared()) / 2.0;
+
+ #[cfg(feature = "dim2")]
+ if !self.effective_world_inv_inertia_sqrt.is_zero() {
+ let inertia_sqrt = 1.0 / self.effective_world_inv_inertia_sqrt;
+ energy += (inertia_sqrt * self.angvel).powi(2) / 2.0;
+ }
+
+ #[cfg(feature = "dim3")]
+ if !self.effective_world_inv_inertia_sqrt.is_zero() {
+ let inertia_sqrt = self.effective_world_inv_inertia_sqrt.inverse_unchecked();
+ energy += (inertia_sqrt * self.angvel).norm_squared() / 2.0;
+ }
+
+ energy
+ }
+
+ /// The potential energy of this body in a gravity field.
+ pub fn gravitational_potential_energy(&self, dt: Real, gravity: Vector<Real>) -> Real {
+ let world_com = self.mass_properties().world_com(&self.position).coords;
+
+ // Project position back along velocity vector one half-step (leap-frog)
+ // to sync up the potential energy with the kinetic energy:
+ let world_com = world_com - self.linvel() * (dt / 2.0);
+
+ -self.mass() * self.gravity_scale() * gravity.dot(&world_com)
+ }
}
/// A builder for rigid-bodies.