gaia引擎分析(二)場景管理

只是粗略的分析原理,大蝦輕噴~~

Gaia引擎中沒有場景管理器(scenemanager)這種東西,但是并不是沒有場景管理,而是在cGameHost類中有一課場景樹進行場景組織、一棵四叉樹用來進行剪裁。

class cGameHost
class cGameHost : public CD3DApplication, public cSingleton<cGameHost>
{
。。。。。。
cSceneNode m_rootNode;//場景樹根節點
cCamera m_defaultCamera;
cCamera* m_pActiveCamera;
cQuadTree m_quadTree;//四叉樹
cRect3d m_worldExtents;

tchar m_rootPath[MAX_PATH];

bool m_frameReady;

// Invalid Functions...
cGameHost(const cGameHost& Src);
cGameHost& operator=(const cGameHost& Src);
};

cSceneNode類:場景節點,可形成樹狀結構組織場景,形成一種空間變換的層次結構。

?

?cSceneObject類:渲染基石,繼承自cSceneNode,所有可渲染對象都繼承自cSceneObject,可掛接在四叉樹節點上。

class cSceneObject
class cSceneObject : public cSceneNode
{
。。。。。。
void attachToQuadTree(cQuadTree* parentTree);//掛接到四叉樹


cQuadTreeNode* quadTreeNode()const;
u32Flags zMask()const;
cSceneObject* forwardTreeLink()const;
cSceneObject* rearTreeLink()const;

const cRect3d& localBounds()const;
const cRect3d& worldBounds()const;

//
// temporary functions
//
void setWorldBounds(const cRect3d& box)
{
m_worldBounds = box;
}


private:

// bounding box information
u32Flags m_objectFlags;
cRect3d m_localBounds;
cRect3d m_worldBounds;

// world QuadTree membership information
cQuadTree* m_pQuadTree;
cQuadTreeNode* m_pQuadTreeNode;
u32Flags m_quadTreeZMask;
cSceneObject* m_pForwardTreeLink;
cSceneObject* m_pRearTreeLink;

// QuadTree search result links
cSceneObject* m_pForwardSearchLink;
cSceneObject* m_pRearSearchLink;

// private functions
void setForwardSearchLink(cSceneObject* pForwardLink);
void setRearSearchLink(cSceneObject* pForwardLink);
virtual void refreshQuadTreeMembership();

friend cQuadTreeNode;
void setQuadTreeData(cQuadTreeNode* parentNode, u32Flags zMask);
void setForwardTreeLink(cSceneObject* link);
void setRearTreeLink(cSceneObject* link);
};

?

cQuadTree:四叉樹,用于剪裁掉不可見的物體,提高渲染效率

class cQuadTree
class cQuadTree
{
public:

// Data Types & Constants...
enum eConstants
{
k_minimumTreeDepth = 1,
k_maximumTreeDepth = 9, // must be a value between 1 and 9
};


// Public Data...

// Creators...

cQuadTree();
~cQuadTree();

void create(const cRect3d& worldExtents, int depth);
void destroy();

// Operators...

// Mutators...
cSceneObject* buildSearchResults(
const cRect3d& worldRect,
const cFrustum* pOptionalFrustum=0); //四叉樹搜索,即剪裁,可以選用視錐體和包圍盒
u32Flags addOrUpdateSceneObject(cSceneObject* newNode);

// Accessors...
bool isReady()const;

private:

// Private Data...
cQuadTreeNode* m_levelNodes[k_maximumTreeDepth];//四叉樹節點2維數組
cVector3 m_worldExtents;
cVector3 m_worldScale;
cVector3 m_worldOffset;
int m_depth;
uint32 m_memorySize;

// Private Functions...
void findTreeNodeInfo(const cQuadTreeRect& worldByteRect, int& level, int& levelX, int& levelY);
cQuadTreeNode* findTreeNode(const cQuadTreeRect& worldByteRect);
cQuadTreeNode* getNodeFromLevelXY(int level, int x, int y);
void buildByteRect(const cRect3d& worldRect, cQuadTreeRect& worldByteRect);
};

cQuadTreeNode:四叉樹節點,上面可以掛接cSceneObject

class cQuadTreeNode
class cQuadTreeNode
{
public:


cQuadTreeNode();
~cQuadTreeNode();

uint32 addOrUpdateMember(cSceneObject* member, const cQuadTreeRect& rect);
void removeMember(cSceneObject* member);

void testLocalMembersForSearchResults(
cSceneObject** pResultList,
cSceneObject** pResultListTail,
u32Flags zMask,
float zMin,
float zMax,
const cFrustum* pOptionalFrustum=0);

void testLocalMembersForSearchResults(
cSceneObject** pResultList,
cSceneObject** pResultListTail,
u32Flags zMask,
const cRect3d& trueRect,
const cFrustum* pOptionalFrustum=0);

bool empty()const;
u32Flags zMask()const;
u32Flags zLocalMask()const;

private:

// Private Data...
cQuadTreeNode* m_pChildNode[4];//子節點
cQuadTreeNode* m_pParentNode;
cSceneObject* m_pFirstMember;//掛接的cSceneObject列表

u32Flags m_zLocalMask;
u32Flags m_zMask;

// Private Functions...
void descendantMemberAdded(u32Flags zMask);
void descendantMemberRemoved();
void rebuildLocalZMask();
void rebuildZMask();


// functions available to the quad tree
friend cQuadTree;
void setup(cQuadTreeNode* parent, cQuadTreeNode* child0, cQuadTreeNode* child1, cQuadTreeNode* child2, cQuadTreeNode* child3);//在四叉樹上配置節點
};

