| 
 | 
 
 
本例子是使用盖莫游戏引擎+ode做的第三简单demo 
这是对关节合页的测试代码: 
//! 2010.03.05 
///////////////////////////////////////////////////// 
/// 盖莫游戏引擎盖莫引擎物理场景测试3 
/////////////////////////////////////////////////////   
#include <GEngine/Gaimo.hpp> 
using namespace std; 
 
//! 盒子大小和质量 
#define SIDE (8.0f)      
#define MASS (1.0) 
//! 盒子纹理 
int  cubeid = 0;   
 
core: hysicsEngine<dWorldID,dSpaceID,dJointGroupID,dBodyID,dGeomID> engine; 
core::PhysicsBody<dBodyID,dGeomID,1> object[2]; 
dJointID hinge; 
const std::string name[] = {"b1","b2"}; 
 
//! 初始化物理场景 
void Init(); 
//! 物理场景更新 
void PhysicsLoop();   
 
int main(int argc, char **argv) 
{    
    Init(); 
    
    //! 初始化引擎设备并得到设备指针 
    core: evice* device = core::InitDevice("盖莫引擎物理场景测试3"); 
    //! 得到引擎场景指针 
    core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager(); 
    //! 得到引擎资源指针 
    core::ResourceManager* resourcemanager = device->GetResourceManager(); 
    
    //! 得到logo图形和其纹理 
    core::RefPtr<core::Image>   box = resourcemanager->GetImage("box","..\\image/logo.jpg"); 
    core::RefPtr<core::Texture> boxtexture = resourcemanager->GetTexture("logo",box); 
    boxtexture->Bind(); 
    cubeid = boxtexture->GetTextureId(); 
    
    //! 获取全局摄像机 
    core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(30,30,30), 
                                                                      Vector3f(0,0,0), 
                                                                      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);                                                                                 
    glEnable(GL_DEPTH_TEST); 
    glShadeModel(GL_SMOOTH);                                     
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    
 
    BEGIN_LOOP(device) 
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);             
       glLoadIdentity(); 
       core::Render::SetClearColor(core::Color::Blue); 
       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() 
{ 
      //! 设置调整盒子质量 
      dMass m; 
      dMassSetBox(&m,1,SIDE,SIDE,SIDE); 
      dMassAdjust(&m,MASS); 
      //! 从轴和角度获取四元数 
      dQuaternion q; 
      dQFromAxisAndAngle(q,1,1,0,0.25*M_PI); 
      //! 设置盒子1物理参数 
      object[0].body = engine.GetBody(name[0],Vector3f(0.5*SIDE,0.5*SIDE,1)); 
      dBodySetMass (object[0].body,&m); 
      dBodySetQuaternion (object[0].body,q); 
      //! 设置盒子2物理参数 
      object[1].body = engine.GetBody(name[1],Vector3f(-0.5*SIDE,-0.5*SIDE,1)); 
      dBodySetMass (object[1].body,&m); 
      dBodySetQuaternion(object[1].body,q); 
      //! 生成合页关节并设置参数 
      hinge = dJointCreateHinge(engine.GetWorld(),0); 
      dJointAttach (hinge,object[0].body,object[1].body); 
      dJointSetHingeAnchor(hinge,0,0,1); 
      dJointSetHingeAxis(hinge,1,-1,1.41421356);       
} 
 
//! 物理场景更新 
void PhysicsLoop() 
{    
    //! 角阻尼常量    
    const dReal kd = -0.3; 
 
    static dReal a=0; 
    const dReal *w = dBodyGetAngularVel(object[0].body); 
    dBodyAddTorque (object[0].body,kd*w[0],kd*w[1]+0.15*cos(a),kd*w[2]+0.15*sin(a)); 
    dWorldStep(engine.GetWorld(),0.05); 
    a += 0.01; 
 
    dReal sides1[3] = {SIDE,SIDE,SIDE}; 
    dReal sides2[3] = {SIDE,SIDE,SIDE*0.8f}; 
    const dReal *pos,*mat; 
    pos = dBodyGetPosition(object[0].body); 
    mat = dBodyGetRotation(object[0].body); 
    core::Render::RenderCube(cubeid,(float*)pos,(float*)mat,(float*)sides1);                  
    pos = dBodyGetPosition(object[1].body); 
    mat = dBodyGetRotation(object[1].body); 
    core::Render::RenderCube(cubeid,(float*)pos,(float*)mat,(float*)sides2);          
} 
 
  
  |   
 
 
 
 |