Blender V2.61 - r43446

btSliderConstraint.h

Go to the documentation of this file.
00001 /*
00002 Bullet Continuous Collision Detection and Physics Library
00003 Copyright (c) 2003-2006 Erwin Coumans  http://continuousphysics.com/Bullet/
00004 
00005 This software is provided 'as-is', without any express or implied warranty.
00006 In no event will the authors be held liable for any damages arising from the use of this software.
00007 Permission is granted to anyone to use this software for any purpose,
00008 including commercial applications, and to alter it and redistribute it freely,
00009 subject to the following restrictions:
00010 
00011 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.
00012 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
00013 3. This notice may not be removed or altered from any source distribution.
00014 */
00015 
00016 /*
00017 Added by Roman Ponomarev (rponom@gmail.com)
00018 April 04, 2008
00019 
00020 TODO:
00021  - add clamping od accumulated impulse to improve stability
00022  - add conversion for ODE constraint solver
00023 */
00024 
00025 #ifndef SLIDER_CONSTRAINT_H
00026 #define SLIDER_CONSTRAINT_H
00027 
00028 
00029 
00030 #include "LinearMath/btVector3.h"
00031 #include "btJacobianEntry.h"
00032 #include "btTypedConstraint.h"
00033 
00034 
00035 
00036 class btRigidBody;
00037 
00038 
00039 
00040 #define SLIDER_CONSTRAINT_DEF_SOFTNESS      (btScalar(1.0))
00041 #define SLIDER_CONSTRAINT_DEF_DAMPING       (btScalar(1.0))
00042 #define SLIDER_CONSTRAINT_DEF_RESTITUTION   (btScalar(0.7))
00043 #define SLIDER_CONSTRAINT_DEF_CFM           (btScalar(0.f))
00044 
00045 
00046 enum btSliderFlags
00047 {
00048     BT_SLIDER_FLAGS_CFM_DIRLIN = (1 << 0),
00049     BT_SLIDER_FLAGS_ERP_DIRLIN = (1 << 1),
00050     BT_SLIDER_FLAGS_CFM_DIRANG = (1 << 2),
00051     BT_SLIDER_FLAGS_ERP_DIRANG = (1 << 3),
00052     BT_SLIDER_FLAGS_CFM_ORTLIN = (1 << 4),
00053     BT_SLIDER_FLAGS_ERP_ORTLIN = (1 << 5),
00054     BT_SLIDER_FLAGS_CFM_ORTANG = (1 << 6),
00055     BT_SLIDER_FLAGS_ERP_ORTANG = (1 << 7),
00056     BT_SLIDER_FLAGS_CFM_LIMLIN = (1 << 8),
00057     BT_SLIDER_FLAGS_ERP_LIMLIN = (1 << 9),
00058     BT_SLIDER_FLAGS_CFM_LIMANG = (1 << 10),
00059     BT_SLIDER_FLAGS_ERP_LIMANG = (1 << 11)
00060 };
00061 
00062 
00063 class btSliderConstraint : public btTypedConstraint
00064 {
00065 protected:
00067     bool        m_useSolveConstraintObsolete;
00068     bool        m_useOffsetForConstraintFrame;
00069     btTransform m_frameInA;
00070     btTransform m_frameInB;
00071     // use frameA fo define limits, if true
00072     bool m_useLinearReferenceFrameA;
00073     // linear limits
00074     btScalar m_lowerLinLimit;
00075     btScalar m_upperLinLimit;
00076     // angular limits
00077     btScalar m_lowerAngLimit;
00078     btScalar m_upperAngLimit;
00079     // softness, restitution and damping for different cases
00080     // DirLin - moving inside linear limits
00081     // LimLin - hitting linear limit
00082     // DirAng - moving inside angular limits
00083     // LimAng - hitting angular limit
00084     // OrthoLin, OrthoAng - against constraint axis
00085     btScalar m_softnessDirLin;
00086     btScalar m_restitutionDirLin;
00087     btScalar m_dampingDirLin;
00088     btScalar m_cfmDirLin;
00089 
00090     btScalar m_softnessDirAng;
00091     btScalar m_restitutionDirAng;
00092     btScalar m_dampingDirAng;
00093     btScalar m_cfmDirAng;
00094 
00095     btScalar m_softnessLimLin;
00096     btScalar m_restitutionLimLin;
00097     btScalar m_dampingLimLin;
00098     btScalar m_cfmLimLin;
00099 
00100     btScalar m_softnessLimAng;
00101     btScalar m_restitutionLimAng;
00102     btScalar m_dampingLimAng;
00103     btScalar m_cfmLimAng;
00104 
00105     btScalar m_softnessOrthoLin;
00106     btScalar m_restitutionOrthoLin;
00107     btScalar m_dampingOrthoLin;
00108     btScalar m_cfmOrthoLin;
00109 
00110     btScalar m_softnessOrthoAng;
00111     btScalar m_restitutionOrthoAng;
00112     btScalar m_dampingOrthoAng;
00113     btScalar m_cfmOrthoAng;
00114     
00115     // for interlal use
00116     bool m_solveLinLim;
00117     bool m_solveAngLim;
00118 
00119     int m_flags;
00120 
00121     btJacobianEntry m_jacLin[3];
00122     btScalar        m_jacLinDiagABInv[3];
00123 
00124     btJacobianEntry m_jacAng[3];
00125 
00126     btScalar m_timeStep;
00127     btTransform m_calculatedTransformA;
00128     btTransform m_calculatedTransformB;
00129 
00130     btVector3 m_sliderAxis;
00131     btVector3 m_realPivotAInW;
00132     btVector3 m_realPivotBInW;
00133     btVector3 m_projPivotInW;
00134     btVector3 m_delta;
00135     btVector3 m_depth;
00136     btVector3 m_relPosA;
00137     btVector3 m_relPosB;
00138 
00139     btScalar m_linPos;
00140     btScalar m_angPos;
00141 
00142     btScalar m_angDepth;
00143     btScalar m_kAngle;
00144 
00145     bool     m_poweredLinMotor;
00146     btScalar m_targetLinMotorVelocity;
00147     btScalar m_maxLinMotorForce;
00148     btScalar m_accumulatedLinMotorImpulse;
00149     
00150     bool     m_poweredAngMotor;
00151     btScalar m_targetAngMotorVelocity;
00152     btScalar m_maxAngMotorForce;
00153     btScalar m_accumulatedAngMotorImpulse;
00154 
00155     //------------------------    
00156     void initParams();
00157 public:
00158     // constructors
00159     btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
00160     btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA);
00161 
00162     // overrides
00163 
00164     virtual void getInfo1 (btConstraintInfo1* info);
00165 
00166     void getInfo1NonVirtual(btConstraintInfo1* info);
00167     
00168     virtual void getInfo2 (btConstraintInfo2* info);
00169 
00170     void getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB, btScalar rbAinvMass,btScalar rbBinvMass);
00171 
00172 
00173     // access
00174     const btRigidBody& getRigidBodyA() const { return m_rbA; }
00175     const btRigidBody& getRigidBodyB() const { return m_rbB; }
00176     const btTransform & getCalculatedTransformA() const { return m_calculatedTransformA; }
00177     const btTransform & getCalculatedTransformB() const { return m_calculatedTransformB; }
00178     const btTransform & getFrameOffsetA() const { return m_frameInA; }
00179     const btTransform & getFrameOffsetB() const { return m_frameInB; }
00180     btTransform & getFrameOffsetA() { return m_frameInA; }
00181     btTransform & getFrameOffsetB() { return m_frameInB; }
00182     btScalar getLowerLinLimit() { return m_lowerLinLimit; }
00183     void setLowerLinLimit(btScalar lowerLimit) { m_lowerLinLimit = lowerLimit; }
00184     btScalar getUpperLinLimit() { return m_upperLinLimit; }
00185     void setUpperLinLimit(btScalar upperLimit) { m_upperLinLimit = upperLimit; }
00186     btScalar getLowerAngLimit() { return m_lowerAngLimit; }
00187     void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = btNormalizeAngle(lowerLimit); }
00188     btScalar getUpperAngLimit() { return m_upperAngLimit; }
00189     void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = btNormalizeAngle(upperLimit); }
00190     bool getUseLinearReferenceFrameA() { return m_useLinearReferenceFrameA; }
00191     btScalar getSoftnessDirLin() { return m_softnessDirLin; }
00192     btScalar getRestitutionDirLin() { return m_restitutionDirLin; }
00193     btScalar getDampingDirLin() { return m_dampingDirLin ; }
00194     btScalar getSoftnessDirAng() { return m_softnessDirAng; }
00195     btScalar getRestitutionDirAng() { return m_restitutionDirAng; }
00196     btScalar getDampingDirAng() { return m_dampingDirAng; }
00197     btScalar getSoftnessLimLin() { return m_softnessLimLin; }
00198     btScalar getRestitutionLimLin() { return m_restitutionLimLin; }
00199     btScalar getDampingLimLin() { return m_dampingLimLin; }
00200     btScalar getSoftnessLimAng() { return m_softnessLimAng; }
00201     btScalar getRestitutionLimAng() { return m_restitutionLimAng; }
00202     btScalar getDampingLimAng() { return m_dampingLimAng; }
00203     btScalar getSoftnessOrthoLin() { return m_softnessOrthoLin; }
00204     btScalar getRestitutionOrthoLin() { return m_restitutionOrthoLin; }
00205     btScalar getDampingOrthoLin() { return m_dampingOrthoLin; }
00206     btScalar getSoftnessOrthoAng() { return m_softnessOrthoAng; }
00207     btScalar getRestitutionOrthoAng() { return m_restitutionOrthoAng; }
00208     btScalar getDampingOrthoAng() { return m_dampingOrthoAng; }
00209     void setSoftnessDirLin(btScalar softnessDirLin) { m_softnessDirLin = softnessDirLin; }
00210     void setRestitutionDirLin(btScalar restitutionDirLin) { m_restitutionDirLin = restitutionDirLin; }
00211     void setDampingDirLin(btScalar dampingDirLin) { m_dampingDirLin = dampingDirLin; }
00212     void setSoftnessDirAng(btScalar softnessDirAng) { m_softnessDirAng = softnessDirAng; }
00213     void setRestitutionDirAng(btScalar restitutionDirAng) { m_restitutionDirAng = restitutionDirAng; }
00214     void setDampingDirAng(btScalar dampingDirAng) { m_dampingDirAng = dampingDirAng; }
00215     void setSoftnessLimLin(btScalar softnessLimLin) { m_softnessLimLin = softnessLimLin; }
00216     void setRestitutionLimLin(btScalar restitutionLimLin) { m_restitutionLimLin = restitutionLimLin; }
00217     void setDampingLimLin(btScalar dampingLimLin) { m_dampingLimLin = dampingLimLin; }
00218     void setSoftnessLimAng(btScalar softnessLimAng) { m_softnessLimAng = softnessLimAng; }
00219     void setRestitutionLimAng(btScalar restitutionLimAng) { m_restitutionLimAng = restitutionLimAng; }
00220     void setDampingLimAng(btScalar dampingLimAng) { m_dampingLimAng = dampingLimAng; }
00221     void setSoftnessOrthoLin(btScalar softnessOrthoLin) { m_softnessOrthoLin = softnessOrthoLin; }
00222     void setRestitutionOrthoLin(btScalar restitutionOrthoLin) { m_restitutionOrthoLin = restitutionOrthoLin; }
00223     void setDampingOrthoLin(btScalar dampingOrthoLin) { m_dampingOrthoLin = dampingOrthoLin; }
00224     void setSoftnessOrthoAng(btScalar softnessOrthoAng) { m_softnessOrthoAng = softnessOrthoAng; }
00225     void setRestitutionOrthoAng(btScalar restitutionOrthoAng) { m_restitutionOrthoAng = restitutionOrthoAng; }
00226     void setDampingOrthoAng(btScalar dampingOrthoAng) { m_dampingOrthoAng = dampingOrthoAng; }
00227     void setPoweredLinMotor(bool onOff) { m_poweredLinMotor = onOff; }
00228     bool getPoweredLinMotor() { return m_poweredLinMotor; }
00229     void setTargetLinMotorVelocity(btScalar targetLinMotorVelocity) { m_targetLinMotorVelocity = targetLinMotorVelocity; }
00230     btScalar getTargetLinMotorVelocity() { return m_targetLinMotorVelocity; }
00231     void setMaxLinMotorForce(btScalar maxLinMotorForce) { m_maxLinMotorForce = maxLinMotorForce; }
00232     btScalar getMaxLinMotorForce() { return m_maxLinMotorForce; }
00233     void setPoweredAngMotor(bool onOff) { m_poweredAngMotor = onOff; }
00234     bool getPoweredAngMotor() { return m_poweredAngMotor; }
00235     void setTargetAngMotorVelocity(btScalar targetAngMotorVelocity) { m_targetAngMotorVelocity = targetAngMotorVelocity; }
00236     btScalar getTargetAngMotorVelocity() { return m_targetAngMotorVelocity; }
00237     void setMaxAngMotorForce(btScalar maxAngMotorForce) { m_maxAngMotorForce = maxAngMotorForce; }
00238     btScalar getMaxAngMotorForce() { return m_maxAngMotorForce; }
00239     btScalar getLinearPos() { return m_linPos; }
00240     
00241 
00242     // access for ODE solver
00243     bool getSolveLinLimit() { return m_solveLinLim; }
00244     btScalar getLinDepth() { return m_depth[0]; }
00245     bool getSolveAngLimit() { return m_solveAngLim; }
00246     btScalar getAngDepth() { return m_angDepth; }
00247     // shared code used by ODE solver
00248     void    calculateTransforms(const btTransform& transA,const btTransform& transB);
00249     void    testLinLimits();
00250     void    testAngLimits();
00251     // access for PE Solver
00252     btVector3 getAncorInA();
00253     btVector3 getAncorInB();
00254     // access for UseFrameOffset
00255     bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; }
00256     void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; }
00257 
00258     void setFrames(const btTransform& frameA, const btTransform& frameB) 
00259     { 
00260         m_frameInA=frameA; 
00261         m_frameInB=frameB;
00262         calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
00263         buildJacobian();
00264     } 
00265 
00266 
00269     virtual void    setParam(int num, btScalar value, int axis = -1);
00271     virtual btScalar getParam(int num, int axis = -1) const;
00272 
00273     virtual int calculateSerializeBufferSize() const;
00274 
00276     virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
00277 
00278 
00279 };
00280 
00282 struct btSliderConstraintData
00283 {
00284     btTypedConstraintData   m_typeConstraintData;
00285     btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
00286     btTransformFloatData m_rbBFrame;
00287     
00288     float   m_linearUpperLimit;
00289     float   m_linearLowerLimit;
00290 
00291     float   m_angularUpperLimit;
00292     float   m_angularLowerLimit;
00293 
00294     int m_useLinearReferenceFrameA;
00295     int m_useOffsetForConstraintFrame;
00296 
00297 };
00298 
00299 
00300 SIMD_FORCE_INLINE       int btSliderConstraint::calculateSerializeBufferSize() const
00301 {
00302     return sizeof(btSliderConstraintData);
00303 }
00304 
00306 SIMD_FORCE_INLINE   const char* btSliderConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
00307 {
00308 
00309     btSliderConstraintData* sliderData = (btSliderConstraintData*) dataBuffer;
00310     btTypedConstraint::serialize(&sliderData->m_typeConstraintData,serializer);
00311 
00312     m_frameInA.serializeFloat(sliderData->m_rbAFrame);
00313     m_frameInB.serializeFloat(sliderData->m_rbBFrame);
00314 
00315     sliderData->m_linearUpperLimit = float(m_upperLinLimit);
00316     sliderData->m_linearLowerLimit = float(m_lowerLinLimit);
00317 
00318     sliderData->m_angularUpperLimit = float(m_upperAngLimit);
00319     sliderData->m_angularLowerLimit = float(m_lowerAngLimit);
00320 
00321     sliderData->m_useLinearReferenceFrameA = m_useLinearReferenceFrameA;
00322     sliderData->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame;
00323 
00324     return "btSliderConstraintData";
00325 }
00326 
00327 
00328 
00329 #endif //SLIDER_CONSTRAINT_H
00330