游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2447|回复: 1

使用盖莫游戏引擎设计的简单物理场景

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-3-3 16:21:00 | 显示全部楼层 |阅读模式
当前引擎只是简单的封装了ode几个函数而已
更多的工作需要以后慢慢加入之
这个demo的含义是物理对象在物理场景中会是到重力的作用,如果没有支持物的话会向下掉

下面这是实现的代码-为了贴图我把重力加速度设置的很小(-0.0098f)
//! 2010.03.03
/////////////////////////////////////////////////////
/// 盖莫游戏引擎的物理引擎测试1
/////////////////////////////////////////////////////  
#include <GEngine/Gaimo.hpp>

core:hysicsEngine<dWorldID,dSpaceID,dJointGroupID,dGeomID> engine;
core::PhysicsBody<dBodyID,dGeomID,1> object;  
//! 盒子表面纹理
int   id;
//! 盒子初始高度
float init_box_height = 600;  

//! 检测碰撞回调函数
static void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
    int i;

    dBodyID b1 = dGeomGetBody(o1);
    dBodyID b2 = dGeomGetBody(o2);

    //! 最大接触点4个
    dContact contact[4];   

    for (i = 0; i < 4; i++)
    {
        contact.surface.mode = dContactBounce | dContactSoftCFM;
        contact.surface.mu = dInfinity;
        contact.surface.mu2 = 0;
        contact.surface.bounce = 0.01;
        contact.surface.bounce_vel = 0.1;
        contact.surface.soft_cfm = 0.01;
    }

    if (int numc = dCollide(o1, o2, 4, &contact[0].geom, sizeof(dContact)))
    {
        for (i = 0; i < numc; i++)
        {
            dJointID c = dJointCreateContact(engine.GetWorld(), engine.GetContactGroup(), contact + i);
            dJointAttach(c, b1, b2);
        }
    }
}  

void SimLoop();

