好的

我要开始新篇了
新篇是Bullet的
刚开始看Bullet时 代码不熟 看后忘前 不过 怎么说呢 那我就每天看 草
于是 我就明白了
先看看那个step函数:
1
void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
2

{
3
4
BT_PROFILE("internalSingleStepSimulation");
5
6
if(0 != m_internalPreTickCallback)
{
7
(*m_internalPreTickCallback)(this, timeStep);
8
}
9
10
/**////apply gravity, predict motion
11
predictUnconstraintMotion(timeStep);
12
13
btDispatcherInfo& dispatchInfo = getDispatchInfo();
14
15
dispatchInfo.m_timeStep = timeStep;
16
dispatchInfo.m_stepCount = 0;
17
dispatchInfo.m_debugDraw = getDebugDrawer();
18
19
20
createPredictiveContacts(timeStep);
21
22
/**////perform collision detection
23
performDiscreteCollisionDetection();
24
25
calculateSimulationIslands();
26
27
28
getSolverInfo().m_timeStep = timeStep;
29
30
31
32
/**////solve contact and other joint constraints
33
solveConstraints(getSolverInfo());
34
35
/**////CallbackTriggers();
36
37
///integrate transforms
38
39
integrateTransforms(timeStep);
40
41
/**////update vehicle simulation
42
updateActions(timeStep);
43
44
updateActivationState( timeStep );
45
46
if(0 != m_internalTickCallback)
{
47
(*m_internalTickCallback)(this, timeStep);
48
}
49
}
50
看看里面几个重要的函数:
1 predictUnconstraintMotion(timeStep) :给每个物体加重力作用力
2 createPredictiveContacts(timeStep) :和ccd有关 处理物体在高速运动时的碰撞
3 performDiscreteCollisionDetection():此函数做碰撞 我们来看看
void btCollisionWorld::performDiscreteCollisionDetection()


{
BT_PROFILE("performDiscreteCollisionDetection");

btDispatcherInfo& dispatchInfo = getDispatchInfo();

updateAabbs();


computeOverlappingPairs();
* dispatcher = getDispatcher();

{
BT_PROFILE("dispatchAllCollisionPairs");
if (dispatcher)
dispatcher->dispatchAllCollisionPairs(m_broadphasePairCache->getOverlappingPairCache(),dispatchInfo,m_dispatcher1);
}


}

1) updateAabbs():
把要参加broad碰撞的物体放进paircache,此时没有进行任何碰撞检测,仅仅是把物体加进paircache(addOverlappingPair)同时,放进ghost的paircache里
if (m_ghostPairCallback)
m_ghostPairCallback->addOverlappingPair(proxy0,proxy1);
在这个阶段可以设置一个回调函数,用于过滤一些特定物体
SIMD_FORCE_INLINE bool needsBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
{
if (m_overlapFilterCallback)
return m_overlapFilterCallback->needBroadphaseCollision(proxy0,proxy1);
bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
return collides;
}
m_overlapFilterCallback就是那个回调函数
2) computeOverlappingPairs():
该函数执行broad碰撞,也就是类似于AABB的粗线条碰撞,以此过滤paircache中不用进行narrow碰撞的pair
3) dispatcher->dispatchAllCollisionPairs(m_broadphasePairCache->getOverlappingPairCache(),dispatchInfo,m_dispatcher1):
该函数进行narrow碰撞,也就是精确碰撞,在这里,我们也可以设置回调,以过滤掉某些物体的精确碰撞
void btCollisionDispatcher::defaultNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo)


{
btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;

if (dispatcher.needsCollision(colObj0,colObj1))


{
btCollisionObjectWrapper obj0Wrap(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform());
btCollisionObjectWrapper obj1Wrap(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform());


//dispatcher will keep algorithms persistent in the collision pair
if (!collisionPair.m_algorithm)

{
collisionPair.m_algorithm = dispatcher.findAlgorithm(&obj0Wrap,&obj1Wrap);
}

if (collisionPair.m_algorithm)

{
btManifoldResult contactPointResult(&obj0Wrap,&obj1Wrap);
if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE)

{
//discrete collision detection query
collisionPair.m_algorithm->processCollision(&obj0Wrap,&obj1Wrap,dispatchInfo,&contactPointResult);
} else

{
//continuous collision detection query, time of impact (toi)
btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;

}
}
}

}

这个是默认的callback所做的活,正如bulletManual上所说,可以换成我们自己的callback
void setNearCallback(btNearCallback nearCallback)
{
m_nearCallback = nearCallback;
}
另外,还可以重载btCollisionDispatcher,重写其
virtual bool needsCollision(const btCollisionObject* body0,const btCollisionObject* body1);
virtual bool needsResponse(const btCollisionObject* body0,const btCollisionObject* body1);
virtual void dispatchAllCollisionPairs(btOverlappingPairCache* pairCache,const btDispatcherInfo& dispatchInfo,btDispatcher* dispatcher) ;
从而完全定制其行为
好 暂时over
posted on 2013-01-10 20:06
野猪红 阅读(1624)
评论(1) 编辑 收藏 引用 所属分类:
Bullet