Add the ability to disable contacts between two rigid-bodies attached by joints

This commit is contained in:
Sébastien Crozet
2022-06-23 16:23:39 +02:00
parent cd0be8c076
commit 5063f3bb4f
12 changed files with 197 additions and 14 deletions

View File

@@ -321,6 +321,41 @@ impl MultibodyJointSet {
))
}
/// Returns the the joint between two rigid-bodies (if it exists).
pub fn joint_between(
&self,
rb1: RigidBodyHandle,
rb2: RigidBodyHandle,
) -> Option<(MultibodyJointHandle, &Multibody, &MultibodyLink)> {
let id1 = self.rb2mb.get(rb1.0)?;
let id2 = self.rb2mb.get(rb2.0)?;
// Both bodies must be part of the same multibody.
if id1.multibody != id2.multibody {
return None;
}
let mb = self.multibodies.get(id1.multibody.0)?;
// NOTE: if there is a joint between these two bodies, then
// one of the bodies must be the parent of the other.
let link1 = mb.link(id1.id)?;
let parent1 = link1.parent_id()?;
if parent1 == id2.id {
Some((MultibodyJointHandle(rb1.0), mb, &link1))
} else {
let link2 = mb.link(id2.id)?;
let parent2 = link2.parent_id()?;
if parent2 == id1.id {
Some((MultibodyJointHandle(rb2.0), mb, &link2))
} else {
None
}
}
}
/// Iterates through all the joints attached to the given rigid-body.
pub fn attached_joints(
&self,