| 
 | 
 
当前引擎只是简单的封装了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); 
} 
显示如下: 
 
  
  |   
 
 
 
 |