|
Bullet Collision Detection & Physics Library
|
Go to the documentation of this file.
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;
145 if (index >= 0 && index < getNumLinks())
147 return getLink(index).m_collider;
157 int getParent(
int link_num)
const;
170 const btVector3 & getLinkInertia(
int i)
const;
189 return btVector3(m_realBuf[3],m_realBuf[4],m_realBuf[5]);
220 m_realBuf[3]=vel[0]; m_realBuf[4]=vel[1]; m_realBuf[5]=vel[2];
228 m_realBuf[0]=omega[0];
229 m_realBuf[1]=omega[1];
230 m_realBuf[2]=omega[2];
241 btScalar * getJointVelMultiDof(
int i);
242 btScalar * getJointPosMultiDof(
int i);
244 const btScalar * getJointVelMultiDof(
int i)
const ;
245 const btScalar * getJointPosMultiDof(
int i)
const ;
247 void setJointPos(
int i,
btScalar q);
248 void setJointVel(
int i,
btScalar qdot);
249 void setJointPosMultiDof(
int i,
btScalar *q);
250 void setJointVelMultiDof(
int i,
btScalar *qdot);
260 return &m_realBuf[0];
273 const btVector3 & getRVector(
int i)
const;
303 void clearForcesAndTorques();
304 void clearConstraintForces();
306 void clearVelocities();
313 void addLinkForce(
int i,
const btVector3 &f);
314 void addLinkTorque(
int i,
const btVector3 &t);
318 m_baseConstraintForce += f;
321 void addLinkConstraintForce(
int i,
const btVector3 &f);
322 void addLinkConstraintTorque(
int i,
const btVector3 &t);
325 void addJointTorque(
int i,
btScalar Q);
326 void addJointTorqueMultiDof(
int i,
int dof,
btScalar Q);
327 void addJointTorqueMultiDof(
int i,
const btScalar *Q);
331 const btVector3 & getLinkForce(
int i)
const;
332 const btVector3 & getLinkTorque(
int i)
const;
333 btScalar getJointTorque(
int i)
const;
334 btScalar * getJointTorqueMultiDof(
int i);
355 void computeAccelerationsArticulatedBodyAlgorithmMultiDof(
btScalar dt,
359 bool isConstraintPass=
false
367 bool isConstraintPass=
false)
369 computeAccelerationsArticulatedBodyAlgorithmMultiDof(dt,scratch_r,scratch_v,scratch_m,isConstraintPass);
385 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
387 m_deltaV[dof] += delta_vee[dof] * multiplier;
392 applyDeltaVeeMultiDof(&m_deltaV[0],1);
394 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
418 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
420 m_realBuf[dof] += delta_vee[dof] * multiplier;
421 btClamp(m_realBuf[dof],-m_maxCoordinateVelocity,m_maxCoordinateVelocity);
449 void fillConstraintJacobianMultiDof(
int link,
464 m_canSleep = canSleep;
475 void checkMotionAndSleepIfRequired(
btScalar timestep);
494 m_links.resize(numLinks);
499 return m_linearDamping;
503 m_linearDamping = damp;
507 return m_angularDamping;
511 m_angularDamping = damp;
516 return m_useGyroTerm;
520 m_useGyroTerm = useGyro;
524 return m_maxCoordinateVelocity ;
528 m_maxCoordinateVelocity = maxVel;
533 return m_maxAppliedImpulse;
537 m_maxAppliedImpulse = maxImp;
541 m_hasSelfCollision = hasSelfCollision;
545 return m_hasSelfCollision;
549 void finalizeMultiDof();
562 __posUpdated = updated;
568 return m_internalNeedsJointFeedback;
633 int dofOffset = 0, cfgOffset = 0;
634 for(
int bidx = 0; bidx < m_links.size(); ++bidx)
636 m_links[bidx].m_dofOffset = dofOffset; m_links[bidx].m_cfgOffset = cfgOffset;
637 dofOffset += m_links[bidx].m_dofCount; cfgOffset += m_links[bidx].m_posVarCount;
void setBaseMass(btScalar mass)
btTransformFloatData m_baseWorldTransform
const btVector3 getBaseVel() const
void setBaseName(const char *name)
memory of setBaseName needs to be manager by user
btScalar getLinearDamping() const
void addBaseConstraintTorque(const btVector3 &t)
void * getUserPointer() const
users can point to their objects, userPointer is not used by Bullet
btMultiBodyLinkFloatData * m_links
bool isUsingGlobalVelocities() const
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
int getCompanionId() const
void processDeltaVeeMultiDof2()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3DoubleData m_parentComToThisComOffset
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
bool internalNeedsJointFeedback() const
btVector3 m_baseConstraintTorque
void setWorldToBaseRot(const btQuaternion &rot)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
const btQuaternion & getWorldToBaseRot() const
btQuaternion inverse() const
Return the inverse of this quaternion.
btVector3DoubleData m_linkInertia
bool isPosUpdated() const
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
const char * getBaseName() const
btMultiBodyLinkCollider * getBaseCollider()
void setNumLinks(int numLinks)
btMultiBodyLinkCollider * m_baseCollider
btScalar getAngularDamping() const
btAlignedObjectArray< btScalar > m_deltaV
btScalar getMaxCoordinateVelocity() const
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion.
btMatrix3x3 m_cachedInertiaLowerRight
btTransform getBaseWorldTransform() const
btVector3FloatData m_jointAxisBottom[6]
bool isUsingRK4Integration() const
void setBaseVel(const btVector3 &vel)
btScalar m_maxCoordinateVelocity
void addBaseTorque(const btVector3 &t)
btVector3FloatData m_jointAxisTop[6]
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
bool m_cachedInertiaValid
void setUserIndex(int index)
users can point to their objects, userPointer is not used by Bullet
void setBaseCollider(btMultiBodyLinkCollider *collider)
btScalar getMaxAppliedImpulse() const
bool getUseGyroTerm() const
void btClamp(T &a, const T &lb, const T &ub)
btCollisionObjectFloatData * m_linkCollider
btMultibodyLink & getLink(int index)
btVector3 m_baseConstraintForce
bool m_internalNeedsJointFeedback
the m_needsJointFeedback gets updated/computed during the stepVelocitiesMultiDof and it for internal ...
btScalar m_maxAppliedImpulse
const btVector3 & getBaseInertia() const
btTransformDoubleData m_baseWorldTransform
void setLinearDamping(btScalar damp)
btVector3 getBaseOmega() const
bool hasFixedBase() const
void addBaseForce(const btVector3 &f)
bool hasSelfCollision() const
btMatrix3x3 m_cachedInertiaLowerLeft
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btScalar getBaseMass() const
void setBaseOmega(const btVector3 &omega)
virtual int calculateSerializeBufferSize() const
btVector3DoubleData m_jointAxisBottom[6]
btQuaternionDoubleData m_zeroRotParentToThis
btMatrix3x3 m_cachedInertiaTopLeft
btQuaternionFloatData m_zeroRotParentToThis
#define BT_DECLARE_ALIGNED_ALLOCATOR()
const btMultibodyLink & getLink(int index) const
btVector3 can be used to represent 3D points and vectors.
void setHasSelfCollision(bool hasSelfCollision)
int getNumPosVars() const
void setMaxCoordinateVelocity(btScalar maxVel)
btVector3DoubleData m_baseInertia
double m_jointMaxVelocity
void setUseGyroTerm(bool useGyro)
void updateLinksDofOffsets()
void setCompanionId(int id)
#define ATTRIBUTE_ALIGNED16(a)
void setPosUpdated(bool updated)
void * m_userObjectPointer
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 setMaxAppliedImpulse(btScalar maxImp)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
void setAngularDamping(btScalar damp)
btVector3DoubleData m_thisPivotToThisComOffset
void setUserPointer(void *userPointer)
users can point to their objects, userPointer is not used by Bullet
btAlignedObjectArray< btVector3 > m_vectorBuf
btVector3FloatData m_baseInertia
const btScalar * getVelocityVector() const
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
btMatrix3x3 m_cachedInertiaTopRight
btVector3FloatData m_thisPivotToThisComOffset
btVector3FloatData m_linkInertia
void setBaseInertia(const btVector3 &inertia)
void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier)
btAlignedObjectArray< btScalar > m_realBuf
void addBaseConstraintForce(const btVector3 &f)
btScalar m_angularDamping
const btVector3 & getBaseForce() const
btVector3FloatData m_parentComToThisComOffset
void setUserIndex2(int index)
void useGlobalVelocities(bool use)
void * m_userObjectPointer
users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPoin...
void setCanSleep(bool canSleep)
void useRK4Integration(bool use)
const btVector3 & getBasePos() const
btCollisionObjectDoubleData * m_baseCollider
btCollisionObjectDoubleData * m_linkCollider
const btMultiBodyLinkCollider * getBaseCollider() const
const btVector3 & getBaseTorque() const
btAlignedObjectArray< btMultibodyLink > m_links
void setBasePos(const btVector3 &pos)
btMultiBodyLinkCollider * getLinkCollider(int index)
btMultiBodyLinkDoubleData * m_links
int getUserIndex2() const
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...
btVector3DoubleData m_jointAxisTop[6]
btCollisionObjectFloatData * m_baseCollider
void setBaseWorldTransform(const btTransform &tr)