游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2327|回复: 0

ode摩擦力测试demo

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-3-7 15:29:00 | 显示全部楼层 |阅读模式
这是使用盖莫游戏引擎做的基于ode物理引擎的摩擦力测试的小例子
代码如下:
//! 2010.03.05
/////////////////////////////////////////////////////
/// 盖莫游戏引擎盖莫引擎物理场景测试3
/////////////////////////////////////////////////////  
#include <GEngine/Gaimo.hpp>
using namespace std;
#define LENGTH  4
#define MASS    0.4
#define FORCE   0.6
#define MU      1.0  
#define GRAVITY 9.8  
//! 盒子纹理
int  cubeid = 0;  

dGeomID ground;
core:hysicsEngine<dWorldID,dSpaceID,dJointGroupID,dBodyID,dGeomID> engine;
core::PhysicsBody<dBodyID,dGeomID,1> box[3];
//! 碰撞检测回调函数
static void nearCallback(void *data, dGeomID o1, dGeomID o2);

//! 初始化物理场景
void Init();
//! 物理场景更新
void PhysicsLoop();
int main(int argc, char **argv)
{   
    Init();
   
    //! 初始化引擎设备并得到设备指针
    core:evice* device = core::InitDevice("盖莫引擎物理场景-摩擦力测试");
    //! 得到引擎场景指针
    core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager();
    //! 得到引擎资源指针
    core::ResourceManager* resourcemanager = device->GetResourceManager();
    //! 得到图形和其纹理
    core::RefPtr<core::Image>   box = resourcemanager->GetImage("box","..\\image/tile.tga");
    core::RefPtr<core::Texture> boxtexture = resourcemanager->GetTexture("box",box);
    boxtexture->Bind();
    cubeid = boxtexture->GetTextureId();
   
    //! 获取全局摄像机
    core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(-5,100,17),
                                                                      Vector3f(18,1,17),
                                                                      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::Render::SetClearColor(core::Color::Blue);

    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();  
       PhysicsLoop();
    END_LOOP(device)
   
    device->Close();
    device->Drop();
    return 0;
}
//! 初始化物理场景
void Init()
{   
   engine.SetGravity(0,-GRAVITY,0);
   ground = engine.SetPlane(0,1,0,0);
   engine.SetCollideCallBack(&nearCallback);

   box[0].body = engine.GetBody("body1",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*2));
   box[1].body = engine.GetBody("body2",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*6));  
   box[2].body = engine.GetBody("body3",Vector3f(2*LENGTH,0.25*LENGTH,LENGTH*10));   
   for(int i = 0; i < 3; i++)
   {
      dMass m;
      dMassSetBox(&m,1,LENGTH,LENGTH*0.5,LENGTH);
      dMassAdjust(&m,MASS);
      dBodySetMass(box.body,&m);
      box.geom[0] = dCreateBox(engine.GetSpace(),LENGTH,0.5*LENGTH,LENGTH);
      dGeomSetBody(box.geom[0],box.body);  
   }   
}
static void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
  int i;
  //! 仅仅考虑和地面的碰撞
  int g1 = (o1 == ground);
  int g2 = (o2 == ground);
  if (!(g1 ^ g2))
     return;
  dBodyID b1 = dGeomGetBody(o1);
  dBodyID b2 = dGeomGetBody(o2);
  dContact contact[3];  
  for (i=0; i<3; i++)
  {
     contact.surface.mode = dContactSoftCFM | dContactApprox1;
     contact.surface.mu = MU;
     contact.surface.soft_cfm = 0.01;
  }
  if(int numc = dCollide (o1,o2,3,&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 PhysicsLoop()
{  
    engine.Simulation();
   
    const float sides[3] = {2*LENGTH,LENGTH*0.5f,2*LENGTH};
   
    dBodyAddForce(box[0].body,FORCE*5,0,0);
    dBodyAddForce(box[1].body,FORCE*7,0,0);
    dBodyAddForce(box[2].body,FORCE*9,0,0);
    const dReal* pos = dBodyGetPosition(box[0].body);
    const dReal* mat = dBodyGetRotation(box[0].body);
    core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);  
    pos = dBodyGetPosition(box[1].body);
    mat = dBodyGetRotation(box[1].body);
    core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);   
    pos = dBodyGetPosition(box[2].body);
    mat = dBodyGetRotation(box[2].body);
    core::Render::RenderCube(cubeid,(const float*)pos,(const float*)mat,sides);               
}  
  可以看出三个盒子的物理属性都是一致的,除了其位置之外
在模拟过程中给3个盒子施加的力是不同的
由于例子比较简单这里就不上贴图了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-12 22:26

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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