≡菜单

如何用示例编写PAL物理抽象层程序

PAL代表物理抽象层。

物理引擎是一个编程库,可以对物理世界的大多数基本因素(例如重力,碰撞)进行建模。

借助物理引擎,我们可以增强计算机游戏的真实性或对物理实验进行准确的仿真。

有许多不同的物理引擎具有不同的编程接口,这导致了对抽象编程层的需求,该层可以隐藏特定于引擎的细节并为程序员提供一个公共层。

物理抽象层 是流行的开源抽象层之一,它支持许多引擎(Bullet,Havok,Newton,PhysX等)。

有了Cmake支持,可以在Windows和Linux下编译PAL。

目前, SDL 由PAL用作显示框架。除物理引擎外,PAL还支持共享来自图形引擎(例如Irrlicht和Horde3d)的网格数据。

编译PAL时,我们还需要选择将要使用的引擎,PAL将为每个引擎构建一个dll。

启用新引擎时,请记住要重新配置。

使用PAL的步骤

通常,我们需要执行以下7个步骤(也在下面的示例代码中表示),以在PAL下设置基本方案:

  1. 加载由PAL为每个引擎生成的dll。
  2. 选择一个作为工作引擎。
  3. 创建并初始化物理引擎。
  4. 创建并初始化SDL引擎以进行显示。
  5. 在PAL和SDL中构建地形。
  6. 建立其他对象。
  7. 在PAL中逐步进行仿真,并在SDL中显示结果。

在pal / example中有一个简单的控制台版本示例,在pal / paldemo中有一个复杂的GUI版本演示。

在这里,我们为您带来一个GUI示例,其中涵盖了PAL的基本操作概念。

基于pal / example中的代码,通过添加与SDL相关的部分,我们创建了一个演示,使用PAL和Bullet来模拟将盒子从高位置放到打开的盒子中。

后者被定义为地形对象,并且是手动操作的,而前者是通过使用在pal / example / graphics.cpp中定义的例程和类来实现的。

我们仅关注使用PAL构建应用程序的基本流程,此演示中未实现高级功能,例如照明,纹理,抗锯齿。另外,可以在本文结尾处找到屏幕截图。

使用PAL的示例程序

