Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿

考虑到在应用中有好几个坐标系统比如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坐标系统
posted @ 2010-02-08 21:12 ccsdu2009 阅读(983) | 评论 (1)编辑 收藏
 
     摘要: 这是盖莫游戏引擎的音频测试代码具体如下:  1#include <cstdlib> 2#include <iostream> 3#include <GEngine/Main.hpp> 4using namespace std; 5 6const&nbs...  阅读全文
posted @ 2010-02-08 13:25 ccsdu2009 阅读(1153) | 评论 (2)编辑 收藏
 
盖莫游戏引擎是我设计的一个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)
posted @ 2010-02-07 12:51 ccsdu2009 阅读(1256) | 评论 (3)编辑 收藏
 
通常的单态实现大都市如下的形式:
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 };
采用双模板参数的手法
这样做的一个好处就是可以通过特定的环境来使用合适的单态版本




posted @ 2010-02-05 20:30 ccsdu2009 阅读(1636) | 评论 (3)编辑 收藏
 
     摘要: matrix22实现如下:   1   2 ////////////////////////////////////////////////////////////  3 ///定义2*2矩阵模板类  4 ////////////////////////////////////...  阅读全文
posted @ 2010-02-05 13:26 ccsdu2009 阅读(1329) | 评论 (2)编辑 收藏
 
代码如下:
 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~

posted @ 2010-02-05 11:43 ccsdu2009 阅读(221) | 评论 (0)编辑 收藏
 

使用盖莫游戏引擎做的天空面例子(当然可以使用天空盒,天空顶)
代码如下:

 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
posted @ 2010-02-05 11:33 ccsdu2009 阅读(328) | 评论 (3)编辑 收藏
 

代码如下:

 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

posted @ 2010-02-05 09:45 ccsdu2009 阅读(224) | 评论 (0)编辑 收藏
仅列出标题
共38页: First 30 31 32 33 34 35 36 37 38