aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/joint
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamics/joint')
-rw-r--r--src/dynamics/joint/generic_joint.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/dynamics/joint/generic_joint.rs b/src/dynamics/joint/generic_joint.rs
index cfea537..2aa9a51 100644
--- a/src/dynamics/joint/generic_joint.rs
+++ b/src/dynamics/joint/generic_joint.rs
@@ -1,4 +1,6 @@
+use crate::dynamics::RevoluteJoint;
use crate::math::{Isometry, Real, SpacialVector, SPATIAL_DIM};
+use crate::na::{Rotation3, UnitQuaternion};
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
@@ -44,3 +46,19 @@ impl GenericJoint {
}
}
}
+
+impl From<RevoluteJoint> for GenericJoint {
+ fn from(joint: RevoluteJoint) -> Self {
+ let basis1 = [joint.local_axis1, joint.basis1[0], joint.basis1[1]];
+ let basis2 = [joint.local_axis2, joint.basis2[0], joint.basis2[1]];
+ let quat1 = UnitQuaternion::from_basis_unchecked(&basis1[..]);
+ let quat2 = UnitQuaternion::from_basis_unchecked(&basis2[..]);
+ let local_anchor1 = Isometry::from_parts(joint.local_anchor1.coords.into(), quat1);
+ let local_anchor2 = Isometry::from_parts(joint.local_anchor2.coords.into(), quat2);
+
+ let mut result = Self::new(local_anchor1, local_anchor2);
+ result.min_position[3] = -Real::MAX;
+ result.max_position[3] = Real::MAX;
+ result
+ }
+}