以前早就看過了如何使用opengl繪制3ds靜態對象的材料
現在總把這個加入到引擎里面了
具體代碼如下:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6 using namespace core;
7 core::RefPtr<core::Image> skyimage[5];
8 core::RefPtr<core::Texture> skytexture[5];
9 core::RefPtr<core::Image> terrainimage[2];
10 core::RefPtr<core::Texture> terraintexture[2];
11
12 int main(int argc, char *argv[])
13 {
14 Device *device = InitDevice("蓋莫引擎天空盒測試");
15 device->SetClearColor(core::Color(80,90,255));
16
17 //! 獲取場景管理器
18 RefPtr<SceneManager> scenemanager = SceneManager::GetSceneManager();
19
20 //! 獲取資源管理器
21 ResourceManager* resourcemanager = device->GetResourceManager();
22 //! 獲取天空圖片資源
23 //! 獲取天空圖形指針
24 skyimage[0] = resourcemanager->GetImage("sky_front","..\\image//sky//front.jpg");
25 skyimage[1] = resourcemanager->GetImage("sky_back","..\\image//sky//back.jpg");
26 skyimage[2] = resourcemanager->GetImage("sky_left","..\\image//sky//left.jpg");
27 skyimage[3] = resourcemanager->GetImage("sky_right","..\\image//sky//right.jpg");
28 skyimage[4] = resourcemanager->GetImage("sky_top","..\\image//sky//top.bmp");
29
30 skytexture[0] = resourcemanager->GetTexture("sky_front",skyimage[0]);
31 skytexture[1] = resourcemanager->GetTexture("sky_back",skyimage[1]);
32 skytexture[2] = resourcemanager->GetTexture("sky_left",skyimage[2]);
33 skytexture[3] = resourcemanager->GetTexture("sky_right",skyimage[3]);
34 skytexture[4] = resourcemanager->GetTexture("sky_top",skyimage[4]);
35 //! 獲取天空盒指針
36 RefPtr<SceneNode> skybox = scenemanager->GetSkyBox(NULL,skytexture[0],skytexture[1],skytexture[2],skytexture[3],skytexture[4],500,500,600);
37
38 //! 設置地形數據
39 terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
40 terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//detail.bmp");
41 terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
42 terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
43 RefPtr<Terrain> terrain = scenemanager->GetTerrain(NULL,"..\\terrain//terrain.raw",1024,terraintexture[0],terraintexture[1]);
44
45 int height = terrain->GetHeight(440,370);
46 height += 20;
47 //! 獲取新的攝像機并設置為活動攝像機
48 RefPtr<Camera> camera = scenemanager->CreateCamera("mycamera", Vector3f(10,height,10),
49 Vector3f(440,height - 40,370),
50 Vector3f(0,1,0));
51 //! 設置當前活動攝像機
52 scenemanager->SetActiveCamera(camera);
53 camera->SetViewport(0,0,640,480);
54
55 //! 霧設置
56 RefPtr<Fog> fog = scenemanager->GetFog();
57 fog->SetColor(core::Color(0.5f,0.5f,0.1f));
58 fog->SetDensity(0.001f);
59 fog->SetQuality(0.003f);
60 fog->SetBound(0.5f,1000.0f);
61 fog->Render();
62
63 RefPtr<Model3D> model = scenemanager->GetStaticModel("3dsmodel");
64 model->Load("digger.3ds");
65 //model->SetScale(Vector3f(125,125,125));
66 model->SetTranslate(Vector3f(512,terrain->GetHeight(512,512),512));
67
68 BEGIN_LOOP(device);
69 camera->SetPerspective(45,640.0f/480.0f,6.0f,1000);
70 camera->Render();
71 skybox->Render();
72 model->Render();
73 static float angle = 0.0f;
74 skybox->SetRotate(core::AXIS_Z,angle);
75 terrain->Render();
76 angle+=0.000001;
77 if(angle>360)
78 angle-=360;
79 END_LOOP(device);
80
81 device->Close();
82 device->Drop();
83
84 system("PAUSE");
85 return EXIT_SUCCESS;
86 }
87
88
這里設計的操作靜態模型的相關主要函數有
加載模型,模型平移旋轉縮放處理
具體的貼圖如下:

