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.mzph.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/一些简单的范例…