只是粗略的分析原理,大虾轻喷~~

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形成一个列表发送到渲染队列,这样就实现了裁剪。

gaia引擎分析(二)场景管理相关推荐

  1. gaia引擎分析(一)资源管理

    最近在看<Real Time 3D Terrain Engines Using C++And DirectX 9>,不过是看网上翻译的版本叫<实时地形引擎>,看英文实在蛋疼,还 ...

  2. 3D游戏引擎入门课程——场景管理

    目录 写在前面 场景管理 场景管理概述与BVH 场景组织结构:场景树,八叉树和BSP树 场景树 八叉树 BSP树 场景管理实例 OGRE场景管理 OSG场景管理 Panda3D场景管理 写在前面 本专 ...

  3. 游戏场景管理(二)视锥体剔除

    在学习场景管理之前,我们要先学习一下视锥体剔除(VFC),因为无论你使用什么空间划分算法,划分的空间都要进行视锥体剔除,被剔除的空间内部的所有物件都会被抛弃以此来加速渲染或碰撞.这也是场景管理的核心目 ...

  4. 那些主流的游戏引擎分析(页游 、端游 、手游)

    一.介绍 游戏引擎就是指一些已编写好的可编辑电脑游戏系统或者一些互交式实时图像应用程序的核心组件.而这些系统为游戏设计者提供各种编写游戏所需的各种工具,让游戏设计者能容易和快速地做出游戏程序而不用由零 ...

  5. BSP场景管理方法简介

    BSP(Binary Space Partition,二叉空间分割)方法,在大型3d游戏场景管理方面,可以认为是已经证明了的,最成熟的,最经得起考验的场景管理方法.诸如虚幻系列引擎(Unreal 1, ...

  6. RocketMQ4.0源码分析之-路由管理

    RocketMQ4.0源码分析之-路由管理 一 前言 路由管理功能是RocketMQ的核心功能之一,涵盖了订阅管理,连接管理,负载均衡管理等一系列功能,代码布在NameServer,Broker,Pr ...

  7. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  8. 3D游戏场景管理概述

    参考文章 http://www.cnblogs.com/kex1n/archive/2012/08/26/2657054.html 关于场景管理概述 http://www.cnblogs.com/wa ...

  9. 腾讯手Q webview技术owner厉心刚:JavaScript引擎分析

    声明:本文来自腾讯增值产品部官方公众号小时光茶社,为CSDN原创投稿,未经许可,禁止任何形式的转载. 作者:厉心刚,SNG 增值产品部终端开发,高级工程师:参与多个项目开发(QQ情侣,手Q,阅读,电竞 ...

最新文章

  1. Linux下进程间通信-------管道通信
  2. Centos 上部署jeecms注意1
  3. node-sass -v 不是内部_奔驰v260领航版的缺点奔驰v级和威霆区别
  4. 初等数论--整除--两数乘积保持整除性
  5. 看看50万码农怎么评论:为什么程序员工资那么高但很少有人炫富?
  6. php mysql 查询 区分大小写_MySQL查询字符串时区分大小写
  7. OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)...
  8. c语言1234为什么不是常量,C语言学习1
  9. 移动应用程序框架Kendo UI Mobile发布R2 2016 SP2
  10. Varnish的vcl子程序
  11. python有哪些好的学习资料或者博客
  12. python爬虫股票数据分析判断股票好坏_教你用Python爬虫股票评论,简单分析股民用户情绪...
  13. Linux基础实操二
  14. linux下c语言编程实例
  15. 网络安全应急响应-恶意代码分析技术
  16. 集装箱号码识别技术在港口的应用
  17. Visal.B来袭,新近出现的恶意软件
  18. window 删除文件报错显示被程序占用 强制删除被占用的文件
  19. android studio 雷电模拟器
  20. 软件测试前景怎么样?大概要学什么?

热门文章

  1. 定时备份_如何将电脑中的文件进行定时备份?
  2. 虚幻gameframe_【虚幻4】从0开始的Galgame开发框架(2)--MainManager
  3. hdu1914 稳定婚姻问题
  4. 【RecyclerView】 四、RecyclerView 布局 ( 网格局管理器 GridLayoutManager )
  5. 【计算机网络】数据链路层 : 概述 ( 基本概念 | 功能 | 为 “网络层“ 提供的服务 )
  6. Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
  7. JAVA基础——Switch条件语句
  8. 多校1010 Taotao Picks Apples
  9. vue java 使用AES 前后端加密解密
  10. VMware中Red Hat Enterprise Linux 7 配置桥接模式局域网