From 754a48b7ff6d8c58b1ee08651e60112900b60455 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Tue, 25 Aug 2020 22:10:25 +0200 Subject: First public release of Rapier. --- src/dynamics/joint/revolute_joint.rs | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/dynamics/joint/revolute_joint.rs (limited to 'src/dynamics/joint/revolute_joint.rs') diff --git a/src/dynamics/joint/revolute_joint.rs b/src/dynamics/joint/revolute_joint.rs new file mode 100644 index 0000000..cdb424b --- /dev/null +++ b/src/dynamics/joint/revolute_joint.rs @@ -0,0 +1,46 @@ +use crate::math::{Point, Vector}; +use crate::utils::WBasis; +use na::{Unit, Vector5}; + +#[derive(Copy, Clone)] +#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))] +/// A joint that removes all relative motion between two bodies, except for the rotations along one axis. +pub struct RevoluteJoint { + /// Where the revolute joint is attached on the first body, expressed in the local space of the first attached body. + pub local_anchor1: Point, + /// Where the revolute joint is attached on the second body, expressed in the local space of the second attached body. + pub local_anchor2: Point, + /// The rotation axis of this revolute joint expressed in the local space of the first attached body. + pub local_axis1: Unit>, + /// The rotation axis of this revolute joint expressed in the local space of the second attached body. + pub local_axis2: Unit>, + /// The basis orthonormal to `local_axis1`, expressed in the local space of the first attached body. + pub basis1: [Vector; 2], + /// The basis orthonormal to `local_axis2`, expressed in the local space of the second attached body. + pub basis2: [Vector; 2], + /// The impulse applied by this joint on the first body. + /// + /// The impulse applied to the second body is given by `-impulse`. + pub impulse: Vector5, +} + +impl RevoluteJoint { + /// Creates a new revolute joint with the given point of applications and axis, all expressed + /// in the local-space of the affected bodies. + pub fn new( + local_anchor1: Point, + local_axis1: Unit>, + local_anchor2: Point, + local_axis2: Unit>, + ) -> Self { + Self { + local_anchor1, + local_anchor2, + local_axis1, + local_axis2, + basis1: local_axis1.orthonormal_basis(), + basis2: local_axis2.orthonormal_basis(), + impulse: na::zero(), + } + } +} -- cgit