Bullet Collision Detection & Physics Library
|
Go to the documentation of this file.
53 int firstHit=startHit;
71 int rIslandId0, lIslandId0;
74 return lIslandId0 < rIslandId0;
134 int numCurConstraints = 0;
161 for (i = 0; i < numBodies; i++)
163 for (i = 0; i < numManifolds; i++)
165 for (i = 0; i < numCurConstraints; i++)
193 m_sortedConstraints(),
194 m_solverIslandCallback(NULL),
195 m_constraintSolver(constraintSolver),
196 m_gravity(0, -10, 0),
199 m_synchronizeAllMotionStates(false),
200 m_applySpeculativeContactRestitution(false),
202 m_latencyMotionStateInterpolation(true)
275 bool drawConstraints =
false;
281 drawConstraints =
true;
350 interpolatedTransform);
386 int numSimulationSubSteps = 0;
395 numSimulationSubSteps = int(
m_localTime / fixedTimeStep);
396 m_localTime -= numSimulationSubSteps * fixedTimeStep;
402 fixedTimeStep = timeStep;
407 numSimulationSubSteps = 0;
412 numSimulationSubSteps = 1;
423 if (numSimulationSubSteps)
426 int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps) ? maxSubSteps : numSimulationSubSteps;
432 for (
int i = 0; i < clampedSimulationSteps; i++)
445 #ifndef BT_NO_PROFILE
446 CProfileManager::Increment_Frame_Counter();
447 #endif //BT_NO_PROFILE
449 return numSimulationSubSteps;
458 (*m_internalPreTickCallback)(
this, timeStep);
495 (*m_internalTickCallback)(
this, timeStep);
590 m_actions[i]->updateAction(
this, timeStep);
637 if (disableCollisionsBetweenLinkedBodies)
724 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
725 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
735 for (i = 0; i < numConstraints; i++)
743 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
744 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
786 btVector3 relativeVelocity = (linVelA - linVelB);
791 return ClosestConvexResultCallback::addSingleResult(convexResult, normalInWorldSpace);
801 if (!ClosestConvexResultCallback::needsCollision(proxy0))
822 for (
int j=0;j<manifoldArray.
size();j++)
844 for (
int i = 0; i < numBodies; i++)
861 #ifdef PREDICTIVE_CONTACT_USE_STATIC_ONLY
888 btTransform modifiedPredictedTrans = predictedTrans;
892 if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
895 btScalar distance = distVec.
dot(-sweepResults.m_hitNormalWorld);
903 btVector3 localPointB = sweepResults.m_hitCollisionObject->getWorldTransform().inverse() * worldPointB;
907 bool isPredictive =
true;
923 BT_PROFILE(
"release predictive contact manifolds");
946 for (
int i = 0; i < numBodies; i++)
963 #ifdef USE_STATIC_ONLY
990 btTransform modifiedPredictedTrans = predictedTrans;
994 if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
1006 btScalar maxSpeedSqr = maxSpeed*maxSpeed;
1007 if (linVel.
length2()>maxSpeedSqr)
1017 printf(
"sm2=%f\n",sm2);
1050 BT_PROFILE(
"apply speculative contact restitution");
1071 btVector3 rel_pos1 = pos2 - body1->getWorldTransform().getOrigin();
1076 body1->applyImpulse(-imp, rel_pos1);
1104 #ifndef BT_NO_PROFILE
1105 CProfileManager::Reset();
1106 #endif //BT_NO_PROFILE
1146 if (minAng == maxAng)
1150 bool drawSect =
true;
1162 getDebugDrawer()->
drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, minAng, maxAng,
btVector3(0, 0, 0), drawSect);
1177 static int nSegments = 8 * 4;
1181 for (
int i = 0; i < nSegments; i++)
1188 if (i % (nSegments / 8) == 0)
1207 getDebugDrawer()->
drawArc(pivot, normal, axis1, dbgDrawSize, dbgDrawSize, -twa - tws, -twa + tws,
btVector3(0, 0, 0),
true);
1229 getDebugDrawer()->
drawSpherePatch(center, up, axis, dbgDrawSize *
btScalar(.9f), minTh, maxTh, minPs, maxPs,
btVector3(0, 0, 0));
1238 ref[0] = cy * cz * axis[0] + cy * sz * axis[1] - sy * axis[2];
1239 ref[1] = -sz * axis[0] + cz * axis[1];
1240 ref[2] = cz * sy * axis[0] + sz * sy * axis[1] + cy * axis[2];
1247 getDebugDrawer()->
drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, -
SIMD_PI,
SIMD_PI,
btVector3(0, 0, 0),
false);
1249 else if (minFi < maxFi)
1251 getDebugDrawer()->
drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, minFi, maxFi,
btVector3(0, 0, 0),
true);
1281 getDebugDrawer()->
drawSpherePatch(center, up, axis, dbgDrawSize *
btScalar(.9f), minTh, maxTh, minPs, maxPs,
btVector3(0, 0, 0));
1291 ref[0] = cy * cz * axis[0] + cy * sz * axis[1] - sy * axis[2];
1292 ref[1] = -sz * axis[0] + cz * axis[1];
1293 ref[2] = cz * sy * axis[0] + sz * sy * axis[1] + cy * axis[2];
1300 getDebugDrawer()->
drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, -
SIMD_PI,
SIMD_PI,
btVector3(0, 0, 0),
false);
1302 else if (minFi < maxFi)
1304 getDebugDrawer()->
drawArc(center, normal, ref, dbgDrawSize, dbgDrawSize, minFi, maxFi,
btVector3(0, 0, 0),
true);
1332 getDebugDrawer()->
drawArc(center, normal, axis, dbgDrawSize, dbgDrawSize, a_min, a_max,
btVector3(0, 0, 0),
true);
1399 #ifdef BT_USE_DOUBLE_PRECISION
1409 memset(worldInfo, 0x00, len);
1440 #ifdef BT_USE_DOUBLE_PRECISION
1441 const char* structType =
"btDynamicsWorldDoubleData";
1442 #else //BT_USE_DOUBLE_PRECISION
1443 const char* structType =
"btDynamicsWorldFloatData";
1444 #endif //BT_USE_DOUBLE_PRECISION
btIDebugDraw * m_debugDrawer
btTranslationalLimitMotor * getTranslationalLimitMotor()
Retrieves the limit informacion.
hinge constraint between two rigidbodies each with a pivotpoint that descibes the axis location in lo...
btAlignedObjectArray< btTypedConstraint * > m_constraints
TypedConstraint is the baseclass for Bullet constraints and vehicles.
int m_collisionFilterMask
virtual void solveConstraints(btContactSolverInfo &solverInfo)
btCollisionObject can be used to manage collision detection objects.
virtual void setConstraintSolver(btConstraintSolver *solver)
btScalar getLowerLinLimit()
const btVector3 & getPivotInA() const
virtual void addConstraint(btTypedConstraint *constraint, bool disableCollisionsBetweenLinkedBodies=false)
virtual void removeVehicle(btActionInterface *vehicle)
obsolete, use removeAction instead
void serialize(struct btVector3Data &dataOut) const
The btBroadphaseProxy is the main class that can be used with the Bullet broadphases.
void btMutexLock(btSpinMutex *mutex)
virtual void storeIslandActivationState(btCollisionWorld *world)
The btRigidBody is the main class for rigid body objects.
const btRigidBody & getRigidBodyB() const
btScalar getLowerLimit() const
#define btAlignedFree(ptr)
void predictIntegratedTransform(btScalar step, btTransform &predictedTransform)
continuous collision detection needs prediction
#define DISABLE_DEACTIVATION
btTypedConstraint ** m_sortedConstraints
btAlignedObjectArray< btRigidBody * > m_nonStaticRigidBodies
btInternalTickCallback m_internalTickCallback
ClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld)
virtual void addAction(btActionInterface *)
void setup(btContactSolverInfo *solverInfo, btTypedConstraint **sortedConstraints, int numConstraints, btIDebugDraw *debugDrawer)
virtual btIDebugDraw * getDebugDrawer()
btClosestNotMeConvexResultCallback(btCollisionObject *me, const btVector3 &fromA, const btVector3 &toA, btOverlappingPairCache *pairCache, btDispatcher *dispatcher)
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
btInternalTickCallback m_internalPreTickCallback
btAlignedObjectArray< btTypedConstraint * > m_sortedConstraints
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
const btVector3 & getPositionWorldOnA() const
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
virtual void removeCharacter(btActionInterface *character)
obsolete, use removeAction instead
bool getUseLinearReferenceFrameA()
bool gDisableDeactivation
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
const btRigidBody & getRigidBodyA() const
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::StaticFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter)
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
void setGravity(const btVector3 &acceleration)
virtual void processIsland(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, int islandId)
btSimulationIslandManager * m_islandManager
virtual void debugDrawWorld()
btContactSolverInfo * m_solverInfo
virtual void setGravity(const btVector3 &gravity)
void quickSort(const L &CompareFunc)
btVector3 m_normalWorldOnB
virtual void addRigidBody(btRigidBody *body)
const btCollisionObject * getBody0() const
btAlignedObjectArray< btCollisionObject * > m_collisionObjects
void integrateTransformsInternal(btRigidBody **bodies, int numBodies, btScalar timeStep)
virtual btVector3 getGravity() const
void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0),...
#define BT_DYNAMICSWORLD_CODE
virtual int getDebugMode() const =0
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
void convexSweepTest(const btConvexShape *castShape, const btTransform &from, const btTransform &to, ConvexResultCallback &resultCallback, btScalar allowedCcdPenetration=btScalar(0.)) const
convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultC...
btContactSolverInfo & getSolverInfo()
btScalar dot(const btVector3 &v) const
Return the dot product.
virtual void removeCollisionObject(btCollisionObject *collisionObject)
removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise ca...
const btRigidBody & getRigidBodyB() const
btContactSolverInfoFloatData m_solverInfo
int getNumContacts() const
int getActivationState() const
const btTransform & getCalculatedTransformA() const
class btIDebugDraw * m_debugDraw
void serializeContactManifolds(btSerializer *serializer)
#define btAlignedAlloc(size, alignment)
virtual void removeAction(btActionInterface *)
void releasePredictiveContacts()
The btDynamicsWorld is the interface class for several dynamics implementation, basic,...
const btTransform & getBFrame() const
btAlignedObjectArray< btActionInterface * > m_actions
btScalar getUpperAngLimit()
btScalar getTwistAngle() const
btSimulationIslandManager * getSimulationIslandManager()
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
const btBroadphaseInterface * getBroadphase() const
void setHitFraction(btScalar hitFraction)
int m_collisionFilterGroup
bool m_ownsConstraintSolver
btGeneric6DofConstraint between two rigidbodies each with a pivotpoint that descibes the axis locatio...
const btTransform & getAFrame() const
bool isKinematicObject() const
const btTransform & getCalculatedTransformB() const
Gets the global transform of the offset for body B.
btScalar m_allowedPenetration
btScalar m_combinedRestitution
const btVector3 & getPivotInB() const
const btTransform & getCalculatedTransformA() const
Gets the global transform of the offset for body A.
const btTransform & getCenterOfMassTransform() const
const btVector3 & getInterpolationLinearVelocity() const
btVector3 GetPointForAngle(btScalar fAngleInRadians, btScalar fLength) const
virtual void performDiscreteCollisionDetection()
btDispatcher * m_dispatcher
virtual btPersistentManifold * getNewManifold(const btCollisionObject *b0, const btCollisionObject *b1)=0
virtual bool needsCollision(const btCollisionObject *body0, const btCollisionObject *body1)=0
const btRigidBody & getRigidBodyB() const
bool isStaticOrKinematicObject() const
void processConstraints()
point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocke...
btTranslationalLimitMotor2 * getTranslationalLimitMotor()
btVector3 m_hitNormalLocal
btTransform & getWorldTransform()
void setLinearVelocity(const btVector3 &lin_vel)
btOverlappingPairCache * m_pairCache
btConstraintSolver * m_solver
btScalar btSin(btScalar x)
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, class btIDebugDraw *debugDrawer, btDispatcher *dispatcher)=0
solve a group of constraints
btScalar m_hiLimit
joint limit
const btCollisionShape * getCollisionShape() const
btCollisionWorld * getCollisionWorld()
btScalar getCcdSquareMotionThreshold() const
btVector3 m_positionWorldOnB
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
void proceedToTransform(const btTransform &newTrans)
ManifoldContactPoint collects and maintains persistent contactpoints.
virtual bool needsCollision(btBroadphaseProxy *proxy0) const
btAlignedObjectArray< btPersistentManifold * > m_manifolds
void updateDeactivation(btScalar timeStep)
virtual void serialize(btSerializer *serializer)
Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see B...
const btTransform & getCalculatedTransformB() const
int gNumClampedCcdMotions
internal debugging variable. this value shouldn't be too high
virtual void releaseManifold(btPersistentManifold *manifold)=0
bool operator()(const btTypedConstraint *lhs, const btTypedConstraint *rhs) const
void resize(int newsize, const T &fillData=T())
virtual void setWorldTransform(const btTransform &worldTrans)=0
#define BT_CONSTRAINT_CODE
const btTransform & getAFrame() const
btVector3 m_upperLimit
the constraint upper limits
const btCollisionObject * m_hitCollisionObject
virtual void debugDrawWorld()
The btOverlappingPairCache provides an interface for overlapping pair management (add,...
The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out)
virtual void saveKinematicState(btScalar timeStep)
btBroadphaseProxy * getBroadphaseHandle()
btScalar btCos(btScalar x)
btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc)
btScalar m_loLimit
limit_parameters
const btTransform & getInterpolationWorldTransform() const
virtual void allSolved(const btContactSolverInfo &, class btIDebugDraw *)
const btTransform & getBFrame() const
int getNumCollisionObjects() const
btVector3 m_lowerLimit
the constraint lower limits
btCollisionAlgorithm * m_algorithm
btScalar m_allowedCcdPenetration
btScalar getInvMass() const
InplaceSolverIslandCallback(btConstraintSolver *solver, btStackAlloc *stackAlloc, btDispatcher *dispatcher)
virtual int calculateSerializeBufferSize() const
virtual ~btDiscreteDynamicsWorld()
const btBroadphaseProxy * getBroadphaseProxy() const
virtual void predictUnconstraintMotion(btScalar timeStep)
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
bool isStaticObject() const
btVector3 getColumn(int i) const
Get a column of the matrix as a vector.
virtual bool needsResponse(const btCollisionObject *body0, const btCollisionObject *body1)=0
void saveKinematicState(btScalar step)
Basic interface to allow actions such as vehicles and characters to be updated inside a btDynamicsWor...
The btSphereShape implements an implicit sphere, centered around a local origin with radius.
CalculateCombinedCallback gCalculateCombinedFrictionCallback
btVector3 can be used to represent 3D points and vectors.
const btVector3 & getPositionWorldOnB() const
btRotationalLimitMotor * getRotationalLimitMotor(int index)
Retrieves the angular limit informacion.
btAlignedObjectArray< btPersistentManifold * > m_predictiveManifolds
virtual btConstraintSolver * getConstraintSolver()
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
const btVector3 & getLinearVelocity() const
bool hasContactResponse() const
virtual void applyGravity()
apply gravity, call this once per timestep
virtual void drawSpherePatch(const btVector3 ¢er, const btVector3 &up, const btVector3 &axis, btScalar radius, btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3 &color, btScalar stepDegrees=btScalar(10.f), bool drawCenter=true)
const btTransform & getCalculatedTransformB() const
virtual int stepSimulation(btScalar timeStep, int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.))
if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's
btScalar getAngle(int axis_index) const
btAlignedObjectArray< btCollisionObject * > m_bodies
btScalar getCcdMotionThreshold() const
void applyDamping(btScalar timeStep)
applyDamping damps the velocity, using the given m_linearDamping and m_angularDamping
virtual void createPredictiveContacts(btScalar timeStep)
int addManifoldPoint(const btManifoldPoint &newPoint, bool isPredictive=false)
void addConstraintRef(btTypedConstraint *c)
const btRigidBody & getRigidBodyA() const
virtual void finishSerialization()=0
void updateActions(btScalar timeStep)
btRotationalLimitMotor2 * getRotationalLimitMotor(int index)
virtual void startSerialization()=0
bool btFuzzyZero(btScalar x)
virtual int calculateSerializeBufferSize() const
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
virtual void calculateSimulationIslands()
virtual btTypedConstraint * getConstraint(int index)
CalculateCombinedCallback gCalculateCombinedRestitutionCallback
const btTransform & getCalculatedTransformA() const
virtual void debugDrawConstraint(btTypedConstraint *constraint)
void setAngularVelocity(const btVector3 &ang_vel)
#define SIMD_FORCE_INLINE
bool m_latencyMotionStateInterpolation
virtual void drawArc(const btVector3 ¢er, const btVector3 &normal, const btVector3 &axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle, const btVector3 &color, bool drawSect, btScalar stepDegrees=btScalar(10.f))
virtual void flushLines()
btVector3 m_convexToWorld
SimulationIslandManager creates and handles simulation islands, using btUnionFind.
virtual void integrateTransforms(btScalar timeStep)
virtual void removeConstraint(btTypedConstraint *constraint)
void synchronizeSingleMotionState(btRigidBody *body)
this can be useful to synchronize a single rigid body -> graphics object
virtual void drawBox(const btVector3 &bbMin, const btVector3 &bbMax, const btVector3 &color)
InplaceSolverIslandCallback & operator=(InplaceSolverIslandCallback &other)
virtual void removeCollisionObject(btCollisionObject *collisionObject)
virtual ~btSimulationIslandManager()
btDispatcher * m_dispatcher1
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
btVector3 m_positionWorldOnA
m_positionWorldOnA is redundant information, see getPositionWorldOnA(), but for clarity
The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (...
const btRigidBody & getRigidBodyA() const
btScalar getHitFraction() const
btScalar getDbgDrawSize()
virtual void synchronizeMotionStates()
btScalar getUpperLinLimit()
int getInternalType() const
reserved for Bullet internal usage
bool m_synchronizeAllMotionStates
btConstraintSolver * m_constraintSolver
btDiscreteDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete thos...
InplaceSolverIslandCallback * m_solverIslandCallback
virtual void addCharacter(btActionInterface *character)
obsolete, use addAction instead
virtual int getNumConstraints() const
#define WANTS_DEACTIVATION
btScalar getTwistSpan() const
btScalar getAngle(int axis_index) const
Get the relative Euler angle.
virtual btBroadphasePair * findPair(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1)=0
void serializeRigidBodies(btSerializer *serializer)
int btGetConstraintIslandId(const btTypedConstraint *lhs)
const btManifoldPoint & getContactPoint(int index) const
CollisionWorld is interface and container for the collision detection.
btDispatcher * m_dispatcher
virtual ~btConstraintSolver()
btScalar getCcdSweptSphereRadius() const
Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
virtual const char * serialize(void *dataBuffer, btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
virtual void getAllContactManifolds(btManifoldArray &manifoldArray)=0
btDispatcher * getDispatcher()
btSpinMutex m_predictiveManifoldsMutex
bool m_applySpeculativeContactRestitution
virtual void removeRigidBody(btRigidBody *body)
void btMutexUnlock(btSpinMutex *mutex)
virtual btOverlappingPairCache * getOverlappingPairCache()=0
void serializeCollisionObjects(btSerializer *serializer)
const btCollisionObject * getBody1() const
btScalar m_appliedImpulse
btUnionFind & getUnionFind()
btTypedConstraintType getConstraintType() const
virtual void addCollisionObject(btCollisionObject *collisionObject, int collisionFilterGroup=btBroadphaseProxy::DefaultFilter, int collisionFilterMask=btBroadphaseProxy::AllFilter)
void applyImpulse(const btVector3 &impulse, const btVector3 &rel_pos)
#define BT_RIGIDBODY_CODE
virtual void addVehicle(btActionInterface *vehicle)
obsolete, use addAction instead
void push_back(const T &_Val)
virtual void prepareSolve(int, int)
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
virtual void updateActivationState(btScalar timeStep)
void createPredictiveContactsInternal(btRigidBody **bodies, int numBodies, btScalar timeStep)
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
void remove(const T &key)
btIDebugDraw * m_debugDrawer
virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult &convexResult, bool normalInWorldSpace)
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
btVector3FloatData m_gravity
btAlignedObjectArray< btTypedConstraint * > m_constraints
void removeConstraintRef(btTypedConstraint *c)
btDispatcherInfo & getDispatchInfo()
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
virtual btChunk * allocate(size_t size, int numElements)=0
The btBroadphasePair class contains a pair of aabb-overlapping objects.
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
virtual void internalSingleStepSimulation(btScalar timeStep)
void serializeDynamicsWorldInfo(btSerializer *serializer)
btScalar m_combinedFriction
btMotionState * getMotionState()
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
const btVector3 & getInterpolationAngularVelocity() const
void startProfiling(btScalar timeStep)
btScalar length2() const
Return the length of the vector squared.
btVector3 m_convexFromWorld
btScalar getLowerAngLimit()
btScalar getUpperLimit() const