aboutsummaryrefslogtreecommitdiff
path: root/src/dynamics/solver/joint_constraint/revolute_position_constraint.rs
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2021-04-26 17:59:25 +0200
committerCrozet Sébastien <developer@crozet.re>2021-04-26 18:00:50 +0200
commitc32da78f2a6014c491aa3e975fb83ddb7c80610e (patch)
treeedd20f23270baee1577c486f78d825eb93ea0de0 /src/dynamics/solver/joint_constraint/revolute_position_constraint.rs
parentaaf80bfa872c6f29b248cab8eb5658ab0d73cb4a (diff)
downloadrapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.gz
rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.tar.bz2
rapier-c32da78f2a6014c491aa3e975fb83ddb7c80610e.zip
Split rigid-bodies and colliders into multiple components
Diffstat (limited to 'src/dynamics/solver/joint_constraint/revolute_position_constraint.rs')
-rw-r--r--src/dynamics/solver/joint_constraint/revolute_position_constraint.rs60
1 files changed, 36 insertions, 24 deletions
diff --git a/src/dynamics/solver/joint_constraint/revolute_position_constraint.rs b/src/dynamics/solver/joint_constraint/revolute_position_constraint.rs
index 96391a2..1b3e23a 100644
--- a/src/dynamics/solver/joint_constraint/revolute_position_constraint.rs
+++ b/src/dynamics/solver/joint_constraint/revolute_position_constraint.rs
@@ -1,4 +1,6 @@
-use crate::dynamics::{IntegrationParameters, RevoluteJoint, RigidBody};
+use crate::dynamics::{
+ IntegrationParameters, RevoluteJoint, RigidBodyIds, RigidBodyMassProps, RigidBodyPosition,
+};
use crate::math::{AngularInertia, Isometry, Point, Real, Rotation, Vector};
use crate::utils::{WAngularInertia, WCross, WCrossMatrix};
use na::Unit;
@@ -29,11 +31,18 @@ pub(crate) struct RevolutePositionConstraint {
}
impl RevolutePositionConstraint {
- pub fn from_params(rb1: &RigidBody, rb2: &RigidBody, cparams: &RevoluteJoint) -> Self {
- let ii1 = rb1.effective_world_inv_inertia_sqrt.squared();
- let ii2 = rb2.effective_world_inv_inertia_sqrt.squared();
- let im1 = rb1.effective_inv_mass;
- let im2 = rb2.effective_inv_mass;
+ pub fn from_params(
+ rb1: (&RigidBodyMassProps, &RigidBodyIds),
+ rb2: (&RigidBodyMassProps, &RigidBodyIds),
+ cparams: &RevoluteJoint,
+ ) -> Self {
+ let (mprops1, ids1) = rb1;
+ let (mprops2, ids2) = rb2;
+
+ let ii1 = mprops1.effective_world_inv_inertia_sqrt.squared();
+ let ii2 = mprops2.effective_world_inv_inertia_sqrt.squared();
+ let im1 = mprops1.effective_inv_mass;
+ let im2 = mprops2.effective_inv_mass;
let ang_inv_lhs = (ii1 + ii2).inverse();
Self {
@@ -42,14 +51,14 @@ impl RevolutePositionConstraint {
ii1,
ii2,
ang_inv_lhs,
- local_com1: rb1.mass_properties.local_com,
- local_com2: rb2.mass_properties.local_com,
+ local_com1: mprops1.mass_properties.local_com,
+ local_com2: mprops2.mass_properties.local_com,
local_anchor1: cparams.local_anchor1,
local_anchor2: cparams.local_anchor2,
local_axis1: cparams.local_axis1,
local_axis2: cparams.local_axis2,
- position1: rb1.active_set_offset,
- position2: rb2.active_set_offset,
+ position1: ids1.active_set_offset,
+ position2: ids2.active_set_offset,
local_basis1: cparams.basis1,
local_basis2: cparams.basis2,
}
@@ -132,11 +141,14 @@ pub(crate) struct RevolutePositionGroundConstraint {
impl RevolutePositionGroundConstraint {
pub fn from_params(
- rb1: &RigidBody,
- rb2: &RigidBody,
+ rb1: &RigidBodyPosition,
+ rb2: (&RigidBodyMassProps, &RigidBodyIds),
cparams: &RevoluteJoint,
flipped: bool,
) -> Self {
+ let poss1 = rb1;
+ let (mprops2, ids2) = rb2;
+
let anchor1;
let local_anchor2;
let axis1;
@@ -145,23 +157,23 @@ impl RevolutePositionGroundConstraint {
let local_basis2;
if flipped {
- anchor1 = rb1.next_position * cparams.local_anchor2;
+ anchor1 = poss1.next_position * cparams.local_anchor2;
local_anchor2 = cparams.local_anchor1;
- axis1 = rb1.next_position * cparams.local_axis2;
+ axis1 = poss1.next_position * cparams.local_axis2;
local_axis2 = cparams.local_axis1;
basis1 = [
- rb1.next_position * cparams.basis2[0],
- rb1.next_position * cparams.basis2[1],
+ poss1.next_position * cparams.basis2[0],
+ poss1.next_position * cparams.basis2[1],
];
local_basis2 = cparams.basis1;
} else {
- anchor1 = rb1.next_position * cparams.local_anchor1;
+ anchor1 = poss1.next_position * cparams.local_anchor1;
local_anchor2 = cparams.local_anchor2;
- axis1 = rb1.next_position * cparams.local_axis1;
+ axis1 = poss1.next_position * cparams.local_axis1;
local_axis2 = cparams.local_axis2;
basis1 = [
- rb1.next_position * cparams.basis1[0],
- rb1.next_position * cparams.basis1[1],
+ poss1.next_position * cparams.basis1[0],
+ poss1.next_position * cparams.basis1[1],
];
local_basis2 = cparams.basis2;
};
@@ -169,12 +181,12 @@ impl RevolutePositionGroundConstraint {
Self {
anchor1,
local_anchor2,
- im2: rb2.effective_inv_mass,
- ii2: rb2.effective_world_inv_inertia_sqrt.squared(),
- local_com2: rb2.mass_properties.local_com,
+ im2: mprops2.effective_inv_mass,
+ ii2: mprops2.effective_world_inv_inertia_sqrt.squared(),
+ local_com2: mprops2.mass_properties.local_com,
axis1,
local_axis2,
- position2: rb2.active_set_offset,
+ position2: ids2.active_set_offset,
basis1,
local_basis2,
}