104 m_baseQuat(0, 0, 0, 1),
112 m_userObjectPointer(0),
115 m_linearDamping(0.04f),
116 m_angularDamping(0.04f),
118 m_maxAppliedImpulse(1000.f),
119 m_maxCoordinateVelocity(100.f),
120 m_hasSelfCollision(
true),
125 m_useGlobalVelocities(
false),
126 m_internalNeedsJointFeedback(
false)
157 m_links[i].setAxisTop(0, 0., 0., 0.);
169 m_links[i].updateCacheMultiDof();
193 m_links[i].setAxisTop(0, 0., 0., 0.);
202 m_links[i].m_jointPos[0] = 0.f;
203 m_links[i].m_jointTorque[0] = 0.f;
209 m_links[i].updateCacheMultiDof();
239 m_links[i].m_jointPos[0] = 0.f;
240 m_links[i].m_jointTorque[0] = 0.f;
245 m_links[i].updateCacheMultiDof();
275 m_links[i].setAxisTop(0, 1.f, 0.f, 0.f);
276 m_links[i].setAxisTop(1, 0.f, 1.f, 0.f);
277 m_links[i].setAxisTop(2, 0.f, 0.f, 1.f);
288 m_links[i].updateCacheMultiDof();
310 m_links[i].m_dVector.setZero();
323 m_links[i].setAxisTop(0, n[0],n[1],n[2]);
324 m_links[i].setAxisTop(1,0,0,0);
325 m_links[i].setAxisTop(2,0,0,0);
326 m_links[i].setAxisBottom(0,0,0,0);
337 m_links[i].updateCacheMultiDof();
364 return m_links[i].m_inertiaLocal;
369 return m_links[i].m_jointPos[0];
379 return &
m_links[i].m_jointPos[0];
389 return &
m_links[i].m_jointPos[0];
401 m_links[i].updateCacheMultiDof();
409 m_links[i].updateCacheMultiDof();
425 return m_links[i].m_cachedRVector;
430 return m_links[i].m_cachedRotParentToThis;
529 const int parent =
m_links[i].m_parent;
604 m_links[i].m_appliedConstraintForce.setValue(0, 0, 0);
605 m_links[i].m_appliedConstraintTorque.setValue(0, 0, 0);
615 m_links[i].m_appliedForce.setValue(0, 0, 0);
616 m_links[i].m_appliedTorque.setValue(0, 0, 0);
630 m_links[i].m_appliedForce += f;
640 m_links[i].m_appliedConstraintForce += f;
645 m_links[i].m_appliedConstraintTorque +=
t;
668 return m_links[i].m_appliedForce;
673 return m_links[i].m_appliedTorque;
678 return m_links[i].m_jointTorque[0];
683 return &
m_links[i].m_jointTorque[0];
707#define vecMulVecTranspose(v0, v1Transposed) outerProduct(v0, v1Transposed)
850 const int parent =
m_links[i].m_parent;
895 b3Printf(
"stepVelocitiesMultiDof zeroAccSpatFrc[%d] linear:%f,%f,%f, angular:%f,%f,%f",
921 0,
m_links[i].m_inertiaLocal[1], 0,
922 0, 0,
m_links[i].m_inertiaLocal[2])
952 const int parent =
m_links[i].m_parent;
1092 const int parent =
m_links[i].m_parent;
1113 if (
m_links[i].m_jointFeedback)
1227 const int parent =
m_links[i].m_parent;
1276 for (
int i=0;i<6;i++)
1437 for (
int i =
num_links - 1; i >= 0; --i)
1439 const int parent =
m_links[i].m_parent;
1499 const int parent =
m_links[i].m_parent;
1632 switch(
m_links[i].m_jointType)
1740 const int parent =
m_links[i].m_parent;
1749 switch(
m_links[i].m_jointType)
1799 link =
m_links[link].m_parent;
1941 col->setWorldTransform(
tr);
1962 if (
mbd->m_baseName)
1968 if (mbd->m_numLinks)
2035#ifdef BT_USE_DOUBLE_PRECISION
#define btCollisionObjectData
const T & btMax(const T &a, const T &b)
@ BT_MULTIBODYLINKFLAGS_DISABLE_PARENT_COLLISION
bool gJointFeedbackInWorldSpace
todo: determine if we need these options. If so, make a proper API, otherwise delete those globals
bool gJointFeedbackInJointFrame
btMatrix3x3 outerProduct(const btVector3 &v0, const btVector3 &v1)
#define btMultiBodyDataName
#define btMultiBodyData
serialization data, don't change them if you are not familiar with the details of the serialization m...
#define btMultiBodyLinkData
#define btMultiBodyLinkDataName
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion.
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
bool gDisableDeactivation
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSin(btScalar x)
btScalar btCos(btScalar x)
void symmetricSpatialOuterProduct(const SpatialVectorType &a, const SpatialVectorType &b, btSymmetricSpatialDyad &out)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
void setWorldTransform(const btTransform &worldTrans)
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btMatrix3x3 inverse() const
Return the inverse of the matrix.
btMatrix3x3 transpose() const
Return the transpose of the matrix.
void setValue(const btScalar &xx, const btScalar &xy, const btScalar &xz, const btScalar &yx, const btScalar &yy, const btScalar &yz, const btScalar &zx, const btScalar &zy, const btScalar &zz)
Set the values of the matrix explicitly (row major)
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 computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass=false)
const btVector3 & getLinkTorque(int i) const
btAlignedObjectArray< btMultibodyLink > m_links
btAlignedObjectArray< btMatrix3x3 > m_matrixBuf
const btVector3 & getBasePos() const
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
btAlignedObjectArray< btVector3 > m_vectorBuf
btVector3 localPosToWorld(int i, const btVector3 &vec) const
void setJointVelMultiDof(int i, btScalar *qdot)
btScalar getJointPos(int i) const
void updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
const btVector3 & getLinkInertia(int i) const
btScalar * getJointPosMultiDof(int i)
btScalar m_angularDamping
btScalar getKineticEnergy() const
void setupSpherical(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool disableParentCollision=false)
btMatrix3x3 m_cachedInertiaLowerRight
void addLinkConstraintForce(int i, const btVector3 &f)
void setupFixed(int linkIndex, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &parentComToThisPivotOffset, const btVector3 &thisPivotToThisComOffset, bool deprecatedDisableParentCollision=true)
btAlignedObjectArray< btScalar > m_realBuf
btVector3 m_baseConstraintTorque
void stepPositionsMultiDof(btScalar dt, btScalar *pq=0, btScalar *pqd=0)
const btMultibodyLink & getLink(int index) const
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
const btVector3 & getRVector(int i) const
btVector3 getBaseOmega() const
btVector3 worldDirToLocal(int i, const btVector3 &vec) const
void calcAccelerationDeltasMultiDof(const btScalar *force, btScalar *output, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v) const
void addLinkTorque(int i, const btVector3 &t)
void checkMotionAndSleepIfRequired(btScalar timestep)
btScalar * getJointTorqueMultiDof(int i)
void solveImatrix(const btVector3 &rhs_top, const btVector3 &rhs_bot, btScalar result[6]) const
btScalar getLinkMass(int i) const
bool m_useGlobalVelocities
void addLinkForce(int i, const btVector3 &f)
void addJointTorque(int i, btScalar Q)
btMatrix3x3 m_cachedInertiaLowerLeft
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)
const btVector3 & getLinkForce(int i) const
int getParent(int link_num) const
void setJointVel(int i, btScalar qdot)
btScalar getJointTorque(int i) const
void clearConstraintForces()
btMatrix3x3 m_cachedInertiaTopLeft
void addLinkConstraintTorque(int i, const btVector3 &t)
bool m_cachedInertiaValid
const btMultiBodyLinkCollider * getBaseCollider() const
void setJointPos(int i, btScalar q)
void setupPlanar(int i, btScalar mass, const btVector3 &inertia, int parent, const btQuaternion &rotParentToThis, const btVector3 &rotationAxis, const btVector3 &parentComToThisComOffset, bool disableParentCollision=false)
btVector3 localDirToWorld(int i, const btVector3 &vec) const
void fillConstraintJacobianMultiDof(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
btTransform getBaseWorldTransform() const
btMatrix3x3 m_cachedInertiaTopRight
btScalar getBaseMass() const
btAlignedObjectArray< btScalar > m_deltaV
btVector3 getAngularMomentum() const
void updateLinksDofOffsets()
virtual int calculateSerializeBufferSize() const
bool m_internalNeedsJointFeedback
the m_needsJointFeedback gets updated/computed during the stepVelocitiesMultiDof and it for internal ...
void setJointPosMultiDof(int i, btScalar *q)
const btQuaternion & getParentToLocalRot(int i) const
const btVector3 & getBaseInertia() const
void addJointTorqueMultiDof(int i, int dof, btScalar Q)
const btQuaternion & getWorldToBaseRot() const
btVector3 m_baseConstraintForce
btMatrix3x3 localFrameToWorld(int i, const btMatrix3x3 &mat) const
void mulMatrix(btScalar *pA, btScalar *pB, int rowsA, int colsA, int rowsB, int colsB, btScalar *pC) const
btScalar getJointVel(int i) const
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
btVector3 worldPosToLocal(int i, const btVector3 &vec) const
const btVector3 getBaseVel() const
btScalar * getJointVelMultiDof(int i)
btMultiBody(int n_links, btScalar mass, const btVector3 &inertia, bool fixedBase, bool canSleep, bool deprecatedMultiDof=true)
void compTreeLinkVelocities(btVector3 *omega, btVector3 *vel) const
void clearForcesAndTorques()
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
Set x,y,z and zero w.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
void serialize(struct btQuaternionData &dataOut) const
btVector3 can be used to represent 3D points and vectors.
const btScalar & z() const
Return the z value.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btVector3 normalized() const
Return a normalized version of this vector.
const btScalar & x() const
Return the x value.
void serialize(struct btVector3Data &dataOut) const
const btScalar & y() const
Return the y value.
btQuaternion m_zeroRotParentToThis
class btMultiBodyLinkCollider * m_collider
const btVector3 & getAxisTop(int dof) const
btScalar m_jointUpperLimit
const btVector3 & getAxisBottom(int dof) const
eFeatherstoneJointType m_jointType
btScalar m_jointLowerLimit
btTransform m_cachedWorldTransform
btScalar m_jointMaxVelocity
btScalar m_jointTorque[6]
These spatial algebra classes are used for btMultiBody, see BulletDynamics/Featherstone.