24 #ifndef BT_MULTIBODY_H
25 #define BT_MULTIBODY_H
33 #ifdef BT_USE_DOUBLE_PRECISION
34 #define btMultiBodyData btMultiBodyDoubleData
35 #define btMultiBodyDataName "btMultiBodyDoubleData"
36 #define btMultiBodyLinkData btMultiBodyLinkDoubleData
37 #define btMultiBodyLinkDataName "btMultiBodyLinkDoubleData"
39 #define btMultiBodyData btMultiBodyFloatData
40 #define btMultiBodyDataName "btMultiBodyFloatData"
41 #define btMultiBodyLinkData btMultiBodyLinkFloatData
42 #define btMultiBodyLinkDataName "btMultiBodyLinkFloatData"
43 #endif //BT_USE_DOUBLE_PRECISION
75 const btVector3 &parentComToThisPivotOffset,
76 const btVector3 &thisPivotToThisComOffset,
77 bool disableParentCollision);
86 const btVector3 &parentComToThisPivotOffset,
87 const btVector3 &thisPivotToThisComOffset,
88 bool disableParentCollision);
96 const btVector3 &parentComToThisPivotOffset,
97 const btVector3 &thisPivotToThisComOffset,
98 bool disableParentCollision=
false);
105 const btVector3 &parentComToThisPivotOffset,
106 const btVector3 &thisPivotToThisComOffset,
107 bool disableParentCollision=
false);
115 const btVector3 &parentComToThisComOffset,
116 bool disableParentCollision=
false);
348 bool isConstraintPass=
false
380 sum += delta_vee[i]*multiplier*delta_vee[i]*multiplier;
399 sum += delta_vee[i]*multiplier*delta_vee[i]*multiplier;
400 m_realBuf[i] += delta_vee[i] * multiplier;
407 for (
int dof = 0; dof < 6 +
getNumDofs(); ++dof)
409 m_deltaV[dof] += delta_vee[dof] * multiplier;
416 for (
int dof = 0; dof < 6 +
getNumDofs(); ++dof)
440 for (
int dof = 0; dof < 6 +
getNumDofs(); ++dof)
442 m_realBuf[dof] += delta_vee[dof] * multiplier;
631 int dofOffset = 0, cfgOffset = 0;
634 m_links[bidx].m_dofOffset = dofOffset;
m_links[bidx].m_cfgOffset = cfgOffset;
635 dofOffset +=
m_links[bidx].m_dofCount; cfgOffset +=
m_links[bidx].m_posVarCount;
void calcAccelerationDeltas(const btScalar *force, btScalar *output, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v) const
static T sum(const btAlignedObjectArray< T > &items)
void setupPlanar(int i, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &rotationAxis, const btVector3 &parentComToThisComOffset, bool disableParentCollision=false)
void stepVelocitiesMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass=false)
void setCanSleep(bool canSleep)
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
void setupFixed(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision)
void clearConstraintForces()
void setupRevolute(int linkIndex, btScalar mass, const btVector3 &inertia, int parentIndex, const btQuaternion &rotParentToThis, const btVector3 &jointAxis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision=false)
btAlignedObjectArray< btMultiBodyLinkCollider * > m_colliders
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
const btMultibodyLink & getLink(int index) const
BT_DECLARE_ALIGNED_ALLOCATOR()
bool isUsingGlobalVelocities() const
const btVector3 getBaseVel() const
btMultiBodyLinkCollider * getBaseCollider()
void setNumLinks(int numLinks)
btMultiBodyLinkCollider * m_baseCollider
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone.
btVector3DoubleData m_jointAxisTop[6]
void stepPositionsMultiDof(btScalar dt, btScalar *pq=0, btScalar *pqd=0)
btScalar m_maxCoordinateVelocity
btVector3FloatData m_jointAxisTop[6]
void addBaseTorque(const btVector3 &t)
btTransform getBaseWorldTransform() const
const btVector3 & getLinkForce(int i) const
virtual int calculateSerializeBufferSize() const
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
btScalar getBaseMass() const
btScalar btSqrt(btScalar y)
void setupSpherical(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision=false)
btQuaternionDoubleData m_zeroRotParentToThis
btVector3 localDirToWorld(int i, const btVector3 &vec) const
void addLinkConstraintForce(int i, const btVector3 &f)
btMatrix3x3 m_cachedInertiaLowerRight
btCollisionObjectFloatData * m_linkCollider
btScalar * getJointVelMultiDof(int i)
void addLinkForce(int i, const btVector3 &f)
void mulMatrix(btScalar *pA, btScalar *pB, int rowsA, int colsA, int rowsB, int colsB, btScalar *pC) const
void setBaseCollider(btMultiBodyLinkCollider *collider)
bool internalNeedsJointFeedback() const
btScalar getJointPos(int i) const
void btClamp(T &a, const T &lb, const T &ub)
const btVector3 & getBaseTorque() const
bool isPosUpdated() const
void setJointPosMultiDof(int i, btScalar *q)
void updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
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
btAlignedObjectArray< btScalar > m_deltaV
btScalar getMaxAppliedImpulse() const
void applyDeltaVee(const btScalar *delta_vee)
void clearForcesAndTorques()
btVector3 getAngularMomentum() const
btMultiBody(int n_links, btScalar mass, const btVector3 &inertia, bool fixedBase, bool canSleep, bool multiDof=false)
void setBaseVel(const btVector3 &vel)
void addLinkConstraintTorque(int i, const btVector3 &t)
int getNumPosVars() const
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
btMatrix3x3 m_cachedInertiaTopLeft
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64 ...
const btVector3 & getBaseInertia() const
void setupPrismatic(int i, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &jointAxis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision)
void setHasSelfCollision(bool hasSelfCollision)
void setMaxCoordinateVelocity(btScalar maxVel)
int size() const
return the number of elements in the array
btTransformFloatData m_baseWorldTransform
void setUseGyroTerm(bool useGyro)
btMatrix3x3 m_cachedInertiaLowerLeft
const btVector3 & getLinkTorque(int i) const
void addLinkTorque(int i, const btVector3 &t)
void setCompanionId(int id)
void setBaseOmega(const btVector3 &omega)
void filConstraintJacobianMultiDof(int link, const btVector3 &contact_point, const btVector3 &normal_ang, const btVector3 &normal_lin, btScalar *jac, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m) const
void compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const
bool hasFixedBase() const
btMultibodyLink & getLink(int index)
void addJointTorque(int i, btScalar Q)
btScalar getLinearDamping() const
void solveImatrix(const btVector3 &rhs_top, const btVector3 &rhs_bot, float result[6]) const
const btVector3 & getRVector(int i) const
bool hasSelfCollision() const
btQuaternionFloatData m_zeroRotParentToThis
btQuaternion inverse() const
Return the inverse of this quaternion.
void setJointVel(int i, btScalar qdot)
btVector3FloatData m_baseInertia
void operator=(const btMultiBody &)
void setJointPos(int i, btScalar q)
btVector3FloatData m_jointAxisBottom[6]
void setAngularDamping(btScalar damp)
btVector3FloatData m_thisPivotToThisComOffset
void checkMotionAndSleepIfRequired(btScalar timestep)
btVector3DoubleData m_baseInertia
btVector3 m_baseConstraintForce
btVector3 can be used to represent 3D points and vectors.
bool m_internalNeedsJointFeedback
the m_needsJointFeedback gets updated/computed during the stepVelocitiesMultiDof and it for internal ...
void setLinearDamping(btScalar damp)
btScalar getLinkMass(int i) const
void addBaseForce(const btVector3 &f)
btAlignedObjectArray< btScalar > m_realBuf
void calcAccelerationDeltasMultiDof(const btScalar *force, btScalar *output, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v) const
void updateLinksDofOffsets()
void setMaxAppliedImpulse(btScalar maxImp)
btVector3 getBaseOmega() const
btMultiBodyLinkFloatData * m_links
int getCompanionId() const
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
bool m_useGlobalVelocities
btScalar getAngularDamping() const
void resize(int newsize, const T &fillData=T())
void addJointTorqueMultiDof(int i, int dof, btScalar Q)
btCollisionObjectDoubleData * m_linkCollider
void applyDeltaVee(const btScalar *delta_vee, btScalar multiplier)
void setBaseInertia(const btVector3 &inertia)
void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier)
btTransformDoubleData m_baseWorldTransform
void setPosUpdated(bool updated)
btVector3 worldPosToLocal(int i, const btVector3 &vec) const
const btQuaternion & getParentToLocalRot(int i) const
btVector3DoubleData m_parentComToThisComOffset
bool isUsingRK4Integration() const
void fillContactJacobian(int link, const btVector3 &contact_point, const btVector3 &normal, btScalar *jac, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m) 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 ...
void setJointVelMultiDof(int i, btScalar *qdot)
const btMultiBodyLinkCollider * getBaseCollider() const
btVector3 worldDirToLocal(int i, const btVector3 &vec) const
const btVector3 & getLinkInertia(int i) const
btVector3FloatData m_parentComToThisComOffset
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btScalar getJointTorque(int i) const
const btQuaternion & getWorldToBaseRot() const
void addBaseConstraintForce(const btVector3 &f)
void setBaseMass(btScalar mass)
void stepPositions(btScalar dt)
int getParent(int link_num) const
btVector3FloatData m_linkInertia
const btVector3 & getBasePos() const
btVector3 localPosToWorld(int i, const btVector3 &vec) const
const btVector3 & getBaseForce() const
btAlignedObjectArray< btMultibodyLink > m_links
btScalar * getJointTorqueMultiDof(int i)
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
btScalar * getJointPosMultiDof(int i)
void useRK4Integration(bool use)
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
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
bool getUseGyroTerm() const
btVector3DoubleData m_jointAxisBottom[6]
void stepVelocities(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m)
btScalar getMaxCoordinateVelocity() const
btScalar getJointVel(int i) const
btScalar getKineticEnergy() const
void setBaseName(const char *name)
memory of setBaseName needs to be manager by user
btCollisionObjectDoubleData * m_baseCollider