Fix velocity computation for position-based kinematic bodies

This commit is contained in:
Sébastien Crozet
2021-09-12 09:53:50 +02:00
committed by Sébastien Crozet
parent 291be142a5
commit b364a2b052
3 changed files with 70 additions and 31 deletions

View File

@@ -147,8 +147,11 @@ impl RigidBodyPosition {
/// Computes the velocity need to travel from `self.position` to `self.next_position` in
/// a time equal to `1.0 / inv_dt`.
#[must_use]
pub fn interpolate_velocity(&self, inv_dt: Real) -> RigidBodyVelocity {
let dpos = self.next_position * self.position.inverse();
pub fn interpolate_velocity(&self, inv_dt: Real, local_com: &Point<Real>) -> RigidBodyVelocity {
let com = self.position * local_com;
let shift = Translation::from(com.coords);
let dpos = shift.inverse() * self.next_position * self.position.inverse() * shift;
let angvel;
#[cfg(feature = "dim2")]
{
@@ -159,6 +162,7 @@ impl RigidBodyPosition {
angvel = dpos.rotation.scaled_axis() * inv_dt;
}
let linvel = dpos.translation.vector * inv_dt;
RigidBodyVelocity { linvel, angvel }
}

View File

@@ -450,7 +450,10 @@ impl PhysicsPipeline {
match rb_type {
RigidBodyType::KinematicPositionBased => {
let rb_pos: &RigidBodyPosition = bodies.index(handle.0);
let new_vel = rb_pos.interpolate_velocity(integration_parameters.inv_dt());
let new_vel = rb_pos.interpolate_velocity(
integration_parameters.inv_dt(),
&rb_mprops.local_mprops.local_com,
);
bodies.set_internal(handle.0, new_vel);
}
RigidBodyType::KinematicVelocityBased => {