25 #ifndef BT_MULTIBODY_H    26 #define BT_MULTIBODY_H    36 #ifdef BT_USE_DOUBLE_PRECISION    37         #define btMultiBodyData btMultiBodyDoubleData    38         #define btMultiBodyDataName     "btMultiBodyDoubleData"    39         #define btMultiBodyLinkData btMultiBodyLinkDoubleData    40         #define btMultiBodyLinkDataName "btMultiBodyLinkDoubleData"    42         #define btMultiBodyData btMultiBodyFloatData    43         #define btMultiBodyDataName     "btMultiBodyFloatData"    44         #define btMultiBodyLinkData btMultiBodyLinkFloatData    45         #define btMultiBodyLinkDataName "btMultiBodyLinkFloatData"    46 #endif //BT_USE_DOUBLE_PRECISION    66                 bool canSleep, 
bool deprecatedMultiDof=
true);
    72         void setupFixed(
int linkIndex,
    77                                                    const btVector3 &parentComToThisPivotOffset,
    78                            const btVector3 &thisPivotToThisComOffset, 
bool deprecatedDisableParentCollision=
true);
    81         void setupPrismatic(
int i,
    87                                const btVector3 &parentComToThisPivotOffset,
    88                                                            const btVector3 &thisPivotToThisComOffset,
    89                                                            bool disableParentCollision);
    91     void setupRevolute(
int linkIndex,            
    97                        const btVector3 &parentComToThisPivotOffset,    
    98                        const btVector3 &thisPivotToThisComOffset,       
    99                                            bool disableParentCollision=
false);
   101         void setupSpherical(
int linkIndex,                                                                                      
   106                        const btVector3 &parentComToThisPivotOffset,                     
   107                        const btVector3 &thisPivotToThisComOffset,                               
   108                                            bool disableParentCollision=
false);          
   110         void setupPlanar(
int i,                                                                                 
   116                        const btVector3 &parentComToThisComOffset,                       
   117                                            bool disableParentCollision=
false);          
   121                 return m_links[index];
   126                 return m_links[index];
   132                 m_baseCollider = collider;
   136                 return m_baseCollider;
   140                 return m_baseCollider;
   148     int getParent(
int link_num) 
const;
   161     const btVector3 & getLinkInertia(
int i) 
const;
   180                 return btVector3(m_realBuf[3],m_realBuf[4],m_realBuf[5]); 
   211                 m_realBuf[3]=vel[0]; m_realBuf[4]=vel[1]; m_realBuf[5]=vel[2]; 
   219                 m_realBuf[0]=omega[0]; 
   220                 m_realBuf[1]=omega[1]; 
   221                 m_realBuf[2]=omega[2]; 
   232         btScalar * getJointVelMultiDof(
int i);
   233         btScalar * getJointPosMultiDof(
int i);
   235         const btScalar * getJointVelMultiDof(
int i) 
const ;
   236         const btScalar * getJointPosMultiDof(
int i) 
const ;
   238     void setJointPos(
int i, 
btScalar q);
   239     void setJointVel(
int i, 
btScalar qdot);
   240         void setJointPosMultiDof(
int i, 
btScalar *q);
   241     void setJointVelMultiDof(
int i, 
btScalar *qdot);    
   251                 return &m_realBuf[0]; 
   264     const btVector3 & getRVector(
int i) 
const;   
   294     void clearForcesAndTorques();
   295    void clearConstraintForces();
   297         void clearVelocities();
   304     void addLinkForce(
int i, 
const btVector3 &f);
   305     void addLinkTorque(
int i, 
const btVector3 &t);
   309                 m_baseConstraintForce += f;
   312     void addLinkConstraintForce(
int i, 
const btVector3 &f);
   313     void addLinkConstraintTorque(
int i, 
const btVector3 &t);
   316 void addJointTorque(
int i, 
btScalar Q);
   317         void addJointTorqueMultiDof(
int i, 
int dof, 
btScalar Q);
   318         void addJointTorqueMultiDof(
int i, 
const btScalar *Q);
   322     const btVector3 & getLinkForce(
int i) 
const;
   323     const btVector3 & getLinkTorque(
int i) 
const;
   324     btScalar getJointTorque(
int i) 
const;
   325         btScalar * getJointTorqueMultiDof(
int i);
   346         void computeAccelerationsArticulatedBodyAlgorithmMultiDof(
btScalar dt,
   350                         bool isConstraintPass=
false   358                         bool isConstraintPass=
false)
   360                 computeAccelerationsArticulatedBodyAlgorithmMultiDof(dt,scratch_r,scratch_v,scratch_m,isConstraintPass);
   376                 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
   378                         m_deltaV[dof] += delta_vee[dof] * multiplier;
   383                 applyDeltaVeeMultiDof(&m_deltaV[0],1);
   385                 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
   409                 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
   411                         m_realBuf[dof] += delta_vee[dof] * multiplier;
   412                         btClamp(m_realBuf[dof],-m_maxCoordinateVelocity,m_maxCoordinateVelocity);
   440         void fillConstraintJacobianMultiDof(
int link,
   455                 m_canSleep = canSleep;
   466     void checkMotionAndSleepIfRequired(
btScalar timestep);
   485                 m_links.resize(numLinks);
   490                         return m_linearDamping;
   494                 m_linearDamping = damp;
   498                 return m_angularDamping;
   502                 m_angularDamping = damp;
   507                 return m_useGyroTerm;
   511                 m_useGyroTerm = useGyro;
   515                 return m_maxCoordinateVelocity ;
   519                 m_maxCoordinateVelocity = maxVel;
   524                 return m_maxAppliedImpulse;
   528                 m_maxAppliedImpulse = maxImp;
   532                 m_hasSelfCollision = hasSelfCollision;
   536                 return m_hasSelfCollision;
   540         void finalizeMultiDof();
   553                 __posUpdated = updated;
   559                 return m_internalNeedsJointFeedback;
   619         void solveImatrix(
const btVector3& rhs_top, 
const btVector3& rhs_bot, 
float result[6]) 
const;
   624                 int dofOffset = 0, cfgOffset = 0;
   625                 for(
int bidx = 0; bidx < m_links.size(); ++bidx)
   627                         m_links[bidx].m_dofOffset = dofOffset; m_links[bidx].m_cfgOffset = cfgOffset;
   628                         dofOffset += m_links[bidx].m_dofCount; cfgOffset += m_links[bidx].m_posVarCount;
 
void stepVelocitiesMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass=false)
stepVelocitiesMultiDof is deprecated, use computeAccelerationsArticulatedBodyAlgorithmMultiDof instea...
void setCanSleep(bool canSleep)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
const btVector3 & getBasePos() const
btAlignedObjectArray< btMultiBodyLinkCollider * > m_colliders
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure) 
btMultiBodyLinkCollider * getBaseCollider()
bool internalNeedsJointFeedback() const
void setNumLinks(int numLinks)
const btMultiBodyLinkCollider * getBaseCollider() const
btMultiBodyLinkCollider * m_baseCollider
int getUserIndex2() const
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone. 
bool isUsingGlobalVelocities() const
btVector3DoubleData m_jointAxisTop[6]
btScalar m_maxCoordinateVelocity
void addBaseTorque(const btVector3 &t)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btScalar getAngularDamping() const
void * getUserPointer() const
users can point to their objects, userPointer is not used by Bullet 
btQuaternionDoubleData m_zeroRotParentToThis
const btQuaternion & getWorldToBaseRot() const
btMatrix3x3 m_cachedInertiaLowerRight
btCollisionObjectFloatData * m_linkCollider
bool isPosUpdated() const
void setUserIndex(int index)
users can point to their objects, userPointer is not used by Bullet 
bool isUsingRK4Integration() const
void setBaseCollider(btMultiBodyLinkCollider *collider)
int getCompanionId() const
btScalar getMaxAppliedImpulse() const
bool getUseGyroTerm() const
void btClamp(T &a, const T &lb, const T &ub)
btVector3 m_baseConstraintTorque
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
void setWorldToBaseRot(const btQuaternion &rot)
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion. 
btScalar m_maxAppliedImpulse
btAlignedObjectArray< btScalar > m_deltaV
btScalar getMaxCoordinateVelocity() const
btVector3 getBaseOmega() const
void setBaseVel(const btVector3 &vel)
const char * getBaseName() const
btQuaternion inverse() const
Return the inverse of this quaternion. 
btMatrix3x3 m_cachedInertiaTopLeft
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
void setHasSelfCollision(bool hasSelfCollision)
void setMaxCoordinateVelocity(btScalar maxVel)
const btVector3 & getBaseInertia() const
btTransformFloatData m_baseWorldTransform
btTransform getBaseWorldTransform() const
void setUseGyroTerm(bool useGyro)
btMatrix3x3 m_cachedInertiaLowerLeft
btScalar getBaseMass() const
void setCompanionId(int id)
void setBaseOmega(const btVector3 &omega)
btMultibodyLink & getLink(int index)
bool m_cachedInertiaValid
bool hasFixedBase() const
btQuaternionFloatData m_zeroRotParentToThis
btVector3FloatData m_baseInertia
void * m_userObjectPointer
virtual int calculateSerializeBufferSize() const
void setAngularDamping(btScalar damp)
btVector3FloatData m_thisPivotToThisComOffset
btVector3DoubleData m_baseInertia
btVector3 m_baseConstraintForce
const btMultibodyLink & getLink(int index) const
btVector3 can be used to represent 3D points and vectors. 
#define ATTRIBUTE_ALIGNED16(a)
bool m_internalNeedsJointFeedback
the m_needsJointFeedback gets updated/computed during the stepVelocitiesMultiDof and it for internal ...
int getNumPosVars() const
void setLinearDamping(btScalar damp)
void addBaseForce(const btVector3 &f)
btAlignedObjectArray< btScalar > m_realBuf
bool hasSelfCollision() const
void updateLinksDofOffsets()
void setMaxAppliedImpulse(btScalar maxImp)
btMultiBodyLinkFloatData * m_links
void setUserPointer(void *userPointer)
users can point to their objects, userPointer is not used by Bullet 
void setUserIndex2(int index)
btCollisionObjectDoubleData * m_linkCollider
void setBaseInertia(const btVector3 &inertia)
void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier)
btTransformDoubleData m_baseWorldTransform
void setPosUpdated(bool updated)
#define BT_DECLARE_ALIGNED_ALLOCATOR()
void * m_userObjectPointer
users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPoin...
const btVector3 & getBaseTorque() const
btVector3DoubleData m_parentComToThisComOffset
btAlignedObjectArray< btVector3 > m_vectorBuf
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btVector3FloatData m_parentComToThisComOffset
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
void addBaseConstraintForce(const btVector3 &f)
void fillContactJacobianMultiDof(int link, const btVector3 &contact_point, const btVector3 &normal, btScalar *jac, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m) const
void setBaseMass(btScalar mass)
btVector3FloatData m_linkInertia
const btVector3 & getBaseForce() const
btAlignedObjectArray< btMultibodyLink > m_links
btVector3DoubleData m_linkInertia
void setBasePos(const btVector3 &pos)
btVector3DoubleData m_thisPivotToThisComOffset
void addBaseConstraintTorque(const btVector3 &t)
void useGlobalVelocities(bool use)
const btScalar * getVelocityVector() const
btMultiBodyLinkDoubleData * m_links
btCollisionObjectFloatData * m_baseCollider
btMatrix3x3 m_cachedInertiaTopRight
void useRK4Integration(bool use)
void setBaseWorldTransform(const btTransform &tr)
void processDeltaVeeMultiDof2()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar m_angularDamping
btVector3DoubleData m_jointAxisBottom[6]
btScalar getLinearDamping() const
const btVector3 getBaseVel() const
void setBaseName(const char *name)
memory of setBaseName needs to be manager by user 
btCollisionObjectDoubleData * m_baseCollider