(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()