Add constructors with local-space anchor/axis to BallAndSocketJointInfo, HingeJointInfo, SliderJointInfo, FixedJointInfo
This commit is contained in:
parent
c952fcf8c3
commit
9fb1e39798
|
@ -9,6 +9,7 @@ do not hesitate to take a look at the user manual.
|
||||||
|
|
||||||
- Method RigidBody::resetForce() to reset the accumulated external force on a rigid body has beend added
|
- Method RigidBody::resetForce() to reset the accumulated external force on a rigid body has beend added
|
||||||
- Method RigidBody::resetTorque() to reset the accumulated external torque on a rigid body has beend added
|
- Method RigidBody::resetTorque() to reset the accumulated external torque on a rigid body has beend added
|
||||||
|
- Constructors with local-space anchor/axis have been added to BallAndSocketJointInfo, HingeJointInfo, FixedJointInfo and SliderJointInfo classes
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
@ -16,6 +17,8 @@ do not hesitate to take a look at the user manual.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- Issue with concave vs convex shape collision detection has been fixed
|
||||||
|
|
||||||
## Version 0.8.0 (May 31, 2020)
|
## Version 0.8.0 (May 31, 2020)
|
||||||
|
|
||||||
Note that this release contains some public API changes. Please read carefully the following changes before upgrading to this new version and
|
Note that this release contains some public API changes. Please read carefully the following changes before upgrading to this new version and
|
||||||
|
|
|
@ -43,9 +43,18 @@ struct BallAndSocketJointInfo : public JointInfo {
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
||||||
|
/// True if this object has been constructed using local-space anchors
|
||||||
|
bool isUsingLocalSpaceAnchors;
|
||||||
|
|
||||||
/// Anchor point (in world-space coordinates)
|
/// Anchor point (in world-space coordinates)
|
||||||
Vector3 anchorPointWorldSpace;
|
Vector3 anchorPointWorldSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 1 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 2 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 Pointer to the first body of the joint
|
* @param rigidBody1 Pointer to the first body of the joint
|
||||||
|
@ -56,7 +65,23 @@ struct BallAndSocketJointInfo : public JointInfo {
|
||||||
BallAndSocketJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
BallAndSocketJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
const Vector3& initAnchorPointWorldSpace)
|
const Vector3& initAnchorPointWorldSpace)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::BALLSOCKETJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::BALLSOCKETJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace) {}
|
anchorPointWorldSpace(initAnchorPointWorldSpace) {}
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 Pointer to the first body of the joint
|
||||||
|
* @param rigidBody2 Pointer to the second body of the joint
|
||||||
|
* @param anchorPointBody1LocalSpace The anchor point on body 1 in local-space coordinates
|
||||||
|
* @param anchorPointBody2LocalSpace The anchor point on body 2 in local-space coordinates
|
||||||
|
*/
|
||||||
|
BallAndSocketJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1LocalSpace,
|
||||||
|
const Vector3& anchorPointBody2LocalSpace)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::BALLSOCKETJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1LocalSpace),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2LocalSpace) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class BallAndSocketJoint
|
// Class BallAndSocketJoint
|
||||||
|
|
|
@ -43,9 +43,18 @@ struct FixedJointInfo : public JointInfo {
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
||||||
|
/// True if this object has been constructed using local-space anchors
|
||||||
|
bool isUsingLocalSpaceAnchors;
|
||||||
|
|
||||||
/// Anchor point (in world-space coordinates)
|
/// Anchor point (in world-space coordinates)
|
||||||
Vector3 anchorPointWorldSpace;
|
Vector3 anchorPointWorldSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 1 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 2 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
|
@ -56,7 +65,23 @@ struct FixedJointInfo : public JointInfo {
|
||||||
FixedJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
FixedJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
const Vector3& initAnchorPointWorldSpace)
|
const Vector3& initAnchorPointWorldSpace)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::FIXEDJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::FIXEDJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace){}
|
anchorPointWorldSpace(initAnchorPointWorldSpace){}
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 Pointer to the first body of the joint
|
||||||
|
* @param rigidBody2 Pointer to the second body of the joint
|
||||||
|
* @param anchorPointBody1LocalSpace The anchor point on body 1 in local-space coordinates
|
||||||
|
* @param anchorPointBody2LocalSpace The anchor point on body 2 in local-space coordinates
|
||||||
|
*/
|
||||||
|
FixedJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1LocalSpace,
|
||||||
|
const Vector3& anchorPointBody2LocalSpace)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::FIXEDJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1LocalSpace),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2LocalSpace) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class FixedJoint
|
// Class FixedJoint
|
||||||
|
|
|
@ -43,12 +43,27 @@ struct HingeJointInfo : public JointInfo {
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
||||||
|
/// True if this object has been constructed using local-space anchors
|
||||||
|
bool isUsingLocalSpaceAnchors;
|
||||||
|
|
||||||
/// Anchor point (in world-space coordinates)
|
/// Anchor point (in world-space coordinates)
|
||||||
Vector3 anchorPointWorldSpace;
|
Vector3 anchorPointWorldSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 1 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 2 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
/// Hinge rotation axis (in world-space coordinates)
|
/// Hinge rotation axis (in world-space coordinates)
|
||||||
Vector3 rotationAxisWorld;
|
Vector3 rotationAxisWorld;
|
||||||
|
|
||||||
|
/// Hinge rotation axis of body 1 (in local-space coordinates)
|
||||||
|
Vector3 rotationAxisBody1Local;
|
||||||
|
|
||||||
|
/// Hinge rotation axis of body 2 (in local-space coordinates)
|
||||||
|
Vector3 rotationAxisBody2Local;
|
||||||
|
|
||||||
/// True if the hinge joint limits are enabled
|
/// True if the hinge joint limits are enabled
|
||||||
bool isLimitEnabled;
|
bool isLimitEnabled;
|
||||||
|
|
||||||
|
@ -70,7 +85,7 @@ struct HingeJointInfo : public JointInfo {
|
||||||
/// to desired motor speed
|
/// to desired motor speed
|
||||||
decimal maxMotorTorque;
|
decimal maxMotorTorque;
|
||||||
|
|
||||||
/// Constructor without limits and without motor
|
/// Constructor without limits and without motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -83,12 +98,13 @@ struct HingeJointInfo : public JointInfo {
|
||||||
const Vector3& initAnchorPointWorldSpace,
|
const Vector3& initAnchorPointWorldSpace,
|
||||||
const Vector3& initRotationAxisWorld)
|
const Vector3& initRotationAxisWorld)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(false),
|
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(false),
|
||||||
isMotorEnabled(false), minAngleLimit(-1), maxAngleLimit(1),
|
isMotorEnabled(false), minAngleLimit(-1), maxAngleLimit(1),
|
||||||
motorSpeed(0), maxMotorTorque(0) {}
|
motorSpeed(0), maxMotorTorque(0) {}
|
||||||
|
|
||||||
/// Constructor with limits but without motor
|
/// Constructor with limits but without motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -102,13 +118,14 @@ struct HingeJointInfo : public JointInfo {
|
||||||
const Vector3& initRotationAxisWorld,
|
const Vector3& initRotationAxisWorld,
|
||||||
decimal initMinAngleLimit, decimal initMaxAngleLimit)
|
decimal initMinAngleLimit, decimal initMaxAngleLimit)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
|
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
|
||||||
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
||||||
maxAngleLimit(initMaxAngleLimit), motorSpeed(0),
|
maxAngleLimit(initMaxAngleLimit), motorSpeed(0),
|
||||||
maxMotorTorque(0) {}
|
maxMotorTorque(0) {}
|
||||||
|
|
||||||
/// Constructor with limits and motor
|
/// Constructor with limits and motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -125,11 +142,95 @@ struct HingeJointInfo : public JointInfo {
|
||||||
decimal initMinAngleLimit, decimal initMaxAngleLimit,
|
decimal initMinAngleLimit, decimal initMaxAngleLimit,
|
||||||
decimal initMotorSpeed, decimal initMaxMotorTorque)
|
decimal initMotorSpeed, decimal initMaxMotorTorque)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
|
rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
|
||||||
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
||||||
maxAngleLimit(initMaxAngleLimit), motorSpeed(initMotorSpeed),
|
maxAngleLimit(initMaxAngleLimit), motorSpeed(initMotorSpeed),
|
||||||
maxMotorTorque(initMaxMotorTorque) {}
|
maxMotorTorque(initMaxMotorTorque) {}
|
||||||
|
|
||||||
|
/// Constructor without limits and without motor with local-space anchors
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param rotationBody1AxisLocal The initial rotation axis on body 1 in local-space
|
||||||
|
* @param rotationBody2AxisLocal The initial rotation axis on body 2 in local-space
|
||||||
|
*/
|
||||||
|
HingeJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& rotationBody1AxisLocal,
|
||||||
|
const Vector3& rotationBody2AxisLocal)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
rotationAxisBody1Local(rotationBody1AxisLocal),
|
||||||
|
rotationAxisBody2Local(rotationBody2AxisLocal),
|
||||||
|
isLimitEnabled(false),
|
||||||
|
isMotorEnabled(false), minAngleLimit(-1), maxAngleLimit(1),
|
||||||
|
motorSpeed(0), maxMotorTorque(0) {}
|
||||||
|
|
||||||
|
/// Constructor with limits but without motor with local-space anchors
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param rotationBody1AxisLocal The initial rotation axis on body 1 in local-space
|
||||||
|
* @param rotationBody2AxisLocal The initial rotation axis on body 2 in local-space
|
||||||
|
* @param initMinAngleLimit The initial minimum limit angle (in radian)
|
||||||
|
* @param initMaxAngleLimit The initial maximum limit angle (in radian)
|
||||||
|
*/
|
||||||
|
HingeJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& rotationBody1AxisLocal,
|
||||||
|
const Vector3& rotationBody2AxisLocal,
|
||||||
|
decimal initMinAngleLimit, decimal initMaxAngleLimit)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
rotationAxisBody1Local(rotationBody1AxisLocal),
|
||||||
|
rotationAxisBody2Local(rotationBody2AxisLocal),
|
||||||
|
isLimitEnabled(true),
|
||||||
|
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
||||||
|
maxAngleLimit(initMaxAngleLimit), motorSpeed(0),
|
||||||
|
maxMotorTorque(0) {}
|
||||||
|
|
||||||
|
/// Constructor with limits and motor with local-space anchors
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param rotationBody1AxisLocal The initial rotation axis on body 1 in local-space
|
||||||
|
* @param rotationBody2AxisLocal The initial rotation axis on body 2 in local-space
|
||||||
|
* @param initMinAngleLimit The initial minimum limit angle (in radian)
|
||||||
|
* @param initMaxAngleLimit The initial maximum limit angle (in radian)
|
||||||
|
* @param initMotorSpeed The initial motor speed of the joint (in radian per second)
|
||||||
|
* @param initMaxMotorTorque The initial maximum motor torque (in Newtons)
|
||||||
|
*/
|
||||||
|
HingeJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& rotationBody1AxisLocal,
|
||||||
|
const Vector3& rotationBody2AxisLocal,
|
||||||
|
decimal initMinAngleLimit, decimal initMaxAngleLimit,
|
||||||
|
decimal initMotorSpeed, decimal initMaxMotorTorque)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
rotationAxisBody1Local(rotationBody1AxisLocal),
|
||||||
|
rotationAxisBody2Local(rotationBody2AxisLocal),
|
||||||
|
isLimitEnabled(true),
|
||||||
|
isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
|
||||||
|
maxAngleLimit(initMaxAngleLimit), motorSpeed(initMotorSpeed),
|
||||||
|
maxMotorTorque(initMaxMotorTorque) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class HingeJoint
|
// Class HingeJoint
|
||||||
|
|
|
@ -47,12 +47,24 @@ struct SliderJointInfo : public JointInfo {
|
||||||
|
|
||||||
// -------------------- Attributes -------------------- //
|
// -------------------- Attributes -------------------- //
|
||||||
|
|
||||||
|
/// True if this object has been constructed using local-space anchors
|
||||||
|
bool isUsingLocalSpaceAnchors;
|
||||||
|
|
||||||
/// Anchor point (in world-space coordinates)
|
/// Anchor point (in world-space coordinates)
|
||||||
Vector3 anchorPointWorldSpace;
|
Vector3 anchorPointWorldSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 1 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
|
|
||||||
|
/// Anchor point on body 2 (in local-space coordinates)
|
||||||
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
/// Slider axis (in world-space coordinates)
|
/// Slider axis (in world-space coordinates)
|
||||||
Vector3 sliderAxisWorldSpace;
|
Vector3 sliderAxisWorldSpace;
|
||||||
|
|
||||||
|
/// Hinge slider axis of body 1 (in local-space coordinates)
|
||||||
|
Vector3 sliderAxisBody1Local;
|
||||||
|
|
||||||
/// True if the slider limits are enabled
|
/// True if the slider limits are enabled
|
||||||
bool isLimitEnabled;
|
bool isLimitEnabled;
|
||||||
|
|
||||||
|
@ -71,7 +83,7 @@ struct SliderJointInfo : public JointInfo {
|
||||||
/// Maximum motor force (in Newtons) that can be applied to reach to desired motor speed
|
/// Maximum motor force (in Newtons) that can be applied to reach to desired motor speed
|
||||||
decimal maxMotorForce;
|
decimal maxMotorForce;
|
||||||
|
|
||||||
/// Constructor without limits and without motor
|
/// Constructor without limits and without motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -82,12 +94,13 @@ struct SliderJointInfo : public JointInfo {
|
||||||
const Vector3& initAnchorPointWorldSpace,
|
const Vector3& initAnchorPointWorldSpace,
|
||||||
const Vector3& initSliderAxisWorldSpace)
|
const Vector3& initSliderAxisWorldSpace)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
||||||
isLimitEnabled(false), isMotorEnabled(false), minTranslationLimit(-1.0),
|
isLimitEnabled(false), isMotorEnabled(false), minTranslationLimit(-1.0),
|
||||||
maxTranslationLimit(1.0), motorSpeed(0), maxMotorForce(0) {}
|
maxTranslationLimit(1.0), motorSpeed(0), maxMotorForce(0) {}
|
||||||
|
|
||||||
/// Constructor with limits and no motor
|
/// Constructor with limits and no motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -101,6 +114,7 @@ struct SliderJointInfo : public JointInfo {
|
||||||
const Vector3& initSliderAxisWorldSpace,
|
const Vector3& initSliderAxisWorldSpace,
|
||||||
decimal initMinTranslationLimit, decimal initMaxTranslationLimit)
|
decimal initMinTranslationLimit, decimal initMaxTranslationLimit)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
||||||
isLimitEnabled(true), isMotorEnabled(false),
|
isLimitEnabled(true), isMotorEnabled(false),
|
||||||
|
@ -108,7 +122,7 @@ struct SliderJointInfo : public JointInfo {
|
||||||
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(0),
|
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(0),
|
||||||
maxMotorForce(0) {}
|
maxMotorForce(0) {}
|
||||||
|
|
||||||
/// Constructor with limits and motor
|
/// Constructor with limits and motor with world-space anchor
|
||||||
/**
|
/**
|
||||||
* @param rigidBody1 The first body of the joint
|
* @param rigidBody1 The first body of the joint
|
||||||
* @param rigidBody2 The second body of the joint
|
* @param rigidBody2 The second body of the joint
|
||||||
|
@ -125,12 +139,86 @@ struct SliderJointInfo : public JointInfo {
|
||||||
decimal initMinTranslationLimit, decimal initMaxTranslationLimit,
|
decimal initMinTranslationLimit, decimal initMaxTranslationLimit,
|
||||||
decimal initMotorSpeed, decimal initMaxMotorForce)
|
decimal initMotorSpeed, decimal initMaxMotorForce)
|
||||||
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(false),
|
||||||
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
anchorPointWorldSpace(initAnchorPointWorldSpace),
|
||||||
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
sliderAxisWorldSpace(initSliderAxisWorldSpace),
|
||||||
isLimitEnabled(true), isMotorEnabled(true),
|
isLimitEnabled(true), isMotorEnabled(true),
|
||||||
minTranslationLimit(initMinTranslationLimit),
|
minTranslationLimit(initMinTranslationLimit),
|
||||||
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(initMotorSpeed),
|
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(initMotorSpeed),
|
||||||
maxMotorForce(initMaxMotorForce) {}
|
maxMotorForce(initMaxMotorForce) {}
|
||||||
|
|
||||||
|
/// Constructor without limits and without motor with local-space anchor
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param sliderAxisBody1Local The initial slider axis in body 1 local-space
|
||||||
|
*/
|
||||||
|
SliderJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& sliderAxisBody1Local)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
sliderAxisBody1Local(sliderAxisBody1Local),
|
||||||
|
isLimitEnabled(false), isMotorEnabled(false), minTranslationLimit(-1.0),
|
||||||
|
maxTranslationLimit(1.0), motorSpeed(0), maxMotorForce(0) {}
|
||||||
|
|
||||||
|
/// Constructor with limits and no motor with local-space anchor
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param sliderAxisBody1Local The initial slider axis in body 1 local-space
|
||||||
|
* @param initMinTranslationLimit The initial minimum translation limit (in meters)
|
||||||
|
* @param initMaxTranslationLimit The initial maximum translation limit (in meters)
|
||||||
|
*/
|
||||||
|
SliderJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& sliderAxisBody1Local,
|
||||||
|
decimal initMinTranslationLimit, decimal initMaxTranslationLimit)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
sliderAxisBody1Local(sliderAxisBody1Local),
|
||||||
|
isLimitEnabled(true), isMotorEnabled(false),
|
||||||
|
minTranslationLimit(initMinTranslationLimit),
|
||||||
|
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(0),
|
||||||
|
maxMotorForce(0) {}
|
||||||
|
|
||||||
|
/// Constructor with limits and motor with local-space anchor
|
||||||
|
/**
|
||||||
|
* @param rigidBody1 The first body of the joint
|
||||||
|
* @param rigidBody2 The second body of the joint
|
||||||
|
* @param anchorPointBody1Local The initial anchor point on body 1 in local-space
|
||||||
|
* @param anchorPointBody2Local The initial anchor point on body 2 in local-space
|
||||||
|
* @param sliderAxisBody1Local The initial slider axis in body 1 local-space
|
||||||
|
* @param initMinTranslationLimit The initial minimum translation limit (in meters)
|
||||||
|
* @param initMaxTranslationLimit The initial maximum translation limit (in meters)
|
||||||
|
* @param initMotorSpeed The initial speed of the joint motor (in meters per second)
|
||||||
|
* @param initMaxMotorForce The initial maximum motor force of the joint (in Newtons x meters)
|
||||||
|
*/
|
||||||
|
SliderJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
|
||||||
|
const Vector3& anchorPointBody1Local,
|
||||||
|
const Vector3& anchorPointBody2Local,
|
||||||
|
const Vector3& sliderAxisBody1Local,
|
||||||
|
decimal initMinTranslationLimit, decimal initMaxTranslationLimit,
|
||||||
|
decimal initMotorSpeed, decimal initMaxMotorForce)
|
||||||
|
: JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
|
||||||
|
isUsingLocalSpaceAnchors(true),
|
||||||
|
anchorPointBody1LocalSpace(anchorPointBody1Local),
|
||||||
|
anchorPointBody2LocalSpace(anchorPointBody2Local),
|
||||||
|
sliderAxisBody1Local(sliderAxisBody1Local),
|
||||||
|
isLimitEnabled(true), isMotorEnabled(true),
|
||||||
|
minTranslationLimit(initMinTranslationLimit),
|
||||||
|
maxTranslationLimit(initMaxTranslationLimit), motorSpeed(initMotorSpeed),
|
||||||
|
maxMotorForce(initMaxMotorForce) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class SliderJoint
|
// Class SliderJoint
|
||||||
|
|
|
@ -141,7 +141,6 @@ class PhysicsWorld {
|
||||||
defaultSleepAngularVelocity = decimal(3.0) * (PI / decimal(180.0));
|
defaultSleepAngularVelocity = decimal(3.0) * (PI / decimal(180.0));
|
||||||
nbMaxContactManifolds = 3;
|
nbMaxContactManifolds = 3;
|
||||||
cosAngleSimilarContactManifold = decimal(0.95);
|
cosAngleSimilarContactManifold = decimal(0.95);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~WorldSettings() = default;
|
~WorldSettings() = default;
|
||||||
|
|
|
@ -38,13 +38,27 @@ const decimal BallAndSocketJoint::BETA = decimal(0.2);
|
||||||
BallAndSocketJoint::BallAndSocketJoint(Entity entity, PhysicsWorld& world, const BallAndSocketJointInfo& jointInfo)
|
BallAndSocketJoint::BallAndSocketJoint(Entity entity, PhysicsWorld& world, const BallAndSocketJointInfo& jointInfo)
|
||||||
: Joint(entity, world) {
|
: Joint(entity, world) {
|
||||||
|
|
||||||
// Get the transforms of the two bodies
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
const Transform& body1Transform = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
const Transform& body2Transform = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
|
||||||
|
if (jointInfo.isUsingLocalSpaceAnchors) {
|
||||||
|
|
||||||
|
anchorPointBody1LocalSpace = jointInfo.anchorPointBody1LocalSpace;
|
||||||
|
anchorPointBody2LocalSpace = jointInfo.anchorPointBody2LocalSpace;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Get the transforms of the two bodies
|
||||||
|
const Transform& body1Transform = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
||||||
|
const Transform& body2Transform = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
||||||
|
|
||||||
|
anchorPointBody1LocalSpace = body1Transform.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
anchorPointBody2LocalSpace = body2Transform.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
}
|
||||||
|
|
||||||
// Compute the local-space anchor point for each body
|
// Compute the local-space anchor point for each body
|
||||||
mWorld.mBallAndSocketJointsComponents.setLocalAnchorPointBody1(entity, body1Transform.getInverse() * jointInfo.anchorPointWorldSpace);
|
mWorld.mBallAndSocketJointsComponents.setLocalAnchorPointBody1(entity, anchorPointBody1LocalSpace);
|
||||||
mWorld.mBallAndSocketJointsComponents.setLocalAnchorPointBody2(entity, body2Transform.getInverse() * jointInfo.anchorPointWorldSpace);
|
mWorld.mBallAndSocketJointsComponents.setLocalAnchorPointBody2(entity, anchorPointBody2LocalSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,15 +32,30 @@
|
||||||
using namespace reactphysics3d;
|
using namespace reactphysics3d;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
FixedJoint::FixedJoint(Entity entity, PhysicsWorld &world, const FixedJointInfo& jointInfo)
|
FixedJoint::FixedJoint(Entity entity, PhysicsWorld& world, const FixedJointInfo& jointInfo)
|
||||||
: Joint(entity, world) {
|
: Joint(entity, world) {
|
||||||
|
|
||||||
// Compute the local-space anchor point for each body
|
|
||||||
|
Vector3 anchorPointBody1LocalSpace;
|
||||||
|
Vector3 anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
||||||
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
||||||
|
|
||||||
mWorld.mFixedJointsComponents.setLocalAnchorPointBody1(mEntity, transform1.getInverse() * jointInfo.anchorPointWorldSpace);
|
if (jointInfo.isUsingLocalSpaceAnchors) {
|
||||||
mWorld.mFixedJointsComponents.setLocalAnchorPointBody2(mEntity, transform2.getInverse() * jointInfo.anchorPointWorldSpace);
|
|
||||||
|
anchorPointBody1LocalSpace = jointInfo.anchorPointBody1LocalSpace;
|
||||||
|
anchorPointBody2LocalSpace = jointInfo.anchorPointBody2LocalSpace;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Compute the local-space anchor point for each body
|
||||||
|
anchorPointBody1LocalSpace = transform1.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
anchorPointBody2LocalSpace = transform2.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
}
|
||||||
|
|
||||||
|
mWorld.mFixedJointsComponents.setLocalAnchorPointBody1(mEntity, anchorPointBody1LocalSpace);
|
||||||
|
mWorld.mFixedJointsComponents.setLocalAnchorPointBody2(mEntity, anchorPointBody2LocalSpace);
|
||||||
|
|
||||||
// Store inverse of initial rotation from body 1 to body 2 in body 1 space:
|
// Store inverse of initial rotation from body 1 to body 2 in body 1 space:
|
||||||
//
|
//
|
||||||
|
|
|
@ -34,22 +34,43 @@ using namespace reactphysics3d;
|
||||||
// Constructor
|
// Constructor
|
||||||
HingeJoint::HingeJoint(Entity entity, PhysicsWorld &world, const HingeJointInfo& jointInfo) : Joint(entity, world) {
|
HingeJoint::HingeJoint(Entity entity, PhysicsWorld &world, const HingeJointInfo& jointInfo) : Joint(entity, world) {
|
||||||
|
|
||||||
|
Vector3 anchorPointBody1Local;
|
||||||
|
Vector3 anchorPointBody2Local;
|
||||||
|
Vector3 hingeLocalAxisBody1;
|
||||||
|
Vector3 hingeLocalAxisBody2;
|
||||||
|
|
||||||
|
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
||||||
|
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
||||||
|
|
||||||
|
if (jointInfo.isUsingLocalSpaceAnchors) {
|
||||||
|
|
||||||
|
anchorPointBody1Local = jointInfo.anchorPointBody1LocalSpace;
|
||||||
|
anchorPointBody2Local = jointInfo.anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
|
hingeLocalAxisBody1 = jointInfo.rotationAxisBody1Local;
|
||||||
|
hingeLocalAxisBody2 = jointInfo.rotationAxisBody2Local;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Compute the local-space anchor point for each body
|
||||||
|
anchorPointBody1Local = transform1.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
anchorPointBody2Local = transform2.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
|
||||||
|
// Compute the local-space hinge axis
|
||||||
|
hingeLocalAxisBody1 = transform1.getOrientation().getInverse() * jointInfo.rotationAxisWorld;
|
||||||
|
hingeLocalAxisBody2 = transform2.getOrientation().getInverse() * jointInfo.rotationAxisWorld;
|
||||||
|
hingeLocalAxisBody1.normalize();
|
||||||
|
hingeLocalAxisBody2.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
const decimal lowerLimit = mWorld.mHingeJointsComponents.getLowerLimit(mEntity);
|
const decimal lowerLimit = mWorld.mHingeJointsComponents.getLowerLimit(mEntity);
|
||||||
const decimal upperLimit = mWorld.mHingeJointsComponents.getUpperLimit(mEntity);
|
const decimal upperLimit = mWorld.mHingeJointsComponents.getUpperLimit(mEntity);
|
||||||
assert(lowerLimit <= decimal(0) && lowerLimit >= decimal(-2.0) * PI);
|
assert(lowerLimit <= decimal(0) && lowerLimit >= decimal(-2.0) * PI);
|
||||||
assert(upperLimit >= decimal(0) && upperLimit <= decimal(2.0) * PI);
|
assert(upperLimit >= decimal(0) && upperLimit <= decimal(2.0) * PI);
|
||||||
|
|
||||||
// Compute the local-space anchor point for each body
|
mWorld.mHingeJointsComponents.setLocalAnchorPointBody1(mEntity, anchorPointBody1Local);
|
||||||
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
mWorld.mHingeJointsComponents.setLocalAnchorPointBody2(mEntity, anchorPointBody2Local);
|
||||||
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
|
||||||
mWorld.mHingeJointsComponents.setLocalAnchorPointBody1(mEntity, transform1.getInverse() * jointInfo.anchorPointWorldSpace);
|
|
||||||
mWorld.mHingeJointsComponents.setLocalAnchorPointBody2(mEntity, transform2.getInverse() * jointInfo.anchorPointWorldSpace);
|
|
||||||
|
|
||||||
// Compute the local-space hinge axis
|
|
||||||
Vector3 hingeLocalAxisBody1 = transform1.getOrientation().getInverse() * jointInfo.rotationAxisWorld;
|
|
||||||
Vector3 hingeLocalAxisBody2 = transform2.getOrientation().getInverse() * jointInfo.rotationAxisWorld;
|
|
||||||
hingeLocalAxisBody1.normalize();
|
|
||||||
hingeLocalAxisBody2.normalize();
|
|
||||||
mWorld.mHingeJointsComponents.setHingeLocalAxisBody1(mEntity, hingeLocalAxisBody1);
|
mWorld.mHingeJointsComponents.setHingeLocalAxisBody1(mEntity, hingeLocalAxisBody1);
|
||||||
mWorld.mHingeJointsComponents.setHingeLocalAxisBody2(mEntity, hingeLocalAxisBody2);
|
mWorld.mHingeJointsComponents.setHingeLocalAxisBody2(mEntity, hingeLocalAxisBody2);
|
||||||
|
|
||||||
|
|
|
@ -35,20 +35,47 @@ using namespace reactphysics3d;
|
||||||
const decimal SliderJoint::BETA = decimal(0.2);
|
const decimal SliderJoint::BETA = decimal(0.2);
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
SliderJoint::SliderJoint(Entity entity, PhysicsWorld &world, const SliderJointInfo& jointInfo)
|
SliderJoint::SliderJoint(Entity entity, PhysicsWorld& world, const SliderJointInfo& jointInfo)
|
||||||
: Joint(entity, world) {
|
: Joint(entity, world) {
|
||||||
|
|
||||||
assert(mWorld.mSliderJointsComponents.getUpperLimit(mEntity) >= decimal(0.0));
|
assert(mWorld.mSliderJointsComponents.getUpperLimit(mEntity) >= decimal(0.0));
|
||||||
assert(mWorld.mSliderJointsComponents.getLowerLimit(mEntity) <= decimal(0.0));
|
assert(mWorld.mSliderJointsComponents.getLowerLimit(mEntity) <= decimal(0.0));
|
||||||
assert(mWorld.mSliderJointsComponents.getMaxMotorForce(mEntity) >= decimal(0.0));
|
assert(mWorld.mSliderJointsComponents.getMaxMotorForce(mEntity) >= decimal(0.0));
|
||||||
|
|
||||||
// Compute the local-space anchor point for each body
|
Vector3 anchorPointBody1Local;
|
||||||
|
Vector3 anchorPointBody2Local;
|
||||||
|
Vector3 sliderLocalAxisBody1;
|
||||||
|
Vector3 sliderLocalAxisBody2;
|
||||||
|
|
||||||
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
const Transform& transform1 = mWorld.mTransformComponents.getTransform(jointInfo.body1->getEntity());
|
||||||
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
const Transform& transform2 = mWorld.mTransformComponents.getTransform(jointInfo.body2->getEntity());
|
||||||
mWorld.mSliderJointsComponents.setLocalAnchorPointBody1(mEntity, transform1.getInverse() * jointInfo.anchorPointWorldSpace);
|
|
||||||
mWorld.mSliderJointsComponents.setLocalAnchorPointBody2(mEntity, transform2.getInverse() * jointInfo.anchorPointWorldSpace);
|
|
||||||
|
|
||||||
// Store inverse of initial rotation from body 1 to body 2 in body 1 space:
|
if (jointInfo.isUsingLocalSpaceAnchors) {
|
||||||
|
|
||||||
|
anchorPointBody1Local = jointInfo.anchorPointBody1LocalSpace;
|
||||||
|
anchorPointBody2Local = jointInfo.anchorPointBody2LocalSpace;
|
||||||
|
|
||||||
|
sliderLocalAxisBody1 = jointInfo.sliderAxisBody1Local;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
// Compute the local-space anchor point for each body
|
||||||
|
anchorPointBody1Local = transform1.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
anchorPointBody2Local = transform2.getInverse() * jointInfo.anchorPointWorldSpace;
|
||||||
|
|
||||||
|
// Compute the slider axis in local-space of body 1
|
||||||
|
// TODO : Do not compute the inverse here, it has already been computed above
|
||||||
|
sliderLocalAxisBody1 = transform1.getOrientation().getInverse() *
|
||||||
|
jointInfo.sliderAxisWorldSpace;
|
||||||
|
sliderLocalAxisBody1.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
mWorld.mSliderJointsComponents.setLocalAnchorPointBody1(mEntity, anchorPointBody1Local);
|
||||||
|
mWorld.mSliderJointsComponents.setLocalAnchorPointBody2(mEntity, anchorPointBody2Local);
|
||||||
|
|
||||||
|
mWorld.mSliderJointsComponents.setSliderAxisBody1(mEntity, sliderLocalAxisBody1);
|
||||||
|
|
||||||
|
// Store inverse of initial rotation from body 1 to body 2 in body 1 space:
|
||||||
//
|
//
|
||||||
// q20 = q10 r0
|
// q20 = q10 r0
|
||||||
// <=> r0 = q10^-1 q20
|
// <=> r0 = q10^-1 q20
|
||||||
|
@ -61,13 +88,6 @@ SliderJoint::SliderJoint(Entity entity, PhysicsWorld &world, const SliderJointIn
|
||||||
// r0 = initial rotation rotation from body 1 to body 2
|
// r0 = initial rotation rotation from body 1 to body 2
|
||||||
// TODO : Do not compute the inverse here, it has already been computed above
|
// TODO : Do not compute the inverse here, it has already been computed above
|
||||||
mWorld.mSliderJointsComponents.setInitOrientationDifferenceInv(mEntity, transform2.getOrientation().getInverse() * transform1.getOrientation());
|
mWorld.mSliderJointsComponents.setInitOrientationDifferenceInv(mEntity, transform2.getOrientation().getInverse() * transform1.getOrientation());
|
||||||
|
|
||||||
// Compute the slider axis in local-space of body 1
|
|
||||||
// TODO : Do not compute the inverse here, it has already been computed above
|
|
||||||
Vector3 sliderAxisBody1 = transform1.getOrientation().getInverse() *
|
|
||||||
jointInfo.sliderAxisWorldSpace;
|
|
||||||
sliderAxisBody1.normalize();
|
|
||||||
mWorld.mSliderJointsComponents.setSliderAxisBody1(mEntity, sliderAxisBody1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable/Disable the limits of the joint
|
// Enable/Disable the limits of the joint
|
||||||
|
|
Loading…
Reference in New Issue
Block a user