24 #ifndef BT_MULTIBODY_H 25 #define BT_MULTIBODY_H 34 #ifdef BT_USE_DOUBLE_PRECISION 35 #define btMultiBodyData btMultiBodyDoubleData 36 #define btMultiBodyDataName "btMultiBodyDoubleData" 37 #define btMultiBodyLinkData btMultiBodyLinkDoubleData 38 #define btMultiBodyLinkDataName "btMultiBodyLinkDoubleData" 40 #define btMultiBodyData btMultiBodyFloatData 41 #define btMultiBodyDataName "btMultiBodyFloatData" 42 #define btMultiBodyLinkData btMultiBodyLinkFloatData 43 #define btMultiBodyLinkDataName "btMultiBodyLinkFloatData" 44 #endif //BT_USE_DOUBLE_PRECISION 63 bool canSleep,
bool deprecatedMultiDof =
true);
68 void setupFixed(
int linkIndex,
73 const btVector3 &parentComToThisPivotOffset,
74 const btVector3 &thisPivotToThisComOffset,
bool deprecatedDisableParentCollision =
true);
76 void setupPrismatic(
int i,
82 const btVector3 &parentComToThisPivotOffset,
83 const btVector3 &thisPivotToThisComOffset,
84 bool disableParentCollision);
86 void setupRevolute(
int linkIndex,
92 const btVector3 &parentComToThisPivotOffset,
93 const btVector3 &thisPivotToThisComOffset,
94 bool disableParentCollision =
false);
96 void setupSpherical(
int linkIndex,
101 const btVector3 &parentComToThisPivotOffset,
102 const btVector3 &thisPivotToThisComOffset,
103 bool disableParentCollision =
false);
105 void setupPlanar(
int i,
111 const btVector3 &parentComToThisComOffset,
112 bool disableParentCollision =
false);
116 return m_links[index];
121 return m_links[index];
126 m_baseCollider = collider;
130 return m_baseCollider;
134 return m_baseCollider;
139 if (index >= 0 && index < getNumLinks())
141 return getLink(index).m_collider;
148 if (index >= 0 && index < getNumLinks())
150 return getLink(index).m_collider;
160 int getParent(
int link_num)
const;
172 const btVector3 &getLinkInertia(
int i)
const;
188 return btVector3(m_realBuf[3], m_realBuf[4], m_realBuf[5]);
217 m_realBuf[3] = vel[0];
218 m_realBuf[4] = vel[1];
219 m_realBuf[5] = vel[2];
227 m_realBuf[0] = omega[0];
228 m_realBuf[1] = omega[1];
229 m_realBuf[2] = omega[2];
239 btScalar *getJointVelMultiDof(
int i);
240 btScalar *getJointPosMultiDof(
int i);
242 const btScalar *getJointVelMultiDof(
int i)
const;
243 const btScalar *getJointPosMultiDof(
int i)
const;
245 void setJointPos(
int i,
btScalar q);
246 void setJointVel(
int i,
btScalar qdot);
247 void setJointPosMultiDof(
int i,
const double *q);
248 void setJointVelMultiDof(
int i,
const double *qdot);
249 void setJointPosMultiDof(
int i,
const float *q);
250 void setJointVelMultiDof(
int i,
const float *qdot);
258 return &m_realBuf[0];
271 const btVector3 &getRVector(
int i)
const;
299 void clearForcesAndTorques();
300 void clearConstraintForces();
302 void clearVelocities();
309 void addLinkForce(
int i,
const btVector3 &f);
310 void addLinkTorque(
int i,
const btVector3 &t);
314 m_baseConstraintForce += f;
317 void addLinkConstraintForce(
int i,
const btVector3 &f);
318 void addLinkConstraintTorque(
int i,
const btVector3 &t);
320 void addJointTorque(
int i,
btScalar Q);
321 void addJointTorqueMultiDof(
int i,
int dof,
btScalar Q);
322 void addJointTorqueMultiDof(
int i,
const btScalar *Q);
326 const btVector3 &getLinkForce(
int i)
const;
327 const btVector3 &getLinkTorque(
int i)
const;
328 btScalar getJointTorque(
int i)
const;
329 btScalar *getJointTorqueMultiDof(
int i);
348 void computeAccelerationsArticulatedBodyAlgorithmMultiDof(
btScalar dt,
352 bool isConstraintPass,
353 bool jointFeedbackInWorldSpace,
354 bool jointFeedbackInJointFrame
379 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
381 m_deltaV[dof] += delta_vee[dof] * multiplier;
386 applyDeltaVeeMultiDof(&m_deltaV[0], 1);
388 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
412 for (
int dof = 0; dof < 6 + getNumDofs(); ++dof)
414 m_realBuf[dof] += delta_vee[dof] * multiplier;
415 btClamp(m_realBuf[dof], -m_maxCoordinateVelocity, m_maxCoordinateVelocity);
440 void fillConstraintJacobianMultiDof(
int link,
454 m_canSleep = canSleep;
465 void checkMotionAndSleepIfRequired(
btScalar timestep);
484 m_links.resize(numLinks);
489 return m_linearDamping;
493 m_linearDamping = damp;
497 return m_angularDamping;
501 m_angularDamping = damp;
506 return m_useGyroTerm;
510 m_useGyroTerm = useGyro;
514 return m_maxCoordinateVelocity;
518 m_maxCoordinateVelocity = maxVel;
523 return m_maxAppliedImpulse;
527 m_maxAppliedImpulse = maxImp;
531 m_hasSelfCollision = hasSelfCollision;
535 return m_hasSelfCollision;
538 void finalizeMultiDof();
551 __posUpdated = updated;
557 return m_internalNeedsJointFeedback;
612 static void spatialTransform(
const btMatrix3x3 &rotation_matrix,
630 int dofOffset = 0, cfgOffset = 0;
631 for (
int bidx = 0; bidx < m_links.size(); ++bidx)
633 m_links[bidx].m_dofOffset = dofOffset;
634 m_links[bidx].m_cfgOffset = cfgOffset;
635 dofOffset += m_links[bidx].m_dofCount;
636 cfgOffset += m_links[bidx].m_posVarCount;
btMultiBodyLinkCollider * getLinkCollider(int index)
void setCanSleep(bool canSleep)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
const btVector3 & getBasePos() const
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
btQuaternionDoubleData m_baseWorldOrientation
btMultiBodyLinkCollider * getBaseCollider()
btVector3DoubleData m_absFrameLocVelocityTop
bool internalNeedsJointFeedback() const
btVector3FloatData m_baseLinearVelocity
void setNumLinks(int numLinks)
const btMultiBodyLinkCollider * getBaseCollider() const
btMultiBodyLinkCollider * m_baseCollider
int getUserIndex2() const
btVector3DoubleData m_absFrameLocVelocityBottom
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone.
bool isUsingGlobalVelocities() const
btVector3DoubleData m_jointAxisTop[6]
btScalar m_maxCoordinateVelocity
btVector3FloatData m_jointAxisTop[6]
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
btVector3FloatData m_parentComToThisPivotOffset
const btQuaternion & getWorldToBaseRot() const
btMatrix3x3 m_cachedInertiaLowerRight
btVector3DoubleData m_absFrameTotVelocityBottom
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
btVector3FloatData m_absFrameTotVelocityTop
btAlignedObjectArray< btScalar > m_deltaV
btScalar getMaxCoordinateVelocity() const
btVector3 getBaseOmega() const
void setBaseVel(const btVector3 &vel)
const char * getBaseName() const
btVector3DoubleData m_baseLinearVelocity
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
virtual int calculateSerializeBufferSize() const
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
btVector3FloatData m_jointAxisBottom[6]
void setAngularDamping(btScalar damp)
btVector3FloatData m_thisPivotToThisComOffset
const btMultiBodyLinkCollider * getLinkCollider(int index) const
btVector3FloatData m_absFrameLocVelocityBottom
btVector3DoubleData m_baseInertia
btVector3 m_baseConstraintForce
btVector3DoubleData m_baseWorldPosition
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
btVector3FloatData m_absFrameTotVelocityBottom
void setLinearDamping(btScalar damp)
btQuaternionFloatData m_baseWorldOrientation
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)
btVector3FloatData m_baseAngularVelocity
btCollisionObjectDoubleData * m_linkCollider
void setBaseInertia(const btVector3 &inertia)
void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier)
void setPosUpdated(bool updated)
#define BT_DECLARE_ALIGNED_ALLOCATOR()
btVector3DoubleData m_absFrameTotVelocityTop
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
void * m_userObjectPointer
users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPoin...
const btVector3 & getBaseTorque() const
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 ...
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
btVector3DoubleData m_baseAngularVelocity
const btVector3 & getBaseForce() const
btAlignedObjectArray< btMultibodyLink > m_links
double m_jointMaxVelocity
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
btVector3DoubleData m_parentComToThisPivotOffset
void useRK4Integration(bool use)
btVector3FloatData m_baseWorldPosition
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]
btVector3FloatData m_absFrameLocVelocityTop
btScalar getLinearDamping() const
const btVector3 getBaseVel() const
void setBaseName(const char *name)
memory of setBaseName needs to be manager by user
btCollisionObjectDoubleData * m_baseCollider