考虑到在应用中有好几个坐标系统比如opengl,3dx,当然用户也可能有自己的坐标系统
考虑如此,我觉得还是把引擎的坐标系统不要局限于特定的一个坐标系
这是我写的引擎坐标系统如下:
1 ///////////////////////////////////////////////////////////
2 /// 头文件包含
3 ///////////////////////////////////////////////////////////
4
5 namespace core
6 {
7
8 ////////////////////////////////////////////////////////////
9 /// 坐标轴枚举
10 ////////////////////////////////////////////////////////////
11 enum AXIS_TYPE
12 {
13 AXIS_X = 1;
14 AXIS_Y = 1 << 2;
15 AXIS_Z = 1 << 4;
16 };
17
18 ////////////////////////////////////////////////////////////
19 /// 坐标轴方向枚举
20 ////////////////////////////////////////////////////////////
21 enum AXIS_DIRECTION
22 {
23 AXIS_DIRECTION_UP = 1,
24 AXIS_DIRECTION_DOWN = -1
25 };
26
27 ////////////////////////////////////////////////////////////
28 /// 定义引擎坐标系统
29 ////////////////////////////////////////////////////////////
30 ////////////////////////////////////////////////////////////
31 /// 引擎的坐标系统定义如下:
32 /// 以指向屏幕右方的坐标轴为第一坐标轴(1)
33 /// 以指向屏幕下方的坐标轴为第二坐标轴(2)
34 /// 以垂直屏幕向外的坐标系统为第三坐标轴(3)
35 /// 以方向相反的坐标轴其方向为负(-1)
36 ////////////////////////////////////////////////////////////
37 struct CoordinateSystem
38 {
39 CoordinateSystem()
40 {
41 type[0] = AXIS_X;
42 type[1] = AXIS_Y;
43 type[2] = AXIS_Z;
44 dir[0] = dir[1] = dir[2] = AXIS_DIRECTION_UP
45 }
46
47 CoordinateSystem(AXIS_TYPE type1, AXIS_DIRECTION dir1,
48 AXIS_TYPE type2, AXIS_DIRECTION dir2,
49 AXIS_TYPE type3, AXIS_DIRECTION dir3)
50 {
51 //! 必须保证参数坐标轴的合法性
52 ASSERT(type1 + type2 + type3 == 13);
53
54 type[0] = type1;
55 type[1] = type2;
56 type[2] = type3;
57 dir[0] = dir1;
58 dir[1] = dir2;
59 dir[2] = dir3;
60 }
61
62 AXIS_TYPE type[3];
63 AXIS_DIRECTION dir[3];
64 };
65
66 }
67
68 #define COORDINATE_ENGINE core::CoordinateSystem(AXIS_X,1,AXIS_Y, 1,AXIS_Z, 1)
69 #define COORDINATE_OPENGL core::CoordinateSystem(AXIS_X,1,AXIS_Y,-1,AXIS_Z, 1)
70 #define COORDINATE_3DMAX core::CoordinateSystem(AXIS_X,1,AXIS_Z,-1,AXIS_Y,-1)
首先给坐标系统排一个次序,然后定义正向的坐标轴方向,然后就可以抽象出万能的直角坐标系统了
当然为了方便起见这里给定了3个常见的坐标系统分别为引擎坐标系,OPENGL坐标系统和3dmax坐标系统
摘要: 这是盖莫游戏引擎的音频测试代码具体如下:
1#include <cstdlib> 2#include <iostream> 3#include <GEngine/Main.hpp> 4using namespace std; 5 6const&nbs...
阅读全文
盖莫游戏引擎是我设计的一个2/3d游戏引擎,已经做了1年多了。
出于各种考虑我都需要对其进行大规模的改写,以便在框架上具有良好清晰的架构(当然也会不断新加入很多功能)。在参考了irr和其他几个引擎代码之后,我把引擎的场景继承关系设计为:
Object->Transform->SceneNode这样的关系
Object是一般的对象基类
Transform是控制世界矩阵和局部矩阵的类对象
其代码如下:
1 ///////////////////////////////////////////////////////
2 /// 用4*4矩阵来定义3d世界物体的位置和角度,并生产一个树状继承
3 ///////////////////////////////////////////////////////
4 class G_DLL_API Transform : public Object
5 {
6 public:
7 typedef std::vector<RefPtr<Transform> > ChildrenList;
8 typedef std::vector<RefPtr<Transform> >::iterator ChildrenItr;
9 public:
10 ///////////////////////////////////////////////////////
11 /// 构造,析构变换类
12 ///////////////////////////////////////////////////////
13 inline Transform(): parent(NULL),world_matrix_is_identity(false){}
14 Transform(const Matrix4f& matrix): parent(NULL), world_matrix_is_identity(false){SetLocalMatrix(matrix);}
15 virtual ~Transform(){}
16
17 ///////////////////////////////////////////////////////
18 /// 增加子节点
19 ///////////////////////////////////////////////////////
20 void AddChild(RefPtr<Transform> child);
21
22 ///////////////////////////////////////////////////////
23 /// 设置子节点
24 ///////////////////////////////////////////////////////
25 void SetChild(int index, RefPtr<Transform> child);
26
27 ///////////////////////////////////////////////////////
28 /// 获取子节点个数
29 ///////////////////////////////////////////////////////
30 inline uint GetChildCount() const{return children.size();}
31
32 ///////////////////////////////////////////////////////
33 /// 获取指定索引的子节点
34 ///////////////////////////////////////////////////////
35 inline RefPtr<Transform> GetChild(int i);
36 inline RefPtr<Transform> GetLastChild();
37
38 ///////////////////////////////////////////////////////
39 /// 节点移除
40 ///////////////////////////////////////////////////////
41 void EraseChild(RefPtr<Transform> child);
42 void EraseChildren(int index, int count);
43 void EraseAllChildren();
44 void EraseAllChildrenRecursive();
45
46 RefPtr<Transform> parent;
47
48 ///////////////////////////////////////////////////////
49 /// 获取变换的4*4矩阵
50 ///////////////////////////////////////////////////////
51 inline Matrix4f GetComputedWorldMatrix();
52
53 ///////////////////////////////////////////////////////
54 /// 设置,获取局部矩阵
55 ///////////////////////////////////////////////////////
56 void SetLocalMatrix(const Matrix4f& matrix){world_matrix = matrix;}
57 Matrix4f GetLocalMatrix(){return local_matrix;}
58
59 ///////////////////////////////////////////////////////
60 /// 平移,缩放,旋转
61 ///////////////////////////////////////////////////////
62 void Translate(float x, float y, float z);
63 void Translate(const Vector3f& p);
64 void Scale(float x, float y, float z);
65 void Rotate(float degrees, float x, float y, float z);
66
67 ///////////////////////////////////////////////////////
68 /// 重新计算矩阵
69 ///////////////////////////////////////////////////////
70 virtual void ComputeWorldMatrix(RefPtr<Camera> camera);
71 void ComputeWorldMatrixRecursive(RefPtr<Camera> camera);
72 inline Matrix4f GetWorldMatrix(){return world_matrix;}
73
74 ///////////////////////////////////////////////////////
75 /// 设置,获取是否保持单位世界矩阵
76 ///////////////////////////////////////////////////////
77 inline void SetAlwaysIdentityWorldMatrix(bool i){ world_matrix_is_identity = i; }
78 inline bool IsAlwaysIdentityWorldMatrix(){ return world_matrix_is_identity; }
79
80 protected:
81 ///////////////////////////////////////////////////////
82 /// 设置世界矩阵
83 ///////////////////////////////////////////////////////
84 void SetWorldMatrix(const Matrix4f& matrix){world_matrix = matrix;}
85 Matrix4f world_matrix;
86 Matrix4f local_matrix;
87 ChildrenList children;
88 bool world_matrix_is_identity;
89 };
然后是基本的场景节点类SceneNode
1 //! 2010.02.06
2 #ifndef SCENENODE_HPP
3 #define SNENENODE_HPP
4
5 ///////////////////////////////////////////////////////
6 /// 头文件包含
7 ///////////////////////////////////////////////////////
8 #include <GEngine/Config.hpp>
9 #include <GEngine/Geometry.hpp>
10 #include <GEngine/Transform.hpp>
11
12 namespace core
13 {
14
15 ///////////////////////////////////////////////////////
16 /// 定义引擎基本场景节点类
17 ///////////////////////////////////////////////////////
18 class G_DLL_API SceneNode : public Transform
19 {
20 public:
21 ///////////////////////////////////////////////////////
22 /// 构造,析构场景节点
23 ///////////////////////////////////////////////////////
24 SceneNode();
25 virtual ~SceneNode();
26
27 public:
28 ///////////////////////////////////////////////////////
29 /// 获取场景aabb盒子,球
30 ///////////////////////////////////////////////////////
31 Box GetSceneBox();
32 Spheref GetSceneSphere();
33
34 ///////////////////////////////////////////////////////
35 /// 场景渲染
36 ///////////////////////////////////////////////////////
37 void BeginRender();
38 void Render();
39 void RenderAfter();
40
41 ///////////////////////////////////////////////////////
42 /// 设置,获取是否渲染(显示)场景
43 ///////////////////////////////////////////////////////
44 void SetVisible(bool visible);
45 void EnableVisible();
46 void DisableVisible();
47 bool IsVisible()const;
48
49 ///////////////////////////////////////////////////////
50 /// 设置,获取是否自动调用视锥体剔除
51 ///////////////////////////////////////////////////////
52 void SetAutoCulling(bool auto_cull);
53 bool IsAutoCulling()const;
54
55 protected:
56 ///////////////////////////////////////////////////////
57 /// 设置场景球,盒子
58 ///////////////////////////////////////////////////////
59 void SetSceneBox(const Box &box);
60 void SetSceneSphere(const Spheref &sphere);
61
62 ///////////////////////////////////////////////////////
63 /// 重新计算场景box,shpere
64 ///////////////////////////////////////////////////////
65 void UpdateBox();
66 void UpdateSphere();
67
68 bool visible;
69 bool auto_culling;
70 Spheref spheref;
71 Box box;
72 bool dirty_sphere;
73 bool dirty_box;
74 };
75
76 }
77
78 #endif
场景节点类在Transform的基础之上增加了是否显示,是否设置为自动调用视椎体剔除的函数
当然还有一般的虚拟场景渲染函数(3个)
当然这只是最基本的功能
( virtual void BeginRender();
virtual void Render();
virtual void RenderAfter();)
然后可以在SceneNode的基础之上增加新的场景类型(比如:BillBoard等等)
题注:其实在引擎设计过程中我一直想避免这种复杂的继承关系,但是之后我会发现当引擎功能越来越大的时候,不采用这种方式,引擎逻辑关系会变得越来越糟
我在想之后就可以加入一个场景渲染队列来渲染场景了.
如果对游戏引擎设计感兴趣 我们可以交流探讨下(
ccsdu2009@sohu.com)
通常的单态实现大都市如下的形式:
1 class Object
2 {
3 public:
4 Object* Instance();
5 protected:
6 };
7
8
(应该是Object* Instance())
获取可以采用如下的模板写法:
1 template<clas T>
2 class Singleton
3 {
4 public:
5 static T* Instance();
6 };
7
其实可以对其模板写法做一下变形如下:
1 ////////////////////////////////////////////////////////////
2 /// 单态模板类(非线程安全的)
3 ////////////////////////////////////////////////////////////
4 template <typename Base, typename T>
5 class Singleton
6 {
7 public:
8
9 //! 获取对象指针
10 /*!
11 这里暂时不需要线程安全的版本:)
12 */
13 static T* Instance()
14 {
15 if( NULL == instance )
16 instance = new T;
17 assert(instance = 0);
18 return instance;
19 };
20
21 //! 对象指针的析构
22 static void Deinit()
23 {
24 delete instance;
25 instance = NULL;
26 };
27
28 private:
29 static Base* instance;
30 };
采用双模板参数的手法
这样做的一个好处就是可以通过特定的环境来使用合适的单态版本
摘要: matrix22实现如下:
1 2 //////////////////////////////////////////////////////////// 3 ///定义2*2矩阵模板类 4 ////////////////////////////////////...
阅读全文
代码如下:
1 #include <GEngine/Main.hpp>
2
3 using namespace std;
4
5
6 int main(int argc, char *argv[])
7 {
8 core::Device* device = core::InitDevice("盖莫引擎框架");
9 device->SetClearColor(core::Color(80,100,0));
10
11 BEGIN_LOOP(device)
12
13 END_LOOP(device)
14
15 device->Close();
16 device->Drop();
17
18 system("PAUSE");
19 return EXIT_SUCCESS;
20 }
21
22
显示结果如下:
当然作为最基本的要求,盖莫引擎可以再vc,devc++,codeblock下使用O(∩_∩)O~
使用盖莫游戏引擎做的天空面例子(当然可以使用天空盒,天空顶)
代码如下:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6
7 core::RefPtr<core::Image> skyimage[1];
8 core::RefPtr<core::Texture> skytexture[1];
9 core::RefPtr<core::Image> terrainimage[2];
10 core::RefPtr<core::Texture> terraintexture[2];
11
12 int main(int argc, char *argv[])
13 {
14 core::Device* device = core::InitDevice("盖莫引擎场景测试");
15
16 //! 获取资源管理器
17 core::ResourceManager *resourcemanager = device->GetResourceManager();
18
19 //! 获取场景管理器
20 core::RefPtr<core::SceneManager> scenemanager = core::SceneManager::GetSceneManager();
21
22 //! 获取新的摄像机并设置为活动摄像机
23 core::RefPtr<core::Camera> camera = scenemanager->CreateCamera("mycamera",
24 Vector3f(500,20,400),
25 Vector3f(503,20,400),
26 Vector3f(0,1,0));
27
28 //! 设置当前活动摄像机
29 scenemanager->SetActiveCamera(camera);
30
31 //! 获取天空面图形和纹理
32 skyimage[0] = resourcemanager->GetImage("sky_image","..\\image//sky//top.jpg");
33 skytexture[0] = resourcemanager->GetTexture("sky_texture",skyimage[0]);
34 core::RefPtr<core::SkyPlane> skyplane = scenemanager->GetSkyPlane(32,500,900,skytexture[0]);
35 skyplane->SetRotationStep(0.03f);
36
37 //! 设置地形数据
38 terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
39 terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//terrainflat.jpg");
40 terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
41 terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
42
43 core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain("terrain1");
44 bool flag = terrain->Load("..\\terrain//terrain2.raw",1024);
45 terrain->SetStepSize(16);
46 terrain->SetTexture(terraintexture[1],terraintexture[0]);
47
48 //! 设置摄像机数据
49 camera->SetViewport(0,0,640,480);
50 camera->SetPerspective(45,640.0f/480.0f,0.1f,1000);
51
52 //! 获取输入系统指针
53 core::Input* input = device->GetInput();
54
55 //! 获取雾指针
56 core::RefPtr<core::Fog> fog = scenemanager->GetFog();
57 fog->SetColor(core::Color(0.3f,0.3f,0.2f));
58 fog->SetDensity(0.001f);
59 fog->SetQuality(0.003f);
60 fog->SetBound(0.1f,1000.0f);
61 fog->Render();
62
63 BEGIN_LOOP(device)
64 camera->SetPerspective(45,640.0f/480.0f,0.1f,1000);
65 camera->Render();
66 skyplane->Render();
67 terrain->Render();
68 END_LOOP(device)
69
70 terrain->Deinit();
71
72 device->Close();
73 device->Drop();
74
75 system("PAUSE");
76 return EXIT_SUCCESS;
77 }
78
79
贴图如下:
编译:devc++,vc2003
如果对盖莫引擎感兴趣可以通过邮件和我联系
ccsdu2009@sohu.com
代码如下:
1 #include <cstdlib>
2 #include <iostream>
3 #include <GEngine/Main.hpp>
4
5 using namespace std;
6
7 core::RefPtr<core::Image> skyimage[1];
8 core::RefPtr<core::Texture> skytexture[1];
9 core::RefPtr<core::Image> terrainimage[2];
10 core::RefPtr<core::Texture> terraintexture[2];
11
12 int main(int argc, char *argv[])
13 {
14 core::Device* device = core::InitDevice("盖莫引擎场景测试");
15
16 //! 获取资源管理器
17 core::ResourceManager *resourcemanager = device->GetResourceManager();
18
19 //! 获取场景管理器
20 core::RefPtr<core::SceneManager> scenemanager = core::SceneManager::GetSceneManager();
21
22 //! 获取新的摄像机并设置为活动摄像机
23 core::RefPtr<core::Camera> camera = scenemanager->CreateCamera("mycamera",
24 Vector3f(500,20,400),
25 Vector3f(503,20,400),
26 Vector3f(0,1,0));
27
28 //! 设置当前活动摄像机
29 scenemanager->SetActiveCamera(camera);
30
31 //! 获取天空顶图形和纹理
32 skyimage[0] = resourcemanager->GetImage("sky_image","..\\image//sky//top.jpg");
33 skytexture[0] = resourcemanager->GetTexture("sky_texture",skyimage[0]);
34 core::RefPtr<core::SkyDome> skydome = scenemanager->GetSkyDome(250,3,3,skytexture[0]);
35 skydome->SetRotationStep(0.03f);
36
37 //! 设置地形数据
38 terrainimage[0] = resourcemanager->GetImage("terrain_image","..\\terrain//terrain.bmp");
39 terrainimage[1] = resourcemanager->GetImage("terrain_detail","..\\terrain//detail.bmp");
40 terraintexture[0] = resourcemanager->GetTexture("terrain_texture1",terrainimage[0]);
41 terraintexture[1] = resourcemanager->GetTexture("terrain_texture2",terrainimage[1]);
42
43 ASSERT(terrainimage[0] || terrainimage[1]);
44 core::RefPtr<core::Terrain> terrain = scenemanager->GetTerrain("terrain1");
45 bool flag = terrain->Load("..\\terrain//terrain2.raw",1024);
46 terrain->SetStepSize(16);
47 terrain->SetTexture(terraintexture[1],terraintexture[0]);
48
49 //! 设置摄像机数据
50 camera->SetViewport(0,0,640,480);
51 camera->SetPerspective(45,640.0f/480.0f,0.1f,1000);
52
53 //! 获取输入系统指针
54 core::Input* input = device->GetInput();
55
56 //! 获取雾指针
57 core::RefPtr<core::Fog> fog = scenemanager->GetFog();
58 fog->SetColor(core::Color(0.3f,0.3f,0.2f));
59 fog->SetDensity(0.001f);
60 fog->SetQuality(0.003f);
61 fog->SetBound(0.1f,1000.0f);
62 fog->Render();
63
64 BEGIN_LOOP(device)
65 camera->SetPerspective(45,640.0f/480.0f,0.1f,1000);
66 camera->Render();
67 skydome->Render();
68 terrain->Render();
69 END_LOOP(device)
70
71 terrain->Deinit();
72
73 device->Close();
74 device->Drop();
75
76 system("PAUSE");
77 return EXIT_SUCCESS;
78 }
79
80
下面的是贴图
如果对盖莫引擎感兴趣,可通过邮件和我联系:ccsdu2009@sohu.com