int main(int argc, char *argv[]) {
    //(step 1) PF is macro defined in palFactory.h, which can get the global palFactory instance. LoadPALfromDLL will automatically find and register engine dlls.
    PF->LoadPALfromDLL();      

	//(step 2) Select Bullet, which needs the existance of libpal_bullet.dll
    PF->SelectEngine("Bullet");

	//(step3) create the physics object
    palPhysics *pp = PF->CreatePhysics();
    if (pp == NULL) {
        printf("Failed to create the physics engine. Check to see if you spelt the engine name correctly, and that the engine DLL is in the right location");
        return 1;
    }
    else {
        printf("%s\n%s\n", pp->GetPALVersion(), pp->GetVersion());
    }
    palPhysicsDesc desc;
    desc.m_vGravity.x = 0;
    desc.m_vGravity.y = -9.8f;
    desc.m_vGravity.z = 0;
	//(step 3) Initial the physics engine with gravity (negative y axis)
    pp->Init(desc);             

    float angle = M_PIf*0.4f;
    float distance = 150;
    float height = 50;
    bool mouse_down = false;
    bool g_quit = false;
    bool wireframe = false;
    bool transparent = false;

    //(step 4) create and initial the SDL enviroment 
    SDLGLEngine *g_eng = new SDLGLEngine;               
    g_eng->Init(640, 480);

    //define vertices and indices for an opened box
    float ver[3 * 8] = { -10, 0, -10,
        10, 0, -10,
        10, 0, 10,
        -10, 0, 10,
        -10, 5, -10,
        10, 5, -10,
        10, 5, 10,
        -10, 5, 10 };
    int ind[3 * 10] = { 0, 1, 2, 2, 3, 0,
        6, 2, 3, 3, 7, 6,
        0, 3, 7, 7, 4, 0,
        0, 4, 5, 5, 1, 0,
        5, 1, 2, 2, 6, 5 };

	//(step 5) create a mesh terrain object
    palTerrainMesh *ptm = PF->CreateTerrainMesh();      
    if (ptm != NULL) {
        ptm->Init(0, 0, 0, ver, 8, ind, 30);  //initial the terrain object
        SDL_Mesh  *graphics_mesh = new SDL_Mesh; //create a SDL mesh object for the display
        graphics_mesh->Init(3 * 8, 3 * 10, ver, ind);  //initial the sdl object
        terrain_graphics = graphics_mesh;
    }
    else {
        printf("Error: Could not create a terrain plane\n");
    }

    //use SDL to handle the input
    SDL_Event E;
    while (!g_quit) {
        if (SDL_PollEvent(&E)) {
            switch (E.type) {
            case SDL_QUIT:
                g_quit = true;
                break;
            case SDL_MOUSEBUTTONDOWN:
                mouse_down = true;
                break;
            case SDL_MOUSEBUTTONUP:
                mouse_down = false;
                break;
            case SDL_MOUSEMOTION:
                if (mouse_down)
                    angle += E.motion.xrel*0.01f;
                break;
            case SDL_KEYDOWN:
                switch (E.key.keysym.sym) {
                case SDLK_PLUS:
                case SDLK_KP_PLUS:
                    distance -= 0.5f;
                    break;
                case SDLK_MINUS:
                case SDLK_KP_MINUS:
                    distance += 0.5f;
                    break;
                case SDLK_KP_DIVIDE:
                    height -= 0.5f;
                    break;
                case SDLK_KP_MULTIPLY:
                    height += 0.5f;
                    break;
                case SDLK_KP1:
                case SDLK_TAB:
                    wireframe = !wireframe;
                    break;
                case SDLK_KP0:
                case SDLK_0:
                    transparent = !transparent;
                    break;
                case SDLK_a:
				    //(step 6) create a box inside PAL
                    palBox *pb = PF->CreateBox();
                    pb->Init(0, 60, 0, 2, 2, 2, 8);
                    BuildGraphics(pb);   //Build a SDL box at the same time, defined in example/graphics.cpp. Objects will stored as a copy in g_Graphics
                    break;
                }
            }
        }
        else {
            pp->Update(0.02f);  //step in for the physic engine
            palVector3 pos;

            g_eng->Clear();     //clear the SDL engine

            //setup SDL according to the parameters for display
            g_eng->Wireframe(wireframe);
            g_eng->Transparent(transparent);
            g_eng->SetProjMatrix(M_PIf / 4.0f, 1.0f, 0.2f, 200.0f);
            g_eng->SetViewMatrix(distance*cosf(angle), height, distance*sinf(angle), 0, height, 0, 0, 1, 0);

            //(step 7) display the terrain
            terrain_graphics->Render();
            for (int i = 0; i < g_Graphics.size(); i++) {
                g_Graphics[i]->m_pBody->GetPosition(pos);   //we can get position of each object inside PAL/physics engine
                g_Graphics[i]->Display();   //Use display routine define in example/graphics.cpp
            }

            g_eng->Flip();  //show the content to user
        }
    }

    delete terrain_graphics;
    delete g_eng;

    PF->Cleanup();
    return 0;
}

节目输出

以下是上述PAL代码的输出。如前所述,在此示例中,我们仅关注构建具有PAL的应用程序的基本流程,本演示中未实现高级功能,例如照明,纹理,抗锯齿。

PAL SDL应用

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 3 评论… 加一 }

  • 鲍勃 2014年3月24日,上午7:39

    真的很酷的东西。我今天学到新东西…

  • 黄昏科西嘉 2014年4月1日,上午2:58

    该领域的专业人士的好文章。更糟糕的是,’不要使用他们的G +,F或T来祝贺这样的酷东西。我之前喜欢的一件事是MathLab,这是一件非常好的事情。只是不要’不知道它在Linux中可用,但是应该有Vino或其他方法。我已经很长时间没有使用该程序了,但是它有很大的帮助。如果我有更多的时间,我会花更多的业余时间研究这个好东西。做得好!

  • 普拉蒂克 2014年4月7日,上午4:51

    只是我想从您那里得到的建议。从Unity3D开始进行游戏开发是否很好?

发表评论