?



?UML:

由于我的uml建模工具貌似不支持自身關聯所以樹的結構就畫不出來了,腦補吧。。嘿嘿

?總結:

gaia的場景管理當中有兩棵樹:

一棵是場景樹,用來組織場景中物體的空間邏輯關系,即子節點依附在父節點上,在父節點的坐標系中活動,有點像骨骼動畫的原理。

一棵是四叉樹,用于剪裁。gaia中為了簡單,使用的是滿四叉樹。這些節點就是上面說過的cQuadTreeNode,四叉樹節點。

游戲中的cSceneObject根據自身的位置和包圍盒大小被放置到這棵四叉樹合適的四叉樹節點上。需要渲染時根據輸入的視錐體或者包圍盒遍歷整棵樹,將在包圍盒或視錐體中的cSceneObject形成一個列表發送到渲染隊列,這樣就實現了裁剪。

轉載于:https://www.cnblogs.com/wonderKK/archive/2012/03/07/2382919.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260942.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ajax登錄非空判斷,email ajax傳輸數據去重和非空判斷(示例代碼)

前臺&#xff1a;ajax:$(document).ready(function(){$("#email").blur(function(){$("#email").css("background-color","#D6D6FF");$.ajax({type:"post",url:"check_email.do",data:{‘email‘:$("#email&…

某些專題頁面內容很好,但很長時間都不被及時收錄的可能原因之一

專題未被百度及時收錄的問題&#xff0c;經檢查驗證后發現就是因為頁面未建成就放置在線上&#xff0c;并返回404狀態碼&#xff0c;被百度當成死鏈刪除&#xff0c;造成收錄和流量損失。轉載于:https://www.cnblogs.com/adu0409/p/3499350.html

C++.Templates學習總結歸納1

函數模板 首先我們來看看函數模板&#xff0c;一個函數模板&#xff08;function template&#xff09;代表一族函數&#xff0c;其表現和一般的函數一樣&#xff0c;只是其中的某些元素在編寫的時候還不知道&#xff0c;也就是說這些還不知道的元素&#xff0c;我們將其參數化…

選擇更安全的方式執行你的puppet更新

選擇更安全的方式執行你的puppet更新生產環境中&#xff0c;puppet的更新有需要節點自動更新的&#xff0c;有需要通過puppetmaster推送更新的&#xff0c;還有需要節點更新時間離散的。下面講解三種更新方式2.7 Puppet更新方式2.7.1 節點定時更新[rootagent1 ~]# vim /etc/pup…

c ajax定時獲取,ajax的定時調用每5秒調用一次

這篇文章主要介紹了關于ajax的定時調用&#xff0c;本例為每5秒調用一次&#xff0c;大家可以根據自己的需求更改代碼如下:function initXMLRequest(){if (window.ActiveXObject) {xmlRequest new ActiveXObject("Microsoft.XMLHTTP");} else {if (window.XMLHttpRe…

[C++]有關深復制與copy constructor的一些問題與實例

紙上得來終覺淺&#xff0c;絕知此事要躬行 --- 今天對此話有了實際的領悟。之前學習C的時候&#xff0c;自以為已經把深復制和復制構造函數等這些知識已經掌握了&#xff0c;但真正寫起項目來的時候&#xff0c;還是不能提前考慮這些問題&#xff0c;直到問題出現&#xff0c;…

Xml Tips

Xml Tips//z 2012-3-7 16:43:47 PM IS2120CSDN1. xml 中的注釋<!-- 這是注釋 -->并非用于 XML 分析器的內容&#xff08;例如與文檔結構或編輯有關的說明&#xff09;可以包含在注釋中。注釋以 <!-- 開頭&#xff0c;以 --> 結尾&#xff0c;例如<!--catalog la…

算法復雜度為O(N) 的排序算法

題目&#xff1a;某公司有幾萬名員工&#xff0c;請完成一個時間復雜度為O(n)的算法對該公司員工的年齡作排序&#xff0c;可使用O(1)的輔助空間。分析&#xff1a;排序是面試時經常被提及的一類題目&#xff0c;我們也熟悉其中很多種算法&#xff0c;諸如插入排序、歸并排序、…

OpenJudge計算概論-字符串排序

