Add some accessor methods to btHingeConstraint and btSliderConstraint, to allow conversion.

Thanks to Roman Ponomarev.
This commit is contained in:
erwin.coumans
2008-07-22 02:15:17 +00:00
parent 016db0b3c5
commit fe5033119b
4 changed files with 648 additions and 610 deletions

View File

@@ -403,3 +403,4 @@ btScalar btHingeConstraint::getHingeAngle()
return btAtan2Fast( swingAxis.dot(refAxis0), swingAxis.dot(refAxis1) ); return btAtan2Fast( swingAxis.dot(refAxis0), swingAxis.dot(refAxis1) );
} }

View File

@@ -135,7 +135,24 @@ public:
{ {
return m_limitSign; return m_limitSign;
} }
inline bool getAngularOnly()
{
return m_angularOnly;
}
inline bool getEnableAngularMotor()
{
return m_enableAngularMotor;
}
inline btScalar getMotorTargetVelosity()
{
return m_motorTargetVelocity;
}
inline btScalar getMaxMotorImpulse()
{
return m_maxMotorImpulse;
}
}; };
#endif //HINGECONSTRAINT_H #endif //HINGECONSTRAINT_H

View File

@@ -1,397 +1,414 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
/* /*
Added by Roman Ponomarev (rponom@gmail.com) Added by Roman Ponomarev (rponom@gmail.com)
April 04, 2008 April 04, 2008
*/ */
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "btSliderConstraint.h" #include "btSliderConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h" #include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h" #include "LinearMath/btTransformUtil.h"
#include <new> #include <new>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::initParams() void btSliderConstraint::initParams()
{ {
m_lowerLinLimit = btScalar(1.0); m_lowerLinLimit = btScalar(1.0);
m_upperLinLimit = btScalar(-1.0); m_upperLinLimit = btScalar(-1.0);
m_lowerAngLimit = btScalar(0.); m_lowerAngLimit = btScalar(0.);
m_upperAngLimit = btScalar(0.); m_upperAngLimit = btScalar(0.);
m_softnessDirLin = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessDirLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirLin = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionDirLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirLin = btScalar(0.); m_dampingDirLin = btScalar(0.);
m_softnessDirAng = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessDirAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirAng = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionDirAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirAng = btScalar(0.); m_dampingDirAng = btScalar(0.);
m_softnessOrthoLin = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessOrthoLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionOrthoLin = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionOrthoLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingOrthoLin = SLIDER_CONSTRAINT_DEF_DAMPING; m_dampingOrthoLin = SLIDER_CONSTRAINT_DEF_DAMPING;
m_softnessOrthoAng = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessOrthoAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionOrthoAng = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionOrthoAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingOrthoAng = SLIDER_CONSTRAINT_DEF_DAMPING; m_dampingOrthoAng = SLIDER_CONSTRAINT_DEF_DAMPING;
m_softnessLimLin = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessLimLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionLimLin = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionLimLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingLimLin = SLIDER_CONSTRAINT_DEF_DAMPING; m_dampingLimLin = SLIDER_CONSTRAINT_DEF_DAMPING;
m_softnessLimAng = SLIDER_CONSTRAINT_DEF_SOFTNESS; m_softnessLimAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionLimAng = SLIDER_CONSTRAINT_DEF_RESTITUTION; m_restitutionLimAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingLimAng = SLIDER_CONSTRAINT_DEF_DAMPING; m_dampingLimAng = SLIDER_CONSTRAINT_DEF_DAMPING;
m_poweredLinMotor = false; m_poweredLinMotor = false;
m_targetLinMotorVelocity = btScalar(0.); m_targetLinMotorVelocity = btScalar(0.);
m_maxLinMotorForce = btScalar(0.); m_maxLinMotorForce = btScalar(0.);
m_accumulatedLinMotorImpulse = btScalar(0.0); m_accumulatedLinMotorImpulse = btScalar(0.0);
m_poweredAngMotor = false; m_poweredAngMotor = false;
m_targetAngMotorVelocity = btScalar(0.); m_targetAngMotorVelocity = btScalar(0.);
m_maxAngMotorForce = btScalar(0.); m_maxAngMotorForce = btScalar(0.);
m_accumulatedAngMotorImpulse = btScalar(0.0); m_accumulatedAngMotorImpulse = btScalar(0.0);
} // btSliderConstraint::initParams() } // btSliderConstraint::initParams()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
btSliderConstraint::btSliderConstraint() btSliderConstraint::btSliderConstraint()
:btTypedConstraint(SLIDER_CONSTRAINT_TYPE), :btTypedConstraint(SLIDER_CONSTRAINT_TYPE),
m_useLinearReferenceFrameA(true) m_useLinearReferenceFrameA(true)
{ {
initParams(); initParams();
} // btSliderConstraint::btSliderConstraint() } // btSliderConstraint::btSliderConstraint()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
btSliderConstraint::btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA) btSliderConstraint::btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
: btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB) : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB)
, m_frameInA(frameInA) , m_frameInA(frameInA)
, m_frameInB(frameInB), , m_frameInB(frameInB),
m_useLinearReferenceFrameA(useLinearReferenceFrameA) m_useLinearReferenceFrameA(useLinearReferenceFrameA)
{ {
initParams(); initParams();
} // btSliderConstraint::btSliderConstraint() } // btSliderConstraint::btSliderConstraint()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::buildJacobian() void btSliderConstraint::buildJacobian()
{ {
if(m_useLinearReferenceFrameA) if(m_useLinearReferenceFrameA)
{ {
buildJacobianInt(m_rbA, m_rbB, m_frameInA, m_frameInB); buildJacobianInt(m_rbA, m_rbB, m_frameInA, m_frameInB);
} }
else else
{ {
buildJacobianInt(m_rbB, m_rbA, m_frameInB, m_frameInA); buildJacobianInt(m_rbB, m_rbA, m_frameInB, m_frameInA);
} }
} // btSliderConstraint::buildJacobian() } // btSliderConstraint::buildJacobian()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB) void btSliderConstraint::buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB)
{ {
//calculate transforms //calculate transforms
m_calculatedTransformA = rbA.getCenterOfMassTransform() * frameInA; m_calculatedTransformA = rbA.getCenterOfMassTransform() * frameInA;
m_calculatedTransformB = rbB.getCenterOfMassTransform() * frameInB; m_calculatedTransformB = rbB.getCenterOfMassTransform() * frameInB;
m_realPivotAInW = m_calculatedTransformA.getOrigin(); m_realPivotAInW = m_calculatedTransformA.getOrigin();
m_realPivotBInW = m_calculatedTransformB.getOrigin(); m_realPivotBInW = m_calculatedTransformB.getOrigin();
m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
m_delta = m_realPivotBInW - m_realPivotAInW; m_delta = m_realPivotBInW - m_realPivotAInW;
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis; m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
m_relPosA = m_projPivotInW - rbA.getCenterOfMassPosition(); m_relPosA = m_projPivotInW - rbA.getCenterOfMassPosition();
m_relPosB = m_realPivotBInW - rbB.getCenterOfMassPosition(); m_relPosB = m_realPivotBInW - rbB.getCenterOfMassPosition();
btVector3 normalWorld; btVector3 normalWorld;
int i; int i;
//linear part //linear part
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
{ {
normalWorld = m_calculatedTransformA.getBasis().getColumn(i); normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
new (&m_jacLin[i]) btJacobianEntry( new (&m_jacLin[i]) btJacobianEntry(
rbA.getCenterOfMassTransform().getBasis().transpose(), rbA.getCenterOfMassTransform().getBasis().transpose(),
rbB.getCenterOfMassTransform().getBasis().transpose(), rbB.getCenterOfMassTransform().getBasis().transpose(),
m_relPosA, m_relPosA,
m_relPosB, m_relPosB,
normalWorld, normalWorld,
rbA.getInvInertiaDiagLocal(), rbA.getInvInertiaDiagLocal(),
rbA.getInvMass(), rbA.getInvMass(),
rbB.getInvInertiaDiagLocal(), rbB.getInvInertiaDiagLocal(),
rbB.getInvMass() rbB.getInvMass()
); );
m_jacLinDiagABInv[i] = btScalar(1.) / m_jacLin[i].getDiagonal(); m_jacLinDiagABInv[i] = btScalar(1.) / m_jacLin[i].getDiagonal();
m_depth[i] = m_delta.dot(normalWorld); m_depth[i] = m_delta.dot(normalWorld);
} }
testLinLimits(); testLinLimits();
// angular part // angular part
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
{ {
normalWorld = m_calculatedTransformA.getBasis().getColumn(i); normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
new (&m_jacAng[i]) btJacobianEntry( new (&m_jacAng[i]) btJacobianEntry(
normalWorld, normalWorld,
rbA.getCenterOfMassTransform().getBasis().transpose(), rbA.getCenterOfMassTransform().getBasis().transpose(),
rbB.getCenterOfMassTransform().getBasis().transpose(), rbB.getCenterOfMassTransform().getBasis().transpose(),
rbA.getInvInertiaDiagLocal(), rbA.getInvInertiaDiagLocal(),
rbB.getInvInertiaDiagLocal() rbB.getInvInertiaDiagLocal()
); );
} }
testAngLimits(); testAngLimits();
btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0); btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0);
m_kAngle = btScalar(1.0 )/ (rbA.computeAngularImpulseDenominator(axisA) + rbB.computeAngularImpulseDenominator(axisA)); m_kAngle = btScalar(1.0 )/ (rbA.computeAngularImpulseDenominator(axisA) + rbB.computeAngularImpulseDenominator(axisA));
// clear accumulator for motors // clear accumulator for motors
m_accumulatedLinMotorImpulse = btScalar(0.0); m_accumulatedLinMotorImpulse = btScalar(0.0);
m_accumulatedAngMotorImpulse = btScalar(0.0); m_accumulatedAngMotorImpulse = btScalar(0.0);
} // btSliderConstraint::buildJacobianInt() } // btSliderConstraint::buildJacobianInt()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::solveConstraint(btScalar timeStep) void btSliderConstraint::solveConstraint(btScalar timeStep)
{ {
m_timeStep = timeStep; m_timeStep = timeStep;
if(m_useLinearReferenceFrameA) if(m_useLinearReferenceFrameA)
{ {
solveConstraintInt(m_rbA, m_rbB); solveConstraintInt(m_rbA, m_rbB);
} }
else else
{ {
solveConstraintInt(m_rbB, m_rbA); solveConstraintInt(m_rbB, m_rbA);
} }
} // btSliderConstraint::solveConstraint() } // btSliderConstraint::solveConstraint()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::solveConstraintInt(btRigidBody& rbA, btRigidBody& rbB) void btSliderConstraint::solveConstraintInt(btRigidBody& rbA, btRigidBody& rbB)
{ {
int i; int i;
// linear // linear
btVector3 velA = rbA.getVelocityInLocalPoint(m_relPosA); btVector3 velA = rbA.getVelocityInLocalPoint(m_relPosA);
btVector3 velB = rbB.getVelocityInLocalPoint(m_relPosB); btVector3 velB = rbB.getVelocityInLocalPoint(m_relPosB);
btVector3 vel = velA - velB; btVector3 vel = velA - velB;
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
{ {
const btVector3& normal = m_jacLin[i].m_linearJointAxis; const btVector3& normal = m_jacLin[i].m_linearJointAxis;
btScalar rel_vel = normal.dot(vel); btScalar rel_vel = normal.dot(vel);
// calculate positional error // calculate positional error
btScalar depth = m_depth[i]; btScalar depth = m_depth[i];
// get parameters // get parameters
btScalar softness = (i) ? m_softnessOrthoLin : (m_solveLinLim ? m_softnessLimLin : m_softnessDirLin); btScalar softness = (i) ? m_softnessOrthoLin : (m_solveLinLim ? m_softnessLimLin : m_softnessDirLin);
btScalar restitution = (i) ? m_restitutionOrthoLin : (m_solveLinLim ? m_restitutionLimLin : m_restitutionDirLin); btScalar restitution = (i) ? m_restitutionOrthoLin : (m_solveLinLim ? m_restitutionLimLin : m_restitutionDirLin);
btScalar damping = (i) ? m_dampingOrthoLin : (m_solveLinLim ? m_dampingLimLin : m_dampingDirLin); btScalar damping = (i) ? m_dampingOrthoLin : (m_solveLinLim ? m_dampingLimLin : m_dampingDirLin);
// calcutate and apply impulse // calcutate and apply impulse
btScalar normalImpulse = softness * (restitution * depth / m_timeStep - damping * rel_vel) * m_jacLinDiagABInv[i]; btScalar normalImpulse = softness * (restitution * depth / m_timeStep - damping * rel_vel) * m_jacLinDiagABInv[i];
btVector3 impulse_vector = normal * normalImpulse; btVector3 impulse_vector = normal * normalImpulse;
rbA.applyImpulse( impulse_vector, m_relPosA); rbA.applyImpulse( impulse_vector, m_relPosA);
rbB.applyImpulse(-impulse_vector, m_relPosB); rbB.applyImpulse(-impulse_vector, m_relPosB);
if(m_poweredLinMotor && (!i)) if(m_poweredLinMotor && (!i))
{ // apply linear motor { // apply linear motor
if(m_accumulatedLinMotorImpulse < m_maxLinMotorForce) if(m_accumulatedLinMotorImpulse < m_maxLinMotorForce)
{ {
btScalar desiredMotorVel = m_targetLinMotorVelocity; btScalar desiredMotorVel = m_targetLinMotorVelocity;
btScalar motor_relvel = desiredMotorVel + rel_vel; btScalar motor_relvel = desiredMotorVel + rel_vel;
normalImpulse = -motor_relvel * m_jacLinDiagABInv[i]; normalImpulse = -motor_relvel * m_jacLinDiagABInv[i];
// clamp accumulated impulse // clamp accumulated impulse
btScalar new_acc = m_accumulatedLinMotorImpulse + btFabs(normalImpulse); btScalar new_acc = m_accumulatedLinMotorImpulse + btFabs(normalImpulse);
if(new_acc > m_maxLinMotorForce) if(new_acc > m_maxLinMotorForce)
{ {
new_acc = m_maxLinMotorForce; new_acc = m_maxLinMotorForce;
} }
btScalar del = new_acc - m_accumulatedLinMotorImpulse; btScalar del = new_acc - m_accumulatedLinMotorImpulse;
if(normalImpulse < btScalar(0.0)) if(normalImpulse < btScalar(0.0))
{ {
normalImpulse = -del; normalImpulse = -del;
} }
else else
{ {
normalImpulse = del; normalImpulse = del;
} }
m_accumulatedLinMotorImpulse = new_acc; m_accumulatedLinMotorImpulse = new_acc;
// apply clamped impulse // apply clamped impulse
impulse_vector = normal * normalImpulse; impulse_vector = normal * normalImpulse;
rbA.applyImpulse( impulse_vector, m_relPosA); rbA.applyImpulse( impulse_vector, m_relPosA);
rbB.applyImpulse(-impulse_vector, m_relPosB); rbB.applyImpulse(-impulse_vector, m_relPosB);
} }
} }
} }
// angular // angular
// get axes in world space // get axes in world space
btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0); btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0);
btVector3 axisB = m_calculatedTransformB.getBasis().getColumn(0); btVector3 axisB = m_calculatedTransformB.getBasis().getColumn(0);
const btVector3& angVelA = rbA.getAngularVelocity(); const btVector3& angVelA = rbA.getAngularVelocity();
const btVector3& angVelB = rbB.getAngularVelocity(); const btVector3& angVelB = rbB.getAngularVelocity();
btVector3 angVelAroundAxisA = axisA * axisA.dot(angVelA); btVector3 angVelAroundAxisA = axisA * axisA.dot(angVelA);
btVector3 angVelAroundAxisB = axisB * axisB.dot(angVelB); btVector3 angVelAroundAxisB = axisB * axisB.dot(angVelB);
btVector3 angAorthog = angVelA - angVelAroundAxisA; btVector3 angAorthog = angVelA - angVelAroundAxisA;
btVector3 angBorthog = angVelB - angVelAroundAxisB; btVector3 angBorthog = angVelB - angVelAroundAxisB;
btVector3 velrelOrthog = angAorthog-angBorthog; btVector3 velrelOrthog = angAorthog-angBorthog;
//solve orthogonal angular velocity correction //solve orthogonal angular velocity correction
btScalar len = velrelOrthog.length(); btScalar len = velrelOrthog.length();
if (len > btScalar(0.00001)) if (len > btScalar(0.00001))
{ {
btVector3 normal = velrelOrthog.normalized(); btVector3 normal = velrelOrthog.normalized();
btScalar denom = rbA.computeAngularImpulseDenominator(normal) + rbB.computeAngularImpulseDenominator(normal); btScalar denom = rbA.computeAngularImpulseDenominator(normal) + rbB.computeAngularImpulseDenominator(normal);
velrelOrthog *= (btScalar(1.)/denom) * m_dampingOrthoAng * m_softnessOrthoAng; velrelOrthog *= (btScalar(1.)/denom) * m_dampingOrthoAng * m_softnessOrthoAng;
} }
//solve angular positional correction //solve angular positional correction
btVector3 angularError = axisA.cross(axisB) *(btScalar(1.)/m_timeStep); btVector3 angularError = axisA.cross(axisB) *(btScalar(1.)/m_timeStep);
btScalar len2 = angularError.length(); btScalar len2 = angularError.length();
if (len2>btScalar(0.00001)) if (len2>btScalar(0.00001))
{ {
btVector3 normal2 = angularError.normalized(); btVector3 normal2 = angularError.normalized();
btScalar denom2 = rbA.computeAngularImpulseDenominator(normal2) + rbB.computeAngularImpulseDenominator(normal2); btScalar denom2 = rbA.computeAngularImpulseDenominator(normal2) + rbB.computeAngularImpulseDenominator(normal2);
angularError *= (btScalar(1.)/denom2) * m_restitutionOrthoAng * m_softnessOrthoAng; angularError *= (btScalar(1.)/denom2) * m_restitutionOrthoAng * m_softnessOrthoAng;
} }
// apply impulse // apply impulse
rbA.applyTorqueImpulse(-velrelOrthog+angularError); rbA.applyTorqueImpulse(-velrelOrthog+angularError);
rbB.applyTorqueImpulse(velrelOrthog-angularError); rbB.applyTorqueImpulse(velrelOrthog-angularError);
btScalar impulseMag; btScalar impulseMag;
//solve angular limits //solve angular limits
if(m_solveAngLim) if(m_solveAngLim)
{ {
impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingLimAng + m_angDepth * m_restitutionLimAng / m_timeStep; impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingLimAng + m_angDepth * m_restitutionLimAng / m_timeStep;
impulseMag *= m_kAngle * m_softnessLimAng; impulseMag *= m_kAngle * m_softnessLimAng;
} }
else else
{ {
impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingDirAng + m_angDepth * m_restitutionDirAng / m_timeStep; impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingDirAng + m_angDepth * m_restitutionDirAng / m_timeStep;
impulseMag *= m_kAngle * m_softnessDirAng; impulseMag *= m_kAngle * m_softnessDirAng;
} }
btVector3 impulse = axisA * impulseMag; btVector3 impulse = axisA * impulseMag;
rbA.applyTorqueImpulse(impulse); rbA.applyTorqueImpulse(impulse);
rbB.applyTorqueImpulse(-impulse); rbB.applyTorqueImpulse(-impulse);
//apply angular motor //apply angular motor
if(m_poweredAngMotor) if(m_poweredAngMotor)
{ {
if(m_accumulatedAngMotorImpulse < m_maxAngMotorForce) if(m_accumulatedAngMotorImpulse < m_maxAngMotorForce)
{ {
btVector3 velrel = angVelAroundAxisA - angVelAroundAxisB; btVector3 velrel = angVelAroundAxisA - angVelAroundAxisB;
btScalar projRelVel = velrel.dot(axisA); btScalar projRelVel = velrel.dot(axisA);
btScalar desiredMotorVel = m_targetAngMotorVelocity; btScalar desiredMotorVel = m_targetAngMotorVelocity;
btScalar motor_relvel = desiredMotorVel - projRelVel; btScalar motor_relvel = desiredMotorVel - projRelVel;
btScalar angImpulse = m_kAngle * motor_relvel; btScalar angImpulse = m_kAngle * motor_relvel;
// clamp accumulated impulse // clamp accumulated impulse
btScalar new_acc = m_accumulatedAngMotorImpulse + btFabs(angImpulse); btScalar new_acc = m_accumulatedAngMotorImpulse + btFabs(angImpulse);
if(new_acc > m_maxAngMotorForce) if(new_acc > m_maxAngMotorForce)
{ {
new_acc = m_maxAngMotorForce; new_acc = m_maxAngMotorForce;
} }
btScalar del = new_acc - m_accumulatedAngMotorImpulse; btScalar del = new_acc - m_accumulatedAngMotorImpulse;
if(angImpulse < btScalar(0.0)) if(angImpulse < btScalar(0.0))
{ {
angImpulse = -del; angImpulse = -del;
} }
else else
{ {
angImpulse = del; angImpulse = del;
} }
m_accumulatedAngMotorImpulse = new_acc; m_accumulatedAngMotorImpulse = new_acc;
// apply clamped impulse // apply clamped impulse
btVector3 motorImp = angImpulse * axisA; btVector3 motorImp = angImpulse * axisA;
m_rbA.applyTorqueImpulse(motorImp); m_rbA.applyTorqueImpulse(motorImp);
m_rbB.applyTorqueImpulse(-motorImp); m_rbB.applyTorqueImpulse(-motorImp);
} }
} }
} // btSliderConstraint::solveConstraint() } // btSliderConstraint::solveConstraint()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::calculateTransforms(void){ void btSliderConstraint::calculateTransforms(void){
if(m_useLinearReferenceFrameA) if(m_useLinearReferenceFrameA)
{ {
m_calculatedTransformA = m_rbA.getCenterOfMassTransform() * m_frameInA; m_calculatedTransformA = m_rbA.getCenterOfMassTransform() * m_frameInA;
m_calculatedTransformB = m_rbB.getCenterOfMassTransform() * m_frameInB; m_calculatedTransformB = m_rbB.getCenterOfMassTransform() * m_frameInB;
} }
else else
{ {
m_calculatedTransformA = m_rbB.getCenterOfMassTransform() * m_frameInB; m_calculatedTransformA = m_rbB.getCenterOfMassTransform() * m_frameInB;
m_calculatedTransformB = m_rbA.getCenterOfMassTransform() * m_frameInA; m_calculatedTransformB = m_rbA.getCenterOfMassTransform() * m_frameInA;
} }
m_realPivotAInW = m_calculatedTransformA.getOrigin(); m_realPivotAInW = m_calculatedTransformA.getOrigin();
m_realPivotBInW = m_calculatedTransformB.getOrigin(); m_realPivotBInW = m_calculatedTransformB.getOrigin();
m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
m_delta = m_realPivotBInW - m_realPivotAInW; m_delta = m_realPivotBInW - m_realPivotAInW;
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis; m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
btVector3 normalWorld; btVector3 normalWorld;
int i; int i;
//linear part //linear part
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
{ {
normalWorld = m_calculatedTransformA.getBasis().getColumn(i); normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
m_depth[i] = m_delta.dot(normalWorld); m_depth[i] = m_delta.dot(normalWorld);
} }
} // btSliderConstraint::calculateTransforms() } // btSliderConstraint::calculateTransforms()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::testLinLimits(void) void btSliderConstraint::testLinLimits(void)
{ {
m_solveLinLim = false; m_solveLinLim = false;
if(m_lowerLinLimit <= m_upperLinLimit) if(m_lowerLinLimit <= m_upperLinLimit)
{ {
if(m_depth[0] > m_upperLinLimit) if(m_depth[0] > m_upperLinLimit)
{ {
m_depth[0] -= m_upperLinLimit; m_depth[0] -= m_upperLinLimit;
m_solveLinLim = true; m_solveLinLim = true;
} }
else if(m_depth[0] < m_lowerLinLimit) else if(m_depth[0] < m_lowerLinLimit)
{ {
m_depth[0] -= m_lowerLinLimit; m_depth[0] -= m_lowerLinLimit;
m_solveLinLim = true; m_solveLinLim = true;
} }
else else
{ {
m_depth[0] = btScalar(0.); m_depth[0] = btScalar(0.);
} }
} }
else else
{ {
m_depth[0] = btScalar(0.); m_depth[0] = btScalar(0.);
} }
} // btSliderConstraint::testLinLimits() } // btSliderConstraint::testLinLimits()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void btSliderConstraint::testAngLimits(void) void btSliderConstraint::testAngLimits(void)
{ {
m_angDepth = btScalar(0.); m_angDepth = btScalar(0.);
m_solveAngLim = false; m_solveAngLim = false;
if(m_lowerAngLimit <= m_upperAngLimit) if(m_lowerAngLimit <= m_upperAngLimit)
{ {
const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1); const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1);
const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2); const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2);
const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1); const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1);
btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0)); btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
if(rot < m_lowerAngLimit) if(rot < m_lowerAngLimit)
{ {
m_angDepth = rot - m_lowerAngLimit; m_angDepth = rot - m_lowerAngLimit;
m_solveAngLim = true; m_solveAngLim = true;
} }
else if(rot > m_upperAngLimit) else if(rot > m_upperAngLimit)
{ {
m_angDepth = rot - m_upperAngLimit; m_angDepth = rot - m_upperAngLimit;
m_solveAngLim = true; m_solveAngLim = true;
} }
} }
} // btSliderConstraint::testAngLimits() } // btSliderConstraint::testAngLimits()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
btVector3 btSliderConstraint::getAncorInA(void)
{
btVector3 ancorInA;
ancorInA = m_realPivotAInW + (m_lowerLinLimit + m_upperLinLimit) * btScalar(0.5) * m_sliderAxis;
ancorInA = m_rbA.getCenterOfMassTransform().inverse() * ancorInA;
return ancorInA;
} // btSliderConstraint::getAncorInA()
//-----------------------------------------------------------------------------
btVector3 btSliderConstraint::getAncorInB(void)
{
btVector3 ancorInB;
ancorInB = m_frameInB.getOrigin();
return ancorInB;
} // btSliderConstraint::getAncorInB();

