Similar to Open Dynamics Engine, Bullet 2.38 provides the option of a collision detection nearCallback. Main differences with ODE are:
- unlike ODE, this is optional: by default Bullet uses its built-in defaultNearCallback
- continuous collision detection (time of impact) next to discrete
- contact points are persistent and incrementally added/removed/maintained
See example in CcdPhysicsDemo how to register your own custom nearCallback. This can be useful to have more control over the collision detection pipeline:
Code: Select all
//by default, Bullet will use its own nearcallback, but you can override it using dispatcher->setNearCallback()
void customNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, btDispatcherInfo& dispatchInfo)
{
btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
if (dispatcher.needsCollision(colObj0,colObj1))
{
//dispatcher will keep algorithms persistent in the collision pair
if (!collisionPair.m_algorithm)
{
collisionPair.m_algorithm = dispatcher.findAlgorithm(colObj0,colObj1);
}
if (collisionPair.m_algorithm)
{
btManifoldResult contactPointResult(colObj0,colObj1);
if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)
{
//discrete collision detection query
collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult);
} else
{
//continuous collision detection query, time of impact (toi)
float toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
}
}
}
}
- an optional angularFactor scalar in btRigidBody, which allows to diminish/completely remove angular impulses. This can be handy for character control and cars. When you hit a wall, it won't fully get the rotational impact.
- bool btRigidBody::isInWorld(), which returns true is the btRigidBody is currently in a btCollisionWorld/btDynamicsWorld derived class.
Download at http://www.continuousphysics.com/mediaw ... e=Download
Enjoy!
Erwin