只是模型的顏色不太對,看來需要調整下其rbg次序
再換一個人物模型:
代碼:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6 using namespace core;
7 core::RefPtr<core::Image> skyimage[5];
8 core::RefPtr<core::Texture> skytexture[5];
9 core::RefPtr<core::Image> terrainimage[2];
10 core::RefPtr<core::Texture> terraintexture[2];
11
12 int main(int argc, char *argv[])
13 {
14 Device *device = InitDevice("蓋莫引擎天空盒測試");
15 device->SetClearColor(core::Color(80,90,255));
16
17 //! 獲取場景管理器
18 RefPtr<SceneManager> scenemanager = SceneManager::GetSceneManager();
19
20 //! 獲取資源管理器
21 ResourceManager* resourcemanager = device->GetResourceManager();
22 //! 獲取天空圖片資源
23 //! 獲取天空圖形指針
24 skyimage[0] = resourcemanager->GetImage("sky_front","..\\image//sky//front.jpg");
25 skyimage[1] = resourcemanager->GetImage("sky_back","..\\image//sky//back.jpg");
26 skyimage[2] = resourcemanager->GetImage("sky_left","..\\image//sky//left.jpg");
27 skyimage[3] = resourcemanager->GetImage("sky_right","..\\image//sky//right.jpg");
28 skyimage[4] = resourcemanager->GetImage("sky_top","..\\image//sky//top.bmp");
29
30 skytexture[0] = resourcemanager->GetTexture("sky_front",skyimage[0]);
31 skytexture[1] = resourcemanager->GetTexture("sky_back",skyimage[1]);
32 skytexture[2] = resourcemanager->GetTexture("sky_left",skyimage[2]);
33 skytexture[3] = resourcemanager->GetTexture("sky_right",skyimage[3]);
34 skytexture[4] = resourcemanager->GetTexture("sky_top",skyimage[4]);
35 //! 獲取天空盒指針
36 RefPtr<SceneNode> skybox = scenemanager->GetSkyBox(NULL,skytexture[0],skytexture[1],skytexture[2],skytexture[3],skytexture[4],500,500,600);
37
38 //! 設置地形數據
39 terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
40 terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//detail.bmp");
41 terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
42 terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
43 RefPtr<Terrain> terrain = scenemanager->GetTerrain(NULL,"..\\terrain//terrain.raw",1024,terraintexture[0],terraintexture[1]);
44
45 int height = terrain->GetHeight(440,370);
46 height += 40;
47 //! 獲取新的攝像機并設置為活動攝像機
48 RefPtr<Camera> camera = scenemanager->CreateCamera("mycamera", Vector3f(10,height,10),
49 Vector3f(440,height - 30,370),
50 Vector3f(0,1,0));
51 //! 設置當前活動攝像機
52 scenemanager->SetActiveCamera(camera);
53 camera->SetViewport(0,0,640,480);
54
55 //! 霧設置
56 RefPtr<Fog> fog = scenemanager->GetFog();
57 fog->SetColor(core::Color(0.3f,0.5f,0.2f));
58 fog->SetDensity(0.0012f);
59 fog->SetQuality(0.004f);
60 fog->SetBound(0.2f,1000.0f);
61 fog->Render();
62
63 RefPtr<Model3D> model = scenemanager->GetStaticModel("3dsmodel");
64 model->Load("model.3ds");
65 model->SetScale(Vector3f(125,125,125));
66 model->SetTranslate(Vector3f(510,terrain->GetHeight(512,512),512));
67
68 BEGIN_LOOP(device);
69 camera->SetPerspective(45,640.0f/480.0f,6.0f,1000);
70 camera->Render();
71 skybox->Render();
72 model->Render();
73 static float angle = 0.0f;
74 skybox->SetRotate(core::AXIS_Z,angle);
75 terrain->Render();
76 angle+=0.000003;
77 if(angle>360)
78 angle-=360;
79 END_LOOP(device);
80
81 device->Close();
82 device->Drop();
83
84 system("PAUSE");
85 return EXIT_SUCCESS;
86 }
87
88
貼圖:

需要注意的是由于模型大小不一致故需要調整模型大小