Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
当前引擎只是简单的封装了ode几个函数而已
更多的工作需要以后慢慢加入之
这个demo的含义是物理对象在物理场景中会是到重力的作用,如果没有支持物的话会向下掉

下面这是实现的代码-为了贴图我把重力加速度设置的很小(-0.0098f)
  1 //! 2010.03.03
  2 /////////////////////////////////////////////////////
  3 /// 盖莫游戏引擎的物理引擎测试1 
  4 /////////////////////////////////////////////////////  
  5 #include <GEngine/Gaimo.hpp>
  6 
  7 core::PhysicsEngine<dWorldID,dSpaceID,dJointGroupID,dGeomID> engine;
  8 core::PhysicsBody<dBodyID,dGeomID,1> object;  
  9 //! 盒子表面纹理 
 10 int   id; 
 11 //! 盒子初始高度
 12 float init_box_height = 600;  
 13 
 14 //! 检测碰撞回调函数 
 15 static void nearCallback(void *data, dGeomID o1, dGeomID o2)
 16 {
 17     int i;
 18 
 19     dBodyID b1 = dGeomGetBody(o1);
 20     dBodyID b2 = dGeomGetBody(o2);
 21 
 22     //! 最大接触点4个 
 23     dContact contact[4];    
 24 
 25     for (i = 0; i < 4; i++)
 26     {
 27         contact[i].surface.mode = dContactBounce | dContactSoftCFM;
 28         contact[i].surface.mu = dInfinity;
 29         contact[i].surface.mu2 = 0;
 30         contact[i].surface.bounce = 0.01;
 31         contact[i].surface.bounce_vel = 0.1;
 32         contact[i].surface.soft_cfm = 0.01;
 33     }
 34 
 35     if (int numc = dCollide(o1, o2, 4&contact[0].geom, sizeof(dContact)))
 36     {
 37         for (i = 0; i < numc; i++)
 38         {
 39             dJointID c = dJointCreateContact(engine.GetWorld(), engine.GetContactGroup(), contact + i);
 40             dJointAttach(c, b1, b2);
 41         }
 42     }
 43 }  
 44 
 45 void SimLoop();
 46  
 47 int main(int argc, char **argv)
 48 {   
 49     //! 初始化引擎设备并得到设备指针 
 50     core::Device* device = core::InitDevice("盖莫引擎物理场景测试1"); 
 51     //! 得到引擎场景指针 
 52     core::RefPtr<core::SceneManager> scenemanager = device->GetSceneManager(); 
 53     //! 得到引擎资源指针 
 54     core::ResourceManager* resourcemanager = device->GetResourceManager();
 55  
 56     //! 获取lua指针
 57     LuaPlus::LuaStateOwner *lua = device->GetLuaStateOwner();
 58     //! 载入lua脚本
 59     (*lua)->DoFile("..\\script//skybox.lua"); 
 60     //! 获取天空盒表对象
 61     LuaPlus::LuaObject skyboxtable = (*lua)->GetGlobal("skybox"); 
 62     
 63     //! 得到天空盒图形和其纹理 
 64     core::RefPtr<core::Image>   skyimage0 = resourcemanager->GetImage("sky1",skyboxtable["front"].GetString());
 65     core::RefPtr<core::Image>   skyimage1 = resourcemanager->GetImage("sky2",skyboxtable["back"].GetString());
 66     core::RefPtr<core::Image>   skyimage2 = resourcemanager->GetImage("sky3",skyboxtable["left"].GetString());
 67     core::RefPtr<core::Image>   skyimage3 = resourcemanager->GetImage("sky4",skyboxtable["right"].GetString());
 68     core::RefPtr<core::Image>   skyimage4 = resourcemanager->GetImage("sky5",skyboxtable["top"].GetString());    
 69     core::RefPtr<core::Texture> sky0 = resourcemanager->GetTexture("front",skyimage0); 
 70     core::RefPtr<core::Texture> sky1 = resourcemanager->GetTexture("back",skyimage1); 
 71     core::RefPtr<core::Texture> sky2 = resourcemanager->GetTexture("left",skyimage2); 
 72     core::RefPtr<core::Texture> sky3 = resourcemanager->GetTexture("right",skyimage3); 
 73     core::RefPtr<core::Texture> sky4 = resourcemanager->GetTexture("top",skyimage4); 
 74  
 75     //! 得到天空盒指针 
 76     core::RefPtr<core::Renderable> skybox = scenemanager->GetSkyBox(sky0,sky1,sky2,sky3,sky4,
 77                                                                     skyboxtable["width"].GetFloat(),
 78                                                                     skyboxtable["length"].GetFloat(),
 79                                                                     skyboxtable["heigth"].GetFloat()
 80                                                                     ,skyboxtable["rotstep"].GetFloat());     
 81     //! 载入lua脚本
 82     (*lua)->DoFile("..\\script//terrain.lua");  
 83     //! 获取地形表对象
 84     LuaPlus::LuaObject terraintable = (*lua)->GetGlobal("terrain"); 
 85  
 86     //! 得到地形图形和其纹理 
 87     core::RefPtr<core::Image>   terrainimage0 = resourcemanager->GetImage("terrain0",terraintable["image1"].GetString()); 
 88     core::RefPtr<core::Image>   terrainimage1 = resourcemanager->GetImage("terrain1",terraintable["image2"].GetString()); 
 89     core::RefPtr<core::Texture> terraintexture0 = resourcemanager->GetTexture("terraim0",terrainimage0); 
 90     core::RefPtr<core::Texture> terraintexture1 = resourcemanager->GetTexture("terraim1",terrainimage1);     
 91     
 92     //! 获取盒子图形和纹理 
 93     core::RefPtr<core::Image>   logoimage = resourcemanager->GetImage("logo","..\\image//logo.jpg"); 
 94     core::RefPtr<core::Texture> logo = resourcemanager->GetTexture("logo",logoimage);     
 95     logo->Bind();   
 96     id = logo->GetTextureId();
 97     
 98     //! 创建地形描述符
 99     core::TerrainDesc desc;
100     desc.main_texture = terraintexture0;
101     desc.detail_texture = terraintexture1;
102     desc.use_detail = terraintable["usedetail"].GetInteger(); 
103     
104     //! 获取地形指针
105     core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain(desc); 
106     terrain->LoadHeigthMap(terraintable["rawfile"].GetString(),terraintable["mapsize"].GetInteger(),terraintable["cell"].GetInteger()); 
107  
108     //! 获取全局摄像机
109     core::RefPtr<core::Camera> camera = scenemanager->GetGlobalCamera(Vector3f(230,terrain->GetHeight(220,215)+10,245),
110                                                                       Vector3f(251,terrain->GetHeight(251,216)+10,216),
111                                                                       Vector3f(0,1,0));
112     camera->SetViewport(0,0,640,480);  
113     camera->SetPerspective(50.0f,640.0f/480.0f,0.1f,1000.0f);                                                                  
114     glClearDepth(1.0f);                                            
115     glDepthFunc(GL_LEQUAL);                                        
116     glEnable(GL_DEPTH_TEST);
117     glEnable(GL_CULL_FACE);    
118     glShadeModel(GL_SMOOTH);                                    
119     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    
120     
121     //! 获取雾指针 
122     core::RefPtr<core::Fog> fog = scenemanager->GetFog();
123     //! 载入lua脚本
124     (*lua)->DoFile("..\\script//fog.lua");  
125     //! 获取雾表对象
126     LuaPlus::LuaObject fogtable = (*lua)->GetGlobal("fog"); 
127     fog->SetDensity(fogtable["density"].GetFloat());
128     fog->SetBound(fogtable["near"].GetFloat(),fogtable["far"].GetFloat());
129     fog->SetQuality(fogtable["quality"].GetFloat());
130     fog->SetColor(core::Color(fogtable["red"].GetFloat(),
131                               fogtable["green"].GetFloat(),
132                               fogtable["blue"].GetFloat(),
133                               fogtable["alpha"].GetFloat()));
134     fog->Render();
135     
136      
137     float sides[] = {2,2,2};
138     float pos[] = {251,init_box_height,216}; 
139     //! 设置空间重力加速度 
140     engine.SetGravity(0,-0.0098,0);
141     //! 设置空间平面 
142     engine.SetPlane(0,1,0,terrain->GetHeight(251,216)+10); 
143     //! 加载碰撞检测回调函数 
144     engine.SetCollideCallBack(&nearCallback);
145     
146     dMass m;
147     object.body = dBodyCreate(engine.GetWorld());
148     sides[0= 2.0;
149     sides[1= 2.0;
150     sides[2= 2.0;
151 
152     dMatrix3 mat;
153     dBodySetPosition(object.body,251,terrain->GetHeight(251,216)+20,216);
154     dBodySetLinearVel(object.body,0,0,0);
155     dRFromAxisAndAngle(mat, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 2.0 - 1.0, dRandReal() * 10.0 - 5.0);
156     dBodySetRotation(object.body, mat);
157     dMassSetBox(&m,0.5, sides[0], sides[1], sides[2]);
158     object.geom[0= dCreateBox(engine.GetSpace(), sides[0], sides[1], sides[2]);
159     dGeomSetBody(object.geom[0], object.body);
160     dBodySetMass(object.body, &m);
161     
162     BEGIN_LOOP(device)
163        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            
164        glLoadIdentity();
165        camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,1000.0f); 
166        camera->Render();   
167        skybox->Render();
168        terrain->Render();       
169        SimLoop();      
170     END_LOOP(device)
171    
172     device->Close();
173     device->Drop();
174  
175     return 0;
176 }
177 
178 void SimLoop()
179 {
180     engine.Simulation(); 
181     dReal sides[3];
182     const dReal *pos;
183     const dReal *mat;
184     dGeomBoxGetLengths(object.geom[0], sides);
185     float dsides[] = {sides[0],sides[1],sides[2]};
186     pos = dGeomGetPosition(object.geom[0]);
187     float dpos[] = {pos[0],pos[1],pos[2]};
188     mat = dGeomGetRotation(object.geom[0]);
189     float dmat[] = {mat[0],mat[1],mat[2], mat[3],
190                     mat[4],mat[5],mat[6], mat[7],
191                     mat[8],mat[9],mat[10],mat[11]}; 
192     core::Render::RenderCube(id,dpos,dmat,dsides);
193 

二张贴图分别如下:

其二

再次说明当前的引擎只是简单的封装了ode几个函数而已
以后需要设计更加紧凑的东东了
posted on 2010-03-03 16:17 ccsdu2009 阅读(1394) 评论(2)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: 使用盖莫游戏引擎设计的简单物理场景
    ccsdu2009
    Posted @ 2010-03-03 18:38
    贴图次序反了  回复  更多评论   
  • # re: 使用盖莫游戏引擎设计的简单物理场景
    陈梓瀚(vczh)
    Posted @ 2010-03-04 11:36
    小细节:cube不需要光源反射的插值的,看起来没有棱角  回复  更多评论