当前引擎只是简单的封装了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几个函数而已
以后需要设计更加紧凑的东东了