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

  • 相关阅读:
    python包管理工具pip使用手册
    Java 校验是否为连续的区间
    AngularJS的uigrid的列表数据实现换行
    家族信托二十大功能全解读
    AngularJS前端,directive的template的点击事件 绑定
    递归和循环的区别
    Oracle数据库锁表排查
    JavaScript判断对象是否是NULL(转)
    西安出差已经一年多了
    发现个了不得的项目
  • 原文地址:https://www.cnblogs.com/justin_s/p/1955773.html
Copyright © 2020-2023  润新知