View File

@@ -1,212 +1,215 @@
/* /*
Bullet Continuous Collision Detection and Physics Library Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty. This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it freely, including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions: subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
/* /*
Added by Roman Ponomarev (rponom@gmail.com) Added by Roman Ponomarev (rponom@gmail.com)
April 04, 2008 April 04, 2008
TODO: TODO:
- add clamping od accumulated impulse to improve stability - add clamping od accumulated impulse to improve stability
- add conversion for ODE constraint solver - add conversion for ODE constraint solver
*/ */
#ifndef SLIDER_CONSTRAINT_H #ifndef SLIDER_CONSTRAINT_H
#define SLIDER_CONSTRAINT_H #define SLIDER_CONSTRAINT_H
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "LinearMath/btVector3.h" #include "LinearMath/btVector3.h"
#include "btJacobianEntry.h" #include "btJacobianEntry.h"
#include "btTypedConstraint.h" #include "btTypedConstraint.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class btRigidBody; class btRigidBody;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#define SLIDER_CONSTRAINT_DEF_SOFTNESS (btScalar(1.0)) #define SLIDER_CONSTRAINT_DEF_SOFTNESS (btScalar(1.0))
#define SLIDER_CONSTRAINT_DEF_DAMPING (btScalar(1.0)) #define SLIDER_CONSTRAINT_DEF_DAMPING (btScalar(1.0))
#define SLIDER_CONSTRAINT_DEF_RESTITUTION (btScalar(0.7)) #define SLIDER_CONSTRAINT_DEF_RESTITUTION (btScalar(0.7))
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class btSliderConstraint : public btTypedConstraint class btSliderConstraint : public btTypedConstraint
{ {
protected: protected:
btTransform m_frameInA; btTransform m_frameInA;
btTransform m_frameInB; btTransform m_frameInB;
// use frameA fo define limits, if true // use frameA fo define limits, if true
bool m_useLinearReferenceFrameA; bool m_useLinearReferenceFrameA;
// linear limits // linear limits
btScalar m_lowerLinLimit; btScalar m_lowerLinLimit;
btScalar m_upperLinLimit; btScalar m_upperLinLimit;
// angular limits // angular limits
btScalar m_lowerAngLimit; btScalar m_lowerAngLimit;
btScalar m_upperAngLimit; btScalar m_upperAngLimit;
// softness, restitution and damping for different cases // softness, restitution and damping for different cases
// DirLin - moving inside linear limits // DirLin - moving inside linear limits
// LimLin - hitting linear limit // LimLin - hitting linear limit
// DirAng - moving inside angular limits // DirAng - moving inside angular limits
// LimAng - hitting angular limit // LimAng - hitting angular limit
// OrthoLin, OrthoAng - against constraint axis // OrthoLin, OrthoAng - against constraint axis
btScalar m_softnessDirLin; btScalar m_softnessDirLin;
btScalar m_restitutionDirLin; btScalar m_restitutionDirLin;
btScalar m_dampingDirLin; btScalar m_dampingDirLin;
btScalar m_softnessDirAng; btScalar m_softnessDirAng;
btScalar m_restitutionDirAng; btScalar m_restitutionDirAng;
btScalar m_dampingDirAng; btScalar m_dampingDirAng;
btScalar m_softnessLimLin; btScalar m_softnessLimLin;
btScalar m_restitutionLimLin; btScalar m_restitutionLimLin;
btScalar m_dampingLimLin; btScalar m_dampingLimLin;
btScalar m_softnessLimAng; btScalar m_softnessLimAng;
btScalar m_restitutionLimAng; btScalar m_restitutionLimAng;
btScalar m_dampingLimAng; btScalar m_dampingLimAng;
btScalar m_softnessOrthoLin; btScalar m_softnessOrthoLin;
btScalar m_restitutionOrthoLin; btScalar m_restitutionOrthoLin;
btScalar m_dampingOrthoLin; btScalar m_dampingOrthoLin;
btScalar m_softnessOrthoAng; btScalar m_softnessOrthoAng;
btScalar m_restitutionOrthoAng; btScalar m_restitutionOrthoAng;
btScalar m_dampingOrthoAng; btScalar m_dampingOrthoAng;
// for interlal use // for interlal use
bool m_solveLinLim; bool m_solveLinLim;
bool m_solveAngLim; bool m_solveAngLim;
btJacobianEntry m_jacLin[3]; btJacobianEntry m_jacLin[3];
btScalar m_jacLinDiagABInv[3]; btScalar m_jacLinDiagABInv[3];
btJacobianEntry m_jacAng[3]; btJacobianEntry m_jacAng[3];
btScalar m_timeStep; btScalar m_timeStep;
btTransform m_calculatedTransformA; btTransform m_calculatedTransformA;
btTransform m_calculatedTransformB; btTransform m_calculatedTransformB;
btVector3 m_sliderAxis; btVector3 m_sliderAxis;
btVector3 m_realPivotAInW; btVector3 m_realPivotAInW;
btVector3 m_realPivotBInW; btVector3 m_realPivotBInW;
btVector3 m_projPivotInW; btVector3 m_projPivotInW;
btVector3 m_delta; btVector3 m_delta;
btVector3 m_depth; btVector3 m_depth;
btVector3 m_relPosA; btVector3 m_relPosA;
btVector3 m_relPosB; btVector3 m_relPosB;
btScalar m_angDepth; btScalar m_angDepth;
btScalar m_kAngle; btScalar m_kAngle;
bool m_poweredLinMotor; bool m_poweredLinMotor;
btScalar m_targetLinMotorVelocity; btScalar m_targetLinMotorVelocity;
btScalar m_maxLinMotorForce; btScalar m_maxLinMotorForce;
btScalar m_accumulatedLinMotorImpulse; btScalar m_accumulatedLinMotorImpulse;
bool m_poweredAngMotor; bool m_poweredAngMotor;
btScalar m_targetAngMotorVelocity; btScalar m_targetAngMotorVelocity;
btScalar m_maxAngMotorForce; btScalar m_maxAngMotorForce;
btScalar m_accumulatedAngMotorImpulse; btScalar m_accumulatedAngMotorImpulse;
//------------------------ //------------------------
void initParams(); void initParams();
public: public:
// constructors // constructors
btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA); btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
btSliderConstraint(); btSliderConstraint();
// overrides // overrides
virtual void buildJacobian(); virtual void buildJacobian();
virtual void solveConstraint(btScalar timeStep); virtual void solveConstraint(btScalar timeStep);
// access // access
const btRigidBody& getRigidBodyA() const { return m_rbA; } const btRigidBody& getRigidBodyA() const { return m_rbA; }
const btRigidBody& getRigidBodyB() const { return m_rbB; } const btRigidBody& getRigidBodyB() const { return m_rbB; }
const btTransform & getCalculatedTransformA() const { return m_calculatedTransformA; } const btTransform & getCalculatedTransformA() const { return m_calculatedTransformA; }
const btTransform & getCalculatedTransformB() const { return m_calculatedTransformB; } const btTransform & getCalculatedTransformB() const { return m_calculatedTransformB; }
const btTransform & getFrameOffsetA() const { return m_frameInA; } const btTransform & getFrameOffsetA() const { return m_frameInA; }
const btTransform & getFrameOffsetB() const { return m_frameInB; } const btTransform & getFrameOffsetB() const { return m_frameInB; }
btTransform & getFrameOffsetA() { return m_frameInA; } btTransform & getFrameOffsetA() { return m_frameInA; }
btTransform & getFrameOffsetB() { return m_frameInB; } btTransform & getFrameOffsetB() { return m_frameInB; }
btScalar getLowerLinLimit() { return m_lowerLinLimit; } btScalar getLowerLinLimit() { return m_lowerLinLimit; }
void setLowerLinLimit(btScalar lowerLimit) { m_lowerLinLimit = lowerLimit; } void setLowerLinLimit(btScalar lowerLimit) { m_lowerLinLimit = lowerLimit; }
btScalar getUpperLinLimit() { return m_upperLinLimit; } btScalar getUpperLinLimit() { return m_upperLinLimit; }
void setUpperLinLimit(btScalar upperLimit) { m_upperLinLimit = upperLimit; } void setUpperLinLimit(btScalar upperLimit) { m_upperLinLimit = upperLimit; }
btScalar getLowerAngLimit() { return m_lowerAngLimit; } btScalar getLowerAngLimit() { return m_lowerAngLimit; }
void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = lowerLimit; } void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = lowerLimit; }
btScalar getUpperAngLimit() { return m_upperAngLimit; } btScalar getUpperAngLimit() { return m_upperAngLimit; }
void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = upperLimit; } void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = upperLimit; }
bool getUseLinearReferenceFrameA() { return m_useLinearReferenceFrameA; } bool getUseLinearReferenceFrameA() { return m_useLinearReferenceFrameA; }
btScalar getSoftnessDirLin() { return m_softnessDirLin; } btScalar getSoftnessDirLin() { return m_softnessDirLin; }
btScalar getRestitutionDirLin() { return m_restitutionDirLin; } btScalar getRestitutionDirLin() { return m_restitutionDirLin; }
btScalar getDampingDirLin() { return m_dampingDirLin ; } btScalar getDampingDirLin() { return m_dampingDirLin ; }
btScalar getSoftnessDirAng() { return m_softnessDirAng; } btScalar getSoftnessDirAng() { return m_softnessDirAng; }
btScalar getRestitutionDirAng() { return m_restitutionDirAng; } btScalar getRestitutionDirAng() { return m_restitutionDirAng; }
btScalar getDampingDirAng() { return m_dampingDirAng; } btScalar getDampingDirAng() { return m_dampingDirAng; }
btScalar getSoftnessLimLin() { return m_softnessLimLin; } btScalar getSoftnessLimLin() { return m_softnessLimLin; }
btScalar getRestitutionLimLin() { return m_restitutionLimLin; } btScalar getRestitutionLimLin() { return m_restitutionLimLin; }
btScalar getDampingLimLin() { return m_dampingLimLin; } btScalar getDampingLimLin() { return m_dampingLimLin; }
btScalar getSoftnessLimAng() { return m_softnessLimAng; } btScalar getSoftnessLimAng() { return m_softnessLimAng; }
btScalar getRestitutionLimAng() { return m_restitutionLimAng; } btScalar getRestitutionLimAng() { return m_restitutionLimAng; }
btScalar getDampingLimAng() { return m_dampingLimAng; } btScalar getDampingLimAng() { return m_dampingLimAng; }
btScalar getSoftnessOrthoLin() { return m_softnessOrthoLin; } btScalar getSoftnessOrthoLin() { return m_softnessOrthoLin; }
btScalar getRestitutionOrthoLin() { return m_restitutionOrthoLin; } btScalar getRestitutionOrthoLin() { return m_restitutionOrthoLin; }
btScalar getDampingOrthoLin() { return m_dampingOrthoLin; } btScalar getDampingOrthoLin() { return m_dampingOrthoLin; }
btScalar getSoftnessOrthoAng() { return m_softnessOrthoAng; } btScalar getSoftnessOrthoAng() { return m_softnessOrthoAng; }
btScalar getRestitutionOrthoAng() { return m_restitutionOrthoAng; } btScalar getRestitutionOrthoAng() { return m_restitutionOrthoAng; }
btScalar getDampingOrthoAng() { return m_dampingOrthoAng; } btScalar getDampingOrthoAng() { return m_dampingOrthoAng; }
void setSoftnessDirLin(btScalar softnessDirLin) { m_softnessDirLin = softnessDirLin; } void setSoftnessDirLin(btScalar softnessDirLin) { m_softnessDirLin = softnessDirLin; }
void setRestitutionDirLin(btScalar restitutionDirLin) { m_restitutionDirLin = restitutionDirLin; } void setRestitutionDirLin(btScalar restitutionDirLin) { m_restitutionDirLin = restitutionDirLin; }
void setDampingDirLin(btScalar dampingDirLin) { m_dampingDirLin = dampingDirLin; } void setDampingDirLin(btScalar dampingDirLin) { m_dampingDirLin = dampingDirLin; }
void setSoftnessDirAng(btScalar softnessDirAng) { m_softnessDirAng = softnessDirAng; } void setSoftnessDirAng(btScalar softnessDirAng) { m_softnessDirAng = softnessDirAng; }
void setRestitutionDirAng(btScalar restitutionDirAng) { m_restitutionDirAng = restitutionDirAng; } void setRestitutionDirAng(btScalar restitutionDirAng) { m_restitutionDirAng = restitutionDirAng; }
void setDampingDirAng(btScalar dampingDirAng) { m_dampingDirAng = dampingDirAng; } void setDampingDirAng(btScalar dampingDirAng) { m_dampingDirAng = dampingDirAng; }
void setSoftnessLimLin(btScalar softnessLimLin) { m_softnessLimLin = softnessLimLin; } void setSoftnessLimLin(btScalar softnessLimLin) { m_softnessLimLin = softnessLimLin; }
void setRestitutionLimLin(btScalar restitutionLimLin) { m_restitutionLimLin = restitutionLimLin; } void setRestitutionLimLin(btScalar restitutionLimLin) { m_restitutionLimLin = restitutionLimLin; }
void setDampingLimLin(btScalar dampingLimLin) { m_dampingLimLin = dampingLimLin; } void setDampingLimLin(btScalar dampingLimLin) { m_dampingLimLin = dampingLimLin; }
void setSoftnessLimAng(btScalar softnessLimAng) { m_softnessLimAng = softnessLimAng; } void setSoftnessLimAng(btScalar softnessLimAng) { m_softnessLimAng = softnessLimAng; }
void setRestitutionLimAng(btScalar restitutionLimAng) { m_restitutionLimAng = restitutionLimAng; } void setRestitutionLimAng(btScalar restitutionLimAng) { m_restitutionLimAng = restitutionLimAng; }
void setDampingLimAng(btScalar dampingLimAng) { m_dampingLimAng = dampingLimAng; } void setDampingLimAng(btScalar dampingLimAng) { m_dampingLimAng = dampingLimAng; }
void setSoftnessOrthoLin(btScalar softnessOrthoLin) { m_softnessOrthoLin = softnessOrthoLin; } void setSoftnessOrthoLin(btScalar softnessOrthoLin) { m_softnessOrthoLin = softnessOrthoLin; }
void setRestitutionOrthoLin(btScalar restitutionOrthoLin) { m_restitutionOrthoLin = restitutionOrthoLin; } void setRestitutionOrthoLin(btScalar restitutionOrthoLin) { m_restitutionOrthoLin = restitutionOrthoLin; }
void setDampingOrthoLin(btScalar dampingOrthoLin) { m_dampingOrthoLin = dampingOrthoLin; } void setDampingOrthoLin(btScalar dampingOrthoLin) { m_dampingOrthoLin = dampingOrthoLin; }
void setSoftnessOrthoAng(btScalar softnessOrthoAng) { m_softnessOrthoAng = softnessOrthoAng; } void setSoftnessOrthoAng(btScalar softnessOrthoAng) { m_softnessOrthoAng = softnessOrthoAng; }
void setRestitutionOrthoAng(btScalar restitutionOrthoAng) { m_restitutionOrthoAng = restitutionOrthoAng; } void setRestitutionOrthoAng(btScalar restitutionOrthoAng) { m_restitutionOrthoAng = restitutionOrthoAng; }
void setDampingOrthoAng(btScalar dampingOrthoAng) { m_dampingOrthoAng = dampingOrthoAng; } void setDampingOrthoAng(btScalar dampingOrthoAng) { m_dampingOrthoAng = dampingOrthoAng; }
void setPoweredLinMotor(bool onOff) { m_poweredLinMotor = onOff; } void setPoweredLinMotor(bool onOff) { m_poweredLinMotor = onOff; }
bool getPoweredLinMotor() { return m_poweredLinMotor; } bool getPoweredLinMotor() { return m_poweredLinMotor; }
void setTargetLinMotorVelocity(btScalar targetLinMotorVelocity) { m_targetLinMotorVelocity = targetLinMotorVelocity; } void setTargetLinMotorVelocity(btScalar targetLinMotorVelocity) { m_targetLinMotorVelocity = targetLinMotorVelocity; }
btScalar getTargetLinMotorVelocity() { return m_targetLinMotorVelocity; } btScalar getTargetLinMotorVelocity() { return m_targetLinMotorVelocity; }
void setMaxLinMotorForce(btScalar maxLinMotorForce) { m_maxLinMotorForce = maxLinMotorForce; } void setMaxLinMotorForce(btScalar maxLinMotorForce) { m_maxLinMotorForce = maxLinMotorForce; }
btScalar getMaxLinMotorForce() { return m_maxLinMotorForce; } btScalar getMaxLinMotorForce() { return m_maxLinMotorForce; }
void setPoweredAngMotor(bool onOff) { m_poweredAngMotor = onOff; } void setPoweredAngMotor(bool onOff) { m_poweredAngMotor = onOff; }
bool getPoweredAngMotor() { return m_poweredAngMotor; } bool getPoweredAngMotor() { return m_poweredAngMotor; }
void setTargetAngMotorVelocity(btScalar targetAngMotorVelocity) { m_targetAngMotorVelocity = targetAngMotorVelocity; } void setTargetAngMotorVelocity(btScalar targetAngMotorVelocity) { m_targetAngMotorVelocity = targetAngMotorVelocity; }
btScalar getTargetAngMotorVelocity() { return m_targetAngMotorVelocity; } btScalar getTargetAngMotorVelocity() { return m_targetAngMotorVelocity; }
void setMaxAngMotorForce(btScalar maxAngMotorForce) { m_maxAngMotorForce = maxAngMotorForce; } void setMaxAngMotorForce(btScalar maxAngMotorForce) { m_maxAngMotorForce = maxAngMotorForce; }
btScalar getMaxAngMotorForce() { return m_maxAngMotorForce; } btScalar getMaxAngMotorForce() { return m_maxAngMotorForce; }
// access for ODE solver // access for ODE solver
bool getSolveLinLimit() { return m_solveLinLim; } bool getSolveLinLimit() { return m_solveLinLim; }
btScalar getLinDepth() { return m_depth[0]; } btScalar getLinDepth() { return m_depth[0]; }
bool getSolveAngLimit() { return m_solveAngLim; } bool getSolveAngLimit() { return m_solveAngLim; }
btScalar getAngDepth() { return m_angDepth; } btScalar getAngDepth() { return m_angDepth; }
// internal // internal
void buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB); void buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB);
void solveConstraintInt(btRigidBody& rbA, btRigidBody& rbB); void solveConstraintInt(btRigidBody& rbA, btRigidBody& rbB);
// shared code used by ODE solver // shared code used by ODE solver
void calculateTransforms(void); void calculateTransforms(void);
void testLinLimits(void); void testLinLimits(void);
void testAngLimits(void); void testAngLimits(void);
}; // access for PE Solver
btVector3 getAncorInA(void);
//----------------------------------------------------------------------------- btVector3 getAncorInB(void);
};
#endif //SLIDER_CONSTRAINT_H
//-----------------------------------------------------------------------------
#endif //SLIDER_CONSTRAINT_H