AppBox2dDemo分析

(C)copyright left

声明: 个人劳动成果,谢绝转载。

main函数中是基本套路: 

GLDebugDrawer gDebugDrawer;

Box2dDemo ccdDemo;

/*

继承自PlatformDemoApplication,

后者是一个宏定义 #define PlatformDemoApplication GlutDemoApplication 这样的好处是可以方便地切换至另一不使用Glut的实现

继承自DemoApplication

后者有众多的public接口,其中virtual的接口是我们要特别注意的。从设计上这个类只应规定接口,而不做出任何与平台相关的实现。

因此,比如swapBuffer,  updateCamera,等等接口都声明为 virtual.

*/

ccdDemo.initPhysics();

/*

首先,这是一个重载(overloading),追溯到 DemoApplication::initPhysics(),功能要做初始化。

1.使用GL_DialogWIndow, GL_ToggleControl GL_SliderContrl GL_TextControl等创建交互UI。

2.设置纹理、阴影是否开启;camera参数

3. 设置 btDefaultCollisionConfiguration   btCollisionDispatcher  btBroadphaseInterface btConstraintSolver等,来创建btDiscreteDynamicsWorld,并设置重力。

  -btCollisionConfiguration allows to configure Bullet collision detection stack allocator size, default collision algorithms and persistent manifold pool size

  -Dispathcer 来分配要检测的pair到每一个检测算法

  -BroadphaseInterface 接口,粗检测时用的方法

  -ConstraintSolver解约束时用的算法

在此例中,特别地,在dispatcher中注册了若干检测算法(填矩阵):

void btCollisionDispatcher::registerCollisionCreateFunc ( int  proxyType0,
    int  proxyType1,
    btCollisionAlgorithmCreateFunc *  createFunc  
  )      

registerCollisionCreateFunc allows registration of custom/alternative collision create functions

而如

CreateFunc (btSimplexSolverInterface *simplexSolver, btConvexPenetrationDepthSolver *pdSolver) 实际上是得到初始化好的btCollisionAlgorithmCreateFunc

两个成员 m_pdSolver, m_simplexSolver分别用来解线性方程组(单纯形)和凸形交错深度,其最重要的是成员函数:

virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)

我觉得这边可以看作为是一个工厂模式,注册好各种Factory(btCollitionAlgorithm::CreateFunc),即可产生出各种产品(btCollisionAlgorithm)

4.接下来,加入各种物体。

少不了物理属性(质量)、几何属性(包围形、惯性张量)及位置、朝向等。 创建好后,加入DynamicWorld中。

注意 setActivationState(ISLAND_SLEEPING) 及 setLinearFactor setAngularFactor ,后面两个分别设置了线速度和角速度的因子,因此实现了只在xoy平面内运动。

*/

ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer);

/*这边实现的,我觉得是一个控制反转(依赖注入?)Ioc

相当于设置好渲染引擎

GLDeubgDraw实现的是btIDebugDraw接口,为OpenGL的实现

*/

最后 return glutmain(...)

/*

用过glut的朋友会比较熟悉这种方式。

这个函数定义在GlutStuff文件中,是glut界面的工作:

1.最后一个传入的参数中有我们设置的场景,传给gDemoApplication这个全局指针。  

2.创建好窗口

3.调用 myinit(), 其中设置了灯、材质、阴影等。

4.设置各种回调以交互,在回调函数中会有对gDemoApplication各成员函数的调用以绘制场景等。 追上去,最终还是要靠renderme...

*/

那么总的来说,思路是这样:

首先 DemoApplication规定渲染、交互接口,PlatformDemoAppliation使下某个平台下的方案,例中被define为GlutDemoApplicatiion,使用OpenGL作为渲染,glut做UI来实现DemoApplication接口,AppBox2dDemo再继承GlutDemoApplication来实现具体功能。

对实现者来说,要做的是AppBox2dDemo的实现。

例中,设置各种参数,设置各种场景,添加到世界中.

实现各种必要的函数: clientMoveAndDisplay   [pure virtual]

          及需要设置的函数:       displayCallback  reshape mouseFunc  mouseMotionFunc[virtual]

                       initPhysics() 

                       exitPhysics()

posted @ 2011-02-16 10:03  justin_s  阅读(355)  评论(0编辑  收藏  举报