aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/joint_constraint/generic_position_constraint.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-02-11 18:52:07 +0100
committerCrozet Sébastien <developer@crozet.re>2021-02-11 18:52:07 +0100
commitcc80e40067d100d0f519c9a20abb020726dd8514 (patch)
treec182c675e883b7e29eb38932d6f702af707dbd8c /src/dynamics/solver/joint_constraint/generic_position_constraint.rs
parent5b80c4efbf93ad1294c9d3d390d8c8f090681b0e (diff)
downloadrapier-cc80e40067d100d0f519c9a20abb020726dd8514.tar.gz
rapier-cc80e40067d100d0f519c9a20abb020726dd8514.tar.bz2
rapier-cc80e40067d100d0f519c9a20abb020726dd8514.zip
More experiments with the way the generic joint is stabilized.
Diffstat (limited to 'src/dynamics/solver/joint_constraint/generic_position_constraint.rs')
-rw-r--r--src/dynamics/solver/joint_constraint/generic_position_constraint.rs57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/dynamics/solver/joint_constraint/generic_position_constraint.rs b/src/dynamics/solver/joint_constraint/generic_position_constraint.rs
index f5138ea..1e80311 100644
--- a/src/dynamics/solver/joint_constraint/generic_position_constraint.rs
+++ b/src/dynamics/solver/joint_constraint/generic_position_constraint.rs
@@ -1,4 +1,5 @@
use super::{GenericVelocityConstraint, GenericVelocityGroundConstraint};
+use crate::dynamics::solver::DeltaVel;
use crate::dynamics::{GenericJoint, IntegrationParameters, RigidBody};
use crate::math::{
AngDim, AngVector, AngularInertia, Dim, Isometry, Point, Real, Rotation, SpatialVector, Vector,
@@ -22,9 +23,6 @@ pub(crate) struct GenericPositionConstraint {
ii2: AngularInertia<Real>,
joint: GenericJoint,
-
- lin_impulse: Cell<Vector3<Real>>,
- ang_impulse: Cell<Vector3<Real>>,
}
impl GenericPositionConstraint {
@@ -58,7 +56,11 @@ impl GenericPositionConstraint {
let r1 = Point::from(anchor1.translation.vector) - position1 * self.local_com1;
let r2 = Point::from(anchor2.translation.vector) - position2 * self.local_com2;
- let delta_pos = anchor1.inverse() * anchor2;
+ let delta_pos = Isometry::from_parts(
+ anchor2.translation * anchor1.translation.inverse(),
+ anchor2.rotation * anchor1.rotation.inverse(),
+ );
+
let mass_matrix = GenericVelocityConstraint::compute_mass_matrix(
&self.joint,
self.im1,
@@ -70,11 +72,15 @@ impl GenericPositionConstraint {
false,
);
- let lin_err = delta_pos.translation.vector * params.joint_erp;
- let ang_err = delta_pos.rotation.scaled_axis() * params.joint_erp;
- let err = Vector6::new(
- lin_err.x, lin_err.y, lin_err.z, ang_err.x, ang_err.y, ang_err.z,
+ let lin_dpos = delta_pos.translation.vector;
+ let ang_dpos = delta_pos.rotation.scaled_axis();
+ let dpos = Vector6::new(
+ lin_dpos.x, lin_dpos.y, lin_dpos.z, ang_dpos.x, ang_dpos.y, ang_dpos.z,
);
+ let err = dpos
+ - dpos
+ .sup(&self.joint.min_position)
+ .inf(&self.joint.max_position);
let impulse = mass_matrix * err;
let lin_impulse = impulse.xyz();
let ang_impulse = Vector3::new(impulse[3], impulse[4], impulse[5]);
@@ -94,6 +100,15 @@ impl GenericPositionConstraint {
positions[self.position1 as usize] = position1;
positions[self.position2 as usize] = position2;
}
+
+ pub fn solve2(
+ &self,
+ params: &IntegrationParameters,
+ positions: &mut [Isometry<Real>],
+ dpos: &mut [DeltaVel<Real>],
+ ) {
+ return;
+ }
}
#[derive(Debug)]
@@ -142,7 +157,10 @@ impl GenericPositionGroundConstraint {
let anchor2 = position2 * self.local_anchor2;
let r2 = Point::from(anchor2.translation.vector) - position2 * self.local_com2;
- let delta_pos = self.anchor1.inverse() * anchor2;
+ let delta_pos = Isometry::from_parts(
+ anchor2.translation * self.anchor1.translation.inverse(),
+ anchor2.rotation * self.anchor1.rotation.inverse(),
+ );
let mass_matrix = GenericVelocityGroundConstraint::compute_mass_matrix(
&self.joint,
self.im2,
@@ -151,11 +169,15 @@ impl GenericPositionGroundConstraint {
false,
);
- let lin_err = delta_pos.translation.vector * params.joint_erp;
- let ang_err = Vector3::zeros(); // delta_pos.rotation.scaled_axis() * params.joint_erp;
- let err = Vector6::new(
- lin_err.x, lin_err.y, lin_err.z, ang_err.x, ang_err.y, ang_err.z,
+ let lin_dpos = delta_pos.translation.vector;
+ let ang_dpos = delta_pos.rotation.scaled_axis();
+ let dpos = Vector6::new(
+ lin_dpos.x, lin_dpos.y, lin_dpos.z, ang_dpos.x, ang_dpos.y, ang_dpos.z,
);
+ let err = dpos
+ - dpos
+ .sup(&self.joint.min_position)
+ .inf(&self.joint.max_position);
let impulse = mass_matrix * err;
let lin_impulse = impulse.xyz();
let ang_impulse = Vector3::new(impulse[3], impulse[4], impulse[5]);
@@ -168,4 +190,13 @@ impl GenericPositionGroundConstraint {
positions[self.position2 as usize] = position2;
}
+
+ pub fn solve2(
+ &self,
+ params: &IntegrationParameters,
+ positions: &mut [Isometry<Real>],
+ dpos: &mut [DeltaVel<Real>],
+ ) {
+ return;
+ }
}