int main(int argc, char **argv)
{   
    //! 初始化引擎设备并得到设备指针
    core:evice* device = core::InitDevice("盖莫引擎物理场景测试1");
    //! 得到引擎场景指针
    core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
    //! 得到引擎资源指针
    core::ResourceManager* resourcemanager = device->GetResourceManager();

    //! 获取lua指针
    LuaPlus:uaStateOwner *lua = device->GetLuaStateOwner();
    //! 载入lua脚本
    (*lua)->DoFile("..\\script//skybox.lua");
    //! 获取天空盒表对象
    LuaPlus::LuaObject skyboxtable = (*lua)->GetGlobal("skybox");
   
    //! 得到天空盒图形和其纹理
    core::RefPtr<core::Image>   skyimage0 = resourcemanager->GetImage("sky1",skyboxtable["front"].GetString());
    core::RefPtr<core::Image>   skyimage1 = resourcemanager->GetImage("sky2",skyboxtable["back"].GetString());
    core::RefPtr<core::Image>   skyimage2 = resourcemanager->GetImage("sky3",skyboxtable["left"].GetString());
    core::RefPtr<core::Image>   skyimage3 = resourcemanager->GetImage("sky4",skyboxtable["right"].GetString());
    core::RefPtr<core::Image>   skyimage4 = resourcemanager->GetImage("sky5",skyboxtable["top"].GetString());   
    core::RefPtr<core::Texture> sky0 = resourcemanager->GetTexture("front",skyimage0);
    core::RefPtr<core::Texture> sky1 = resourcemanager->GetTexture("back",skyimage1);
    core::RefPtr<core::Texture> sky2 = resourcemanager->GetTexture("left",skyimage2);
    core::RefPtr<core::Texture> sky3 = resourcemanager->GetTexture("right",skyimage3);
    core::RefPtr<core::Texture> sky4 = resourcemanager->GetTexture("top",skyimage4);

    //! 得到天空盒指针
    core::RefPtr<core::Renderable> skybox = scenemanager->GetSkyBox(sky0,sky1,sky2,sky3,sky4,
                                                                    skyboxtable["width"].GetFloat(),
                                                                    skyboxtable["length"].GetFloat(),
                                                                    skyboxtable["heigth"].GetFloat()
                                                                    ,skyboxtable["rotstep"].GetFloat());     
    //! 载入lua脚本
    (*lua)->DoFile("..\\script//terrain.lua");  
    //! 获取地形表对象
    LuaPlus::LuaObject terraintable = (*lua)->GetGlobal("terrain");

    //! 得到地形图形和其纹理
    core::RefPtr<core::Image>   terrainimage0 = resourcemanager->GetImage("terrain0",terraintable["image1"].GetString());
    core::RefPtr<core::Image>   terrainimage1 = resourcemanager->GetImage("terrain1",terraintable["image2"].GetString());
    core::RefPtr<core::Texture> terraintexture0 = resourcemanager->GetTexture("terraim0",terrainimage0);
    core::RefPtr<core::Texture> terraintexture1 = resourcemanager->GetTexture("terraim1",terrainimage1);     
   
    //! 获取盒子图形和纹理
    core::RefPtr<core::Image>   logoimage = resourcemanager->GetImage("logo","..\\image//logo.jpg");
    core::RefPtr<core::Texture> logo = resourcemanager->GetTexture("logo",logoimage);     
    logo->Bind();   
    id = logo->GetTextureId();
   
    //! 创建地形描述符
    core::TerrainDesc desc;
    desc.main_texture = terraintexture0;
    desc.detail_texture = terraintexture1;
    desc.use_detail = terraintable["usedetail"].GetInteger();
   
    //! 获取地形指针
    core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain(desc);
    terrain->LoadHeigthMap(terraintable["rawfile"].GetString(),terraintable["mapsize"].GetInteger(),terraintable["cell"].GetInteger());

    //! 获取全局摄像机
    core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(230,terrain->GetHeight(220,215)+10,245),
                                                                      Vector3f(251,terrain->GetHeight(251,216)+10,216),
                                                                      Vector3f(0,1,0));
    camera->SetViewport(0,0,640,480);  
    camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);                                                                  
    glClearDepth(1.0f);                                            
    glDepthFunc(GL_LEQUAL);                                       
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);   
    glShadeModel(GL_SMOOTH);                                    
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   
   
    //! 获取雾指针
    core::RefPtr<core::Fog> fog = scenemanager->GetFog();
    //! 载入lua脚本
    (*lua)->DoFile("..\\script//fog.lua");  
    //! 获取雾表对象
    LuaPlus::LuaObject fogtable = (*lua)->GetGlobal("fog");
    fog->SetDensity(fogtable["density"].GetFloat());
    fog->SetBound(fogtable["near"].GetFloat(),fogtable["far"].GetFloat());
    fog->SetQuality(fogtable["quality"].GetFloat());
    fog->SetColor(core::Color(fogtable["red"].GetFloat(),
                              fogtable["green"].GetFloat(),
                              fogtable["blue"].GetFloat(),
                              fogtable["alpha"].GetFloat()));
    fog->Render();
   
     
    float sides[] = {2,2,2};
    float pos[] = {251,init_box_height,216};
    //! 设置空间重力加速度
    engine.SetGravity(0,-0.0098,0);
    //! 设置空间平面
    engine.SetPlane(0,1,0,terrain->GetHeight(251,216)+10);
    //! 加载碰撞检测回调函数
    engine.SetCollideCallBack(&nearCallback);
   
    dMass m;
    object.body = dBodyCreate(engine.GetWorld());
    sides[0] = 2.0;
    sides[1] = 2.0;
    sides[2] = 2.0;

    dMatrix3 mat;
    dBodySetPosition(object.body,251,terrain->GetHeight(251,216)+20,216);
    dBodySetLinearVel(object.body,0,0,0);
    dRFromAxisAndAngle(mat, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 10.0 - 5.0);
    dBodySetRotation(object.body, mat);
    dMassSetBox(&m,0.5, sides[0], sides[1], sides[2]);
    object.geom[0] = dCreateBox(engine.GetSpace(), sides[0], sides[1], sides[2]);
    dGeomSetBody(object.geom[0], object.body);
    dBodySetMass(object.body, &m);
   
    BEGIN_LOOP(device)
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            
       glLoadIdentity();
       camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f);
       camera->Render();   
       skybox->Render();
       terrain->Render();      
       SimLoop();      
    END_LOOP(device)
   
    device->Close();
    device->Drop();

    return 0;
}

void SimLoop()
{
    engine.Simulation();
    dReal sides[3];
    const dReal *pos;
    const dReal *mat;
    dGeomBoxGetLengths(object.geom[0], sides);
    float dsides[] = {sides[0],sides[1],sides[2]};
    pos = dGeomGetPosition(object.geom[0]);
    float dpos[] = {pos[0],pos[1],pos[2]};
    mat = dGeomGetRotation(object.geom[0]);
    float dmat[] = {mat[0],mat[1],mat[2], mat[3],
                    mat[4],mat[5],mat[6], mat[7],
                    mat[8],mat[9],mat[10],mat[11]};
    core::Render::RenderCube(id,dpos,dmat,dsides);
}
显示如下:


50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
 楼主| 发表于 2010-3-3 18:49:00 | 显示全部楼层

Re:使用盖莫游戏引擎设计的简单物理场景

图片次序反了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-12 09:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表