游戏开发论坛

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

使用盖莫游戏引擎渲染md2模型

[复制链接]

50

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2010-2-10 11:38:00 | 显示全部楼层 |阅读模式
刚改造了以前做的盖莫游戏引擎渲染md2的代码.
对于md2模型来说
一个模型由若干动画组成
一个动画由若干帧构成
每个动画都有自己的名字
具体渲染的时候是对帧做插值的
具体测试例子如下:


  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  
13 int main(int argc, char *argv[])
14 {   
15     Device *device = InitDevice("盖莫引擎md2模型测试");
16     device->SetClearColor(core::Color(80,90,255));
17   
18     //! 获取场景管理器
19     RefPtr<SceneManager> scenemanager = SceneManager::GetSceneManager();
20                                                                  
21     //! 获取资源管理器
22     ResourceManager* resourcemanager = device->GetResourceManager();
23     //! 获取天空图片资源
24     //! 获取天空图形指针
25     skyimage[0] = resourcemanager->GetImage("sky_front","..\\image//sky//front.jpg");
26     skyimage[1] = resourcemanager->GetImage("sky_back","..\\image//sky//back.jpg");
27     skyimage[2] = resourcemanager->GetImage("sky_left","..\\image//sky//left.jpg");
28     skyimage[3] = resourcemanager->GetImage("sky_right","..\\image//sky//right.jpg");
29     skyimage[4] = resourcemanager->GetImage("sky_top","..\\image//sky//top.bmp");
30   
31     skytexture[0] = resourcemanager->GetTexture("sky_front",skyimage[0]);
32     skytexture[1] = resourcemanager->GetTexture("sky_back",skyimage[1]);        
33     skytexture[2] = resourcemanager->GetTexture("sky_left",skyimage[2]);
34     skytexture[3] = resourcemanager->GetTexture("sky_right",skyimage[3]);   
35     skytexture[4] = resourcemanager->GetTexture("sky_top",skyimage[4]);
36     //! 获取天空盒指针
37     RefPtr<SceneNode> skybox = scenemanager->GetSkyBox(NULL,skytexture[0],skytexture[1],skytexture[2],skytexture[3],skytexture[4],500,500,600);  
38     
39     //! 设置地形数据
40     terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
41     terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//detail.bmp");
42     terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
43     terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
44     RefPtr<Terrain>  terrain = scenemanager->GetTerrain(NULL,"..\\terrain//terrain.raw",1024,terraintexture[0],terraintexture[1]);
45   
46     int height = terrain->GetHeight(440,370);
47     height += 40;
48     //! 获取新的摄像机并设置为活动摄像机
49     RefPtr<Camera> camera = scenemanager->CreateCamera("mycamera", Vector3f(10,height,10),
50                                                                    Vector3f(512,height - 30,512),
51                                                                    Vector3f(0,1,0));
52     //! 设置当前活动摄像机
53     scenemanager->SetActiveCamera(camera);
54     camera->SetViewport(0,0,640,480);  
55     
56     //! 雾设置
57     RefPtr<Fog> fog = scenemanager->GetFog();
58     fog->SetColor(core::Color(0.3f,0.5f,0.2f));
59     fog->SetDensity(0.0012f);
60     fog->SetQuality(0.004f);
61     fog->SetBound(0.2f,1000.0f);
62     fog->Render();
63     
64     RefPtr<ActiveModel3D> model = scenemanager->GetActiveModel("md2model");
65     model->Load("..\\model\\hobgoblin.md2");
66     RefPtr<Image>   md2image = resourcemanager->GetImage("md2image","..\\model//hobgoblin.bmp");
67     RefPtr<Texture> md2texture = resourcemanager->GetTexture("md2texture",md2image);
68     model->LoadTexture(md2texture);
69     model->SetTranslate(Vector3f(180,10+terrain->GetHeight(112,512),180));
70   
71     std::vector<AnimationFrame> frames;
72     model->GetFrameList(frames);
73  
74     BEGIN_LOOP(device);
75         camera->SetPerspective(45,640.0f/480.0f,6.0f,1000);
76         camera->Render();
77         skybox->Render();
78         terrain->Render();
79         model->Render();
80         static int begin_frame = 0;
81         static int end_frame = begin_frame+1;;
82         static float t = 0.0f;
83         t+=0.02;
84         if(t>1)
85         {
86            t = 0;
87            end_frame++;
88            begin_frame++;
89         }
90         if(begin_frame == frames.back().frame_end)
91            end_frame = begin_frame = 0;
92         model->SetCurrentFrame(begin_frame,end_frame,t);        
93         
94         static float angle = 0.0f;      
95         skybox->SetRotate(core::AXIS_Z,angle);
96         
97         angle+=0.000003;
98         if(angle>360)
99            angle-=360;
100     END_LOOP(device);
101     
102     device->Close();
103     device->Drop();
104     
105     system(&quotAUSE");
106     return EXIT_SUCCESS;
107 }
108
109 贴图如下:这里的模型是源于opengl游戏开发一书

再来一个Opengl3d游戏开发中士兵的模型例子如下(当然我拿走了他的枪):

我会先让引擎具备常见的功能
之后我就会考虑加入引擎自己的亮点和消除引擎存在的Bug
当然了各类编辑器的设计也是迟早的了
再来一个机器人的md2模型


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-12 13:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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