/* 字符串排序 總時間限制: 1000ms 內存限制: 65536kB 描述 參考整數排序方法&#xff0c;設計一種為字符串排序的算法&#xff0c;將字符串從小到大輸出 輸入 第一行為測試數據組數t, 后面跟著t組數據。每組數據第一行是n&#xff0c;表示這組數據有n行字符串&#xff0c;接下…

Window7+vs2008+QT環境搭建

記錄下自己是如何搭建QT開發環境的&#xff0c;備忘吧。操作系統&#xff1a;win7&#xff0c;其實winXP&#xff0c;win7都沒有關系&#xff1b;我使用的機器安裝的操作系統是win7&#xff1b;開發環境是VS&#xff0c;使用2005,2008,2010或者即將發布的2011都行&#xff1b;因…

history命令

1. 歷史命令不會無休止的保存下去&#xff0c;默認的最大保存量為1000條輸入&#xff1a;echo $HISTSIZE1000條從profile文件中定義的&#xff0c;可以在里面修改保存數量。/etc/profile用于整個系統所有用戶&#xff0c; ~/.bash_profile, ~/.profile和~/.bashrc 用于各個用戶…

Javascript創建對象的幾種方式?

javascript 中常見的創建對象的幾種方式&#xff1a; 1. 使用Object構造函數創建&#xff1b; 使用Object構造函數來創建一個對象&#xff0c;下面代碼創建了一個person對象&#xff0c;并用兩種方式打印出了Name的屬性值。 var person new Object(); person.name"kevin&…

使用DIV之后 table何去何從

表格并非雞肋 相反是一道大餐 XHTML標準中的一些元素分為三大類&#xff1a; 輔助布局設計元素&#xff1a;DIV SPAN 這類元素的主要功能是用來布局整個頁面的&#xff0c;靈活使用這些元素的各種屬性&#xff0c;可以讓你的頁面表現豐富多彩。結構化元素或信息元素&#xff1…

使用 RMAN 同步數據庫

使用 RMAN 同步數據庫使用 RMAN 同步數據庫一&#xff0e;概述二 操作步驟(一)&#xff0e;把生產庫置為歸檔模式(二).啟動rman做數據庫0級備份(三)&#xff0e;修改生產庫數據庫到未歸檔(四)&#xff0e;拷貝備份集到測試庫(五).在測試庫上的操作一&#xff0e;概述 因項目組遇…

解決 用戶'sa'登錄失敗。錯誤:18456 問題

問題描述&#xff1a;用戶sa登錄失敗。錯誤:18456 產生原因&#xff1a;由于服務器身份驗證模式為‘Windows 身份驗證模式’&#xff0c;所以導致登錄失敗 解決方案&#xff1a; 1.使用‘Windows 身份驗證模式’登錄服務器 2.打開‘對象資源管理器’&#xff0c;右鍵根節點…

js實現圖片上傳預覽及進度條

js實現圖片上傳預覽及進度條 原文js實現圖片上傳預覽及進度條 最近在做圖片上傳的時候&#xff0c;由于產品設計的比較fashion&#xff0c;上網找了比較久還沒有現成的&#xff0c;因此自己做了一個&#xff0c;實現的功能如下&#xff1a; 1&#xff1a;去除瀏覽器<input …

webapi文檔描述-swagger

最近做的項目使用mvcwebapi&#xff0c;采取前后端分離的方式&#xff0c;后臺提供API接口給前端開發人員。這個過程中遇到一個問題后臺開發人員怎么提供接口說明文檔給前端開發人員,最初打算使用word文檔方式進行交流&#xff0c;實際操作中卻很少動手去寫。為了解決這個問題&…

《推薦系統實踐》樣章:如何利用用戶標簽數據

《推薦系統實踐》樣章&#xff1a;如何利用用戶標簽數據 推薦系統的目的是聯系用戶的興趣和物品&#xff0c;這種聯系需要依賴于不同的媒介。GroupLens在文章1中認為目前流行的推薦系統基本上通過三種方式來聯系用戶興趣和物品。如圖1所示&#xff0c;第一種方式是通過用戶喜歡…

應用程序創建自己的奔潰轉儲(crash dump)文件

1、注冊自定義的UnhandledExceptionFilter&#xff0c;C/C Runtime Library下需要注意自定義handler被移除&#xff08;hook kernel32.dll的SetUnhandledExceptionFilter使它返回一個空指針即可&#xff09;。 PTOP_LEVEL_EXCEPTION_FILTER v_prevUnhandledExceptionFilter;…

jqMobi + Android 試手

忙活的一個晚上&#xff0c;搞定了一個界面&#xff0c;主要在滾動條和風格上花了不少時間&#xff0c;jqMobi的文檔真的少的可憐&#xff0c;希望文檔可以多點&#xff0c;以下是幾份參考資料&#xff1a; 最新的Api參考&#xff1a;http://www.shareach.com/jq/一些簡單的范例…