青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Cpper
C/C++高級工程師 Android高級軟件工程師 IT集成工程師 音頻工程師 熟悉c,c++,java,c#,py,js,asp等多種語言 程序猿
蓋莫游戲引擎是我設計的一個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 on 2010-02-07 12:51 ccsdu2009 閱讀(1287) 評論(3)  編輯 收藏 引用
Comments
  • # re: 蓋莫游戲引擎的Transform類設計
    ccsdu2009
    Posted @ 2010-02-07 16:48
    這個東西寫的很有問題!  回復  更多評論   
  • # re: 蓋莫游戲引擎的Transform類設計
    陳梓瀚(vczh)
    Posted @ 2010-02-07 19:49
    如果你把模型作為純數據看待就不會有這個問題了。  回復  更多評論   
  • # re: 蓋莫游戲引擎的Transform類設計
    ccsdu2009
    Posted @ 2010-02-07 20:07
    在涉及渲染的時候會有問題
    我修改了下
     1 
     2 ///////////////////////////////////////////////////////
     3 /// 定義引擎場景節點基類
     4 ///////////////////////////////////////////////////////
     5 class G_DLL_API SceneNode : public Object, public Parent<RefPtr<SceneNode> >public Renderable
     6 {
     7 public:
     8     typedef std::map<const std::string,RefPtr<SceneNode> >           SceneList;
     9     typedef std::map<const std::string,RefPtr<SceneNode> >::iterator SceneItr;
    10 public:
    11     ///////////////////////////////////////////////////////
    12     /// 構造,析構場景節點
    13     ///////////////////////////////////////////////////////     
    14     inline SceneNode(){}
    15     inline SceneNode(RefPtr<SceneNode> parent):Parent<RefPtr<SceneNode> >(parent){}
    16     inline SceneNode(const Matrix4f &matrix):world_matrix(matrix){}
    17     inline SceneNode(RefPtr<SceneNode> parent,const Matrix4f &matrix):Parent<RefPtr<SceneNode> >(parent),world_matrix(matrix){}
    18     virtual ~SceneNode();
    19 public:    
    20     ///////////////////////////////////////////////////////
    21     /// 場景渲染虛函數
    22     ///////////////////////////////////////////////////////            
    23     virtual void BeginRender();
    24     virtual void Render();
    25     virtual void AfterRender(); 
    26     
    27     ///////////////////////////////////////////////////////
    28     /// 節點操作
    29     ///////////////////////////////////////////////////////         
    30     void PushScene(RefPtr<SceneNode> child);
    31     bool PopScene(RefPtr<SceneNode> child);    
    32     void ClearAllScene();
    33     void ClearAllSceneRecursive();
    34     uint GetSceneCount(){return children.size();}
    35     RefPtr<SceneNode> GetScene(const std::string &name);
    36     
    37     ///////////////////////////////////////////////////////
    38     /// 獲取,設置場景矩陣
    39     ///////////////////////////////////////////////////////    
    40     inline Matrix4f GetWorldMatrix()const{return world_matrix;}    
    41     //!inline Matrix4f SetWorldMatrix(const Matrix4f &matrix){this->world_matrix = matrix;}
    42     inline Matrix4f GetLocalMatrix()const{return local_matrix;}    
    43     //!inline Matrix4f SetLocalMatrix(const Matrix4f &matrix){this->local_matrix = matrix;}
    44     
    45     ///////////////////////////////////////////////////////
    46     /// 場景平移,縮放,旋轉(子場景矩陣也會發生變化)
    47     ///////////////////////////////////////////////////////    
    48     void Translate(const Vector3f &offset); 
    49     void Scale(const Vector3f &scale); 
    50     void Rotate(float angle, float x, float y, float z);     
    51     
    52     ///////////////////////////////////////////////////////
    53     /// 獲取,設置場景盒子,球
    54     ///////////////////////////////////////////////////////    
    55     inline Box     GetSceneBox()const{return box;}
    56     inline void    SetSceneBox(const Box &box){this->box = box;}
    57     inline Spheref GetSceneSphere()const{return shpere;}
    58     inline void    SetSceneSphere(const Spheref &sphere){this->shpere = sphere;}    
    59 protected:
    60     SceneList     children;
    61     Matrix4f      world_matrix;
    62     Matrix4f      local_matrix; 
    63     Box           box;
    64     Spheref       shpere;    
    65     
    66     DECLARE_OBJECT(SceneNode);
    67 };
    68  
    如下:
    使用std::map來存儲場景
    當然不存在重復名字的場景是最基本的前體
      回復  更多評論   

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久噜久噜久久综合| 一本色道久久精品| 欧美激情视频一区二区三区在线播放| 亚洲欧美日韩国产成人精品影院| 亚洲亚洲精品在线观看| 亚洲精品一区二区三区99| 亚洲肉体裸体xxxx137| 久久亚洲精品一区| 免费日韩av片| 日韩视频在线观看免费| 亚洲深夜福利网站| 久久狠狠婷婷| 欧美电影在线观看完整版| 欧美日韩午夜剧场| 国产精品一区二区三区四区五区 | 欧美三区视频| 国产一区二区0| 亚洲人午夜精品免费| 一区二区三区四区五区视频| 午夜日韩电影| 欧美激情在线播放| 亚洲欧美999| 欧美大片一区二区三区| 欧美视频三区在线播放| 一区二区三区在线观看国产| 亚洲精品一区在线观看| 欧美亚洲一区二区在线观看| 免费一级欧美片在线播放| av成人毛片| 另类专区欧美制服同性| 国产精品视频九色porn| 亚洲精品社区| 久久综合久久久久88| 亚洲午夜国产成人av电影男同| 久久综合免费视频影院| 国产视频在线观看一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 免费在线观看一区二区| 在线视频亚洲| 欧美精品在线一区二区| 亚洲国产精品成人| 久久久久久久一区二区三区| 一区二区三区av| 欧美激情精品久久久久久免费印度 | 中文欧美日韩| 欧美福利在线| 欧美一级日韩一级| 国产精品久久久久aaaa| 日韩一级黄色大片| 亚洲电影免费观看高清| 久久麻豆一区二区| 国产亚洲精品7777| 欧美一级二区| 亚洲一区二区三区色| 欧美人与性动交a欧美精品| 在线精品视频一区二区三四| 久久久人成影片一区二区三区观看| 中文在线一区| 国产精品美女久久| 欧美一级日韩一级| 午夜精品久久久久久久蜜桃app| 国产精品成人aaaaa网站| 中文国产亚洲喷潮| 亚洲欧美日本视频在线观看| 国产乱码精品一区二区三区五月婷 | 欧美α欧美αv大片| 久久精品盗摄| 在线观看视频欧美| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久www成人免费毛片麻豆| 国模精品一区二区三区| 蜜臀a∨国产成人精品| 欧美成人免费va影院高清| 亚洲精品影视| 亚洲另类在线一区| 国产精品亚洲精品| 久久久另类综合| 老**午夜毛片一区二区三区| 亚洲区一区二| 99re66热这里只有精品3直播| 欧美日韩午夜视频在线观看| 亚洲一区二区三区四区在线观看| 亚洲最新色图| 国产综合色在线| 亚洲第一福利社区| 国产精品久久久久久影院8一贰佰| 欧美在线|欧美| 久久亚洲国产精品一区二区| 亚洲精品视频中文字幕| 亚洲午夜国产成人av电影男同| 国语自产在线不卡| 亚洲精品日韩综合观看成人91| 国产精品国产三级国产普通话三级| 欧美一区二区三区精品| 老司机午夜精品视频| 亚洲一二三四久久| 欧美日韩一区二区三区在线观看免| 国产酒店精品激情| 久久人人超碰| 欧美日韩日韩| 久久婷婷国产麻豆91天堂| 欧美精品18videos性欧美| 欧美亚洲一区二区在线观看| 蜜桃久久av一区| 午夜影视日本亚洲欧洲精品| 另类专区欧美制服同性| 欧美亚洲一区| 欧美日韩免费在线观看| 久久综合九色九九| 国产精品成人久久久久| 亚洲国产精品久久精品怡红院| 国产精品久久久一本精品| 欧美刺激午夜性久久久久久久| 国产精品福利在线观看网址| 欧美aaaaaaaa牛牛影院| 欧美亚洲第一区| 亚洲福利av| 伊人久久成人| 欧美一区二区三区免费在线看| 99热这里只有精品8| 久久婷婷影院| 久久免费国产| 国产亚洲欧洲一区高清在线观看 | 性做久久久久久| 亚洲一区二区在线看| 麻豆成人综合网| 久久久夜精品| 国产亚洲综合精品| 午夜精品亚洲| 欧美夜福利tv在线| 国产毛片精品国产一区二区三区| 亚洲第一毛片| 亚洲国产成人在线播放| 久久久福利视频| 久久综合九色99| 在线精品福利| 六月天综合网| 欧美成人一区二区三区在线观看 | 久久久九九九九| 久久精品国产久精国产思思| 国产精品自在欧美一区| 亚洲一区二区成人| 欧美一区二区免费| 国产日韩精品视频一区二区三区| 亚洲一区在线免费| 久久精品二区| 精品成人国产在线观看男人呻吟| 午夜在线一区| 老司机精品导航| 亚洲福利国产| 欧美激情日韩| 亚洲一区二区三区视频播放| 久久不见久久见免费视频1| 国产一区二区三区在线观看精品 | 香港久久久电影| 理论片一区二区在线| 欧美国产一区二区| 一本久道久久综合中文字幕| 欧美视频在线免费看| 亚洲一区3d动漫同人无遮挡| 久久精品国产一区二区三| 在线观看福利一区| 欧美日韩蜜桃| 西西人体一区二区| 欧美黑人多人双交| 亚洲欧美日韩国产中文| 国产一区清纯| 欧美乱妇高清无乱码| 亚洲欧美中日韩| 亚洲国产精品久久久久久女王| 亚洲自拍偷拍一区| 激情亚洲一区二区三区四区| 欧美激情精品久久久久| 亚洲一区三区电影在线观看| 欧美夫妇交换俱乐部在线观看| 一区二区欧美在线观看| 国产丝袜一区二区| 欧美精品久久久久久久| 欧美亚洲视频一区二区| 亚洲人成网站精品片在线观看| 欧美一区二粉嫩精品国产一线天| 尤物99国产成人精品视频| 欧美日韩一二三区| 久久一区二区三区四区五区| 9国产精品视频| 欧美成人国产va精品日本一级| 亚洲无限乱码一二三四麻| 在线观看日韩精品| 国产日韩欧美在线| 国产精品mv在线观看| 女仆av观看一区| 久久精品青青大伊人av| 亚洲视频在线视频| 亚洲国产视频直播| 久久综合电影| 欧美在线观看视频| 亚洲欧美日韩综合| 中文无字幕一区二区三区| 亚洲精品国产精品乱码不99按摩| 国内精品久久久|