|
Bullet Collision Detection & Physics Library
|
Go to the documentation of this file.
53 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
54 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
64 for (i=0;i< numConstraints ; i++ )
72 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
73 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
92 if (((cur) && (!(cur)->isStaticOrKinematicObject())) &&
93 ((prev) && (!(prev)->isStaticOrKinematicObject())))
113 if (tagA>=0 && tagB>=0)
126 BT_PROFILE(
"btMultiBodyDynamicsWorld::updateActivationState");
192 int rIslandId0,lIslandId0;
195 return lIslandId0 < rIslandId0;
207 islandId= islandTagA>=0?islandTagA:islandTagB;
219 int rIslandId0,lIslandId0;
222 return lIslandId0 < rIslandId0;
286 m_solver->
solveMultiBodyGroup( bodies,numBodies,manifolds, numManifolds,
m_sortedConstraints,
m_numConstraints, &
m_multiBodySortedConstraints[0],
m_numConstraints,*
m_solverInfo,
m_debugDrawer,
m_dispatcher);
293 int numCurConstraints = 0;
294 int numCurMultiBodyConstraints = 0;
331 numCurMultiBodyConstraints++;
341 for (i=0;i<numBodies;i++)
343 for (i=0;i<numManifolds;i++)
345 for (i=0;i<numCurConstraints;i++)
348 for (i=0;i<numCurMultiBodyConstraints;i++)
371 m_solver->
solveMultiBodyGroup( bodies,
m_bodies.
size(),manifold,
m_manifolds.
size(),constraints,
m_constraints.
size() ,multiBodyConstraints,
m_multiBodyConstraints.
size(), *
m_solverInfo,
m_debugDrawer,
m_dispatcher);
384 m_multiBodyConstraintSolver(constraintSolver)
439 #ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
446 bool isSleeping =
false;
474 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
483 bool isSleeping =
false;
501 bool doNotUpdatePos =
false;
516 btScalar *scratch_q0 = pMem; pMem += numPosVars;
517 btScalar *scratch_qx = pMem; pMem += numPosVars;
518 btScalar *scratch_qd0 = pMem; pMem += numDofs;
519 btScalar *scratch_qd1 = pMem; pMem += numDofs;
520 btScalar *scratch_qd2 = pMem; pMem += numDofs;
521 btScalar *scratch_qd3 = pMem; pMem += numDofs;
522 btScalar *scratch_qdd0 = pMem; pMem += numDofs;
523 btScalar *scratch_qdd1 = pMem; pMem += numDofs;
524 btScalar *scratch_qdd2 = pMem; pMem += numDofs;
525 btScalar *scratch_qdd3 = pMem; pMem += numDofs;
526 btAssert((pMem - (2*numPosVars + 8*numDofs)) == &scratch_r2[0]);
538 for(
int link = 0; link < bod->
getNumLinks(); ++link)
540 for(
int dof = 0; dof < bod->
getLink(link).m_posVarCount; ++dof)
544 for(
int dof = 0; dof < numDofs; ++dof)
555 scratch_qx[dof] = scratch_q0[dof];
557 } pResetQx = {bod, scratch_qx, scratch_q0};
563 for(
int i = 0; i <
size; ++i)
564 pVal[i] = pCurVal[i] + dt * pDer[i];
575 for(
int i = 0; i < pBody->
getNumDofs() + 6; ++i)
579 } pCopyToVelocityVector;
585 for(
int i = 0; i <
size; ++i)
586 pDst[i] = pSrc[start + i];
592 #define output &m_scratch_r[bod->getNumDofs()]
595 pCopy(
output, scratch_qdd0, 0, numDofs);
600 pEulerIntegrate(
btScalar(.5)*h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
603 pCopyToVelocityVector(bod, scratch_qd1);
605 pCopy(
output, scratch_qdd1, 0, numDofs);
610 pEulerIntegrate(
btScalar(.5)*h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
613 pCopyToVelocityVector(bod, scratch_qd2);
615 pCopy(
output, scratch_qdd2, 0, numDofs);
620 pEulerIntegrate(h, scratch_qdd2, scratch_qd0, scratch_qd3, numDofs);
623 pCopyToVelocityVector(bod, scratch_qd3);
625 pCopy(
output, scratch_qdd3, 0, numDofs);
632 for(
int i = 0; i < numDofs; ++i)
634 delta_q[i] = h/
btScalar(6.)*(scratch_qd0[i] + 2*scratch_qd1[i] + 2*scratch_qd2[i] + scratch_qd3[i]);
635 delta_qd[i] = h/
btScalar(6.)*(scratch_qdd0[i] + 2*scratch_qdd1[i] + 2*scratch_qdd2[i] + scratch_qdd3[i]);
640 pCopyToVelocityVector(bod, scratch_qd0);
648 for(
int i = 0; i < numDofs; ++i)
649 pRealBuf[i] = delta_q[i];
657 for(
int link = 0; link < bod->
getNumLinks(); ++link)
665 #ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
667 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
684 bool isSleeping =
false;
707 bool isConstraintPass =
true;
734 bool isSleeping =
false;
799 BT_PROFILE(
"btMultiBodyDynamicsWorld debugDrawWorld");
803 bool drawConstraints =
false;
809 drawConstraints =
true;
880 #ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
886 bool isSleeping =
false;
908 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
927 bool isSleeping =
false;
952 #ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
btIDebugDraw * m_debugDrawer
btAlignedObjectArray< btTypedConstraint * > m_constraints
TypedConstraint is the baseclass for Bullet constraints and vehicles.
btCollisionObject can be used to manage collision detection objects.
btSpatialMotionVector m_axes[6]
void computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass=false)
virtual void storeIslandActivationState(btCollisionWorld *world)
The btRigidBody is the main class for rigid body objects.
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
const btScalar & y() const
Return the y value.
#define DISABLE_DEACTIVATION
virtual void calculateSimulationIslands()
virtual void addMultiBodyConstraint(btMultiBodyConstraint *constraint)
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local
virtual btIDebugDraw * getDebugDrawer()
void processDeltaVeeMultiDof2()
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
btAlignedObjectArray< btTypedConstraint * > m_sortedConstraints
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btAlignedObjectArray< btVector3 > m_scratch_local_origin1
btMultiBodyConstraint ** m_multiBodySortedConstraints
const btRigidBody & getRigidBodyA() const
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
btSimulationIslandManager * m_islandManager
bool operator()(const btTypedConstraint *lhs, const btTypedConstraint *rhs) const
virtual void clearMultiBodyConstraintForces()
bool operator()(const btMultiBodyConstraint *lhs, const btMultiBodyConstraint *rhs) const
void quickSort(const L &CompareFunc)
const btQuaternion & getWorldToBaseRot() const
const btCollisionObject * getBody0() const
void clearConstraintForces()
virtual int getIslandIdB() const =0
bool isPosUpdated() const
virtual int getDebugMode() const =0
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
virtual void debugDraw(class btIDebugDraw *drawer)=0
btContactSolverInfo & getSolverInfo()
MultiBodyInplaceSolverIslandCallback * m_solverMultiBodyIslandCallback
int getActivationState() const
void updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
virtual int calculateSerializeBufferSize() const
MultiBodyInplaceSolverIslandCallback(btMultiBodyConstraintSolver *solver, btDispatcher *dispatcher)
#define BT_MULTIBODY_CODE
const btScalar & w() const
Return the w value.
btSimulationIslandManager * getSimulationIslandManager()
btTransform getBaseWorldTransform() const
bool isUsingRK4Integration() const
void stepPositionsMultiDof(btScalar dt, btScalar *pq=0, btScalar *pqd=0)
virtual void solveConstraints(btContactSolverInfo &solverInfo)
btTransform m_cachedWorldTransform
const btScalar & y() const
Return the y value.
const btRigidBody & getRigidBodyB() const
bool isStaticOrKinematicObject() const
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep.
btAlignedObjectArray< btScalar > m_scratch_r
btAlignedObjectArray< btPersistentManifold * > m_manifolds
void clearForcesAndTorques()
void addLinkForce(int i, const btVector3 &f)
btCollisionWorld * getCollisionWorld()
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
virtual void debugDrawWorld()
void setup(btContactSolverInfo *solverInfo, btTypedConstraint **sortedConstraints, int numConstraints, btMultiBodyConstraint **sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw *debugDrawer)
int btGetConstraintIslandId2(const btTypedConstraint *lhs)
virtual void integrateTransforms(btScalar timeStep)
void checkMotionAndSleepIfRequired(btScalar timestep)
btAlignedObjectArray< btMultiBody * > m_multiBodies
void resize(int newsize, const T &fillData=T())
@ DBG_DrawConstraintLimits
virtual void debugDrawWorld()
btIDebugDraw * m_debugDrawer
void addBaseForce(const btVector3 &f)
btAlignedObjectArray< btCollisionObject * > m_bodies
btAlignedObjectArray< btVector3 > m_scratch_local_origin
btScalar getBaseMass() const
virtual void allSolved(const btContactSolverInfo &, class btIDebugDraw *)
int getNumCollisionObjects() const
void setDeactivationTime(btScalar time)
virtual int getIslandIdA() const =0
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
const btMultibodyLink & getLink(int index) const
btVector3 can be used to represent 3D points and vectors.
btAlignedObjectArray< btMultiBodyConstraint * > m_sortedMultiBodyConstraints
virtual void removeMultiBodyConstraint(btMultiBodyConstraint *constraint)
btAlignedObjectArray< btPersistentManifold * > m_predictiveManifolds
int getNumPosVars() const
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
btDispatcher * m_dispatcher
virtual void applyGravity()
apply gravity, call this once per timestep
btAlignedObjectArray< btVector3 > m_scratch_v
virtual void finishSerialization()=0
virtual void startSerialization()=0
class btMultiBodyLinkCollider * m_collider
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
const btScalar & x() const
Return the x value.
virtual void applyGravity()
apply gravity, call this once per timestep
MultiBodyInplaceSolverIslandCallback & operator=(MultiBodyInplaceSolverIslandCallback &other)
btTypedConstraint ** m_sortedConstraints
btScalar getLinkMass(int i) const
virtual void processIsland(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, int islandId)
#define SIMD_FORCE_INLINE
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
virtual void integrateTransforms(btScalar timeStep)
void setPosUpdated(bool updated)
btAlignedObjectArray< btMatrix3x3 > m_scratch_m
const btScalar & x() const
Return the x value.
virtual ~btMultiBodyDynamicsWorld()
btAlignedObjectArray< btTypedConstraint * > m_constraints
eFeatherstoneJointType m_jointType
btMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
void updateCacheMultiDof(btScalar *pq=0)
const btScalar * getVelocityVector() const
btConstraintSolver * m_constraintSolver
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
virtual int getNumConstraints() const
#define WANTS_DEACTIVATION
void serializeRigidBodies(btSerializer *serializer)
virtual void clearMultiBodyForces()
btDispatcher * getDispatcher()
void serializeCollisionObjects(btSerializer *serializer)
const btCollisionObject * getBody1() const
btUnionFind & getUnionFind()
btDiscreteDynamicsWorld provides discrete rigid body simulation those classes replace the obsolete Cc...
virtual void updateActivationState(btScalar timeStep)
virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint *constraint)
virtual void serialize(btSerializer *serializer)
Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see B...
void push_back(const T &_Val)
btMultiBodyConstraintSolver * m_solver
const btScalar & z() const
Return the z value.
virtual void prepareSolve(int, int)
virtual void serializeMultiBodies(btSerializer *serializer)
const btVector3 & getBasePos() const
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
virtual void updateActivationState(btScalar timeStep)
void remove(const T &key)
int btGetMultiBodyConstraintIslandId(const btMultiBodyConstraint *lhs)
int m_numMultiBodyConstraints
virtual void removeMultiBody(btMultiBody *body)
const btMultiBodyLinkCollider * getBaseCollider() const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local1
virtual btChunk * allocate(size_t size, int numElements)=0
virtual void solveMultiBodyGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, btMultiBodyConstraint **multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
void serializeDynamicsWorldInfo(btSerializer *serializer)
btContactSolverInfo * m_solverInfo
void processConstraints()
const btScalar & z() const
Return the z value.
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep.
void setActivationState(int newState) const
int size() const
return the number of elements in the array
virtual void addMultiBody(btMultiBody *body, int group=btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter)
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)