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;
btMultiBodyLinkCollider * getLinkCollider(int index)
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
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 ...
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
btQuaternionDoubleData m_baseWorldOrientation
const btMultibodyLink & getLink(int index) const
bool isUsingGlobalVelocities() const
const btVector3 getBaseVel() const
btMultiBodyLinkCollider * getBaseCollider()
btVector3DoubleData m_absFrameLocVelocityTop
btVector3FloatData m_baseLinearVelocity
void setNumLinks(int numLinks)
btMultiBodyLinkCollider * m_baseCollider
btVector3DoubleData m_absFrameLocVelocityBottom
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone.
btVector3DoubleData m_jointAxisTop[6]
btScalar m_maxCoordinateVelocity
void addBaseTorque(const btVector3 &t)
btTransform getBaseWorldTransform() const
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btScalar getBaseMass() const
btQuaternionDoubleData m_zeroRotParentToThis
btVector3FloatData m_parentComToThisPivotOffset
btMatrix3x3 m_cachedInertiaLowerRight
btVector3DoubleData m_absFrameTotVelocityBottom
btCollisionObjectFloatData * m_linkCollider
void setUserIndex(int index)
users can point to their objects, userPointer is not used by Bullet
void setBaseCollider(btMultiBodyLinkCollider *collider)
bool internalNeedsJointFeedback() const
void btClamp(T &a, const T &lb, const T &ub)
const btVector3 & getBaseTorque() const
bool isPosUpdated() const
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
const char * getBaseName() const
btVector3FloatData m_absFrameTotVelocityTop
btAlignedObjectArray< btScalar > m_deltaV
btScalar getMaxAppliedImpulse() const
void setBaseVel(const btVector3 &vel)
btVector3DoubleData m_baseLinearVelocity
int getNumPosVars() const
btMatrix3x3 m_cachedInertiaTopLeft
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
const btVector3 & getBaseInertia() const
void setHasSelfCollision(bool hasSelfCollision)
void setMaxCoordinateVelocity(btScalar maxVel)
void setUseGyroTerm(bool useGyro)
void * getUserPointer() const
users can point to their objects, userPointer is not used by Bullet
btMatrix3x3 m_cachedInertiaLowerLeft
void setCompanionId(int id)
void setBaseOmega(const btVector3 &omega)
bool hasFixedBase() const
btMultibodyLink & getLink(int index)
bool m_cachedInertiaValid
btScalar getLinearDamping() const
bool hasSelfCollision() const
btQuaternionFloatData m_zeroRotParentToThis
btQuaternion inverse() const
Return the inverse of this quaternion.
btVector3FloatData m_baseInertia
void * m_userObjectPointer
void setAngularDamping(btScalar damp)
btVector3FloatData m_thisPivotToThisComOffset
btVector3FloatData m_absFrameLocVelocityBottom
btVector3DoubleData m_baseInertia
btVector3 m_baseConstraintForce
btVector3DoubleData m_baseWorldPosition
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 ...
btVector3FloatData m_absFrameTotVelocityBottom
void setLinearDamping(btScalar damp)
btQuaternionFloatData m_baseWorldOrientation
void addBaseForce(const btVector3 &f)
btAlignedObjectArray< btScalar > m_realBuf
void updateLinksDofOffsets()
void setMaxAppliedImpulse(btScalar maxImp)
btVector3 getBaseOmega() const
btMultiBodyLinkFloatData * m_links
int getCompanionId() const
void setUserPointer(void *userPointer)
users can point to their objects, userPointer is not used by Bullet
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 setUserIndex2(int index)
btScalar getAngularDamping() const
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
void * m_userObjectPointer
users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPoin...
bool isUsingRK4Integration() 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 ...
const btMultiBodyLinkCollider * getBaseCollider() const
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
const btQuaternion & getWorldToBaseRot() const
void addBaseConstraintForce(const btVector3 &f)
void setBaseMass(btScalar mass)
btVector3FloatData m_linkInertia
btVector3DoubleData m_baseAngularVelocity
const btVector3 & getBasePos() const
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)
btMultiBodyLinkDoubleData * m_links
btCollisionObjectFloatData * m_baseCollider
btMatrix3x3 m_cachedInertiaTopRight
btVector3DoubleData m_parentComToThisPivotOffset
void useRK4Integration(bool use)
int getUserIndex2() const
btVector3FloatData m_baseWorldPosition
void setBaseWorldTransform(const btTransform &tr)
const btScalar * getVelocityVector() const
void processDeltaVeeMultiDof2()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar m_angularDamping
virtual int calculateSerializeBufferSize() const
bool getUseGyroTerm() const
btVector3DoubleData m_jointAxisBottom[6]
btVector3FloatData m_absFrameLocVelocityTop
btScalar getMaxCoordinateVelocity() const
void setBaseName(const char *name)
memory of setBaseName needs to be manager by user
btCollisionObjectDoubleData * m_baseCollider