转自:http://blog.csdn.net/yanonsoftware/article/details/1067265

既然前面分析Mesh(Entity,SceneNode)的渲染时已经看到了OctreeSceneManager,那么现在正是分析一下它了。所谓SceneManager,我想处理“空间分割”和“可见性判断”是两个主要的任务,后者已经打过一点交道了,是通过下面这个函数完成的:
 virtual void _findVisibleObjects ( Camera * cam, bool onlyShadowCasters );
下面主要就要搞清楚这个函数是如何工作的,以及空间分割是如何实现、管理的。
 OctreeSceneManager并不在OgreMain工程中,而是作为一个Plugin,在Plugin_OctreeSceneManager工程中。这个工程中有一个类是关于Terrain的,暂时先不看。Octree相关的类有:
1. Octree
使用loose octree;
mBox存储包裹盒,mChildren[2][2][2]用来存所有子节点的指针,mNodes用来存报错本octant所管理的SceneNode,mNumNodes本octant以及所有子节点一共包含多少个SceneNode,mParent指向父节点;
_addNode(),_removeNode()把一个SceneNode从本Octant添加、删除,它并不执行空间分割相关操作;
_getChildIndexes(),_isTwiceSize()是Octree分割相关的两个函数。
2. OctreeCamera
多了一个getVisibility()方法,除了可能返回不可见,完全可见,还可能返回部分可见。
3. OctreeNode (从SceneNode派生)
mLocalAABB包裹盒;mOctant指向属于那个Octant
void _updateBounds( void );如果SceneNode的Bounding vol改变,需要相应的更新Octree,把它移动到正确的Octant中;它只计算自己所包含的Object的包裹盒,并不包含子SceneNode。
4. OctreeSceneManager
mOctree保存八叉树的根节点;
walkOctree()递归的遍历整个Octree,对于完全可见或者部分可见的octant,将其中的SceneNode加入到RenderQueue(OctreeNode::_addToRenderQueue());
Octree的根节点在OctreeSceneManager::init()中建立,子节点的建立:
    OctreeSceneManager::_updateSceneGraph();
    SceneManager::m_scene->Update() --(SceneNode::_update)
    OctreeSceneManager::_updateOctreeNode()
    OctreeSceneManager::_addOctreeNode()
    在这个函数中会new Octree,并且加到合适的Octant中。

SceneQuery用来执行对SceneManager的某种查询,例如RaySceneQuery。OctreeSceneManager重写父类的虚函数createRayQuery()以生成其派生类OctreeRaySceneQuery的实例,这个类在execute时调用OctreeSceneManager:: findNodesIn(),然后递归的遍历Octree,以完成查询。

Ogre中OctreeSceneManager的更多相关文章

  1. 在Ogre中加载自己的资源包

    转自:http://www.cnblogs.com/minggoddess/archive/2011/02/19/1958472.html 由于数据保护的需要,一款游戏一般都会有自己独有的资源包,这样 ...

  2. OGRE中Any 类型的实现

    [OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...

  3. Axiom3D:Ogre中Mesh网格分解成点线面。

    这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...

  4. Ogre 中使用OIS的两种模式

    关于OIS的输入 要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题.先把OIS的输入简单回忆一下. OIS有两种输入模式:非缓冲输入以及缓冲输入. 无论用哪种输入方式,都应该有 ...

  5. Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算

    Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = ...

  6. Ogre中TerrainSceneManager

    转自:http://blog.csdn.net/yanonsoftware/article/details/1103665 TerrainSceneManager是一个OctreeSceneManag ...

  7. Ogre中Mesh的加载过程详述

    转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...

  8. Axiom3D:Ogre中Mesh文件格式分析(一)

    在Axiom3D,或者说是Ogre的mesh的文件格式我们可能通过代码反推出相关格式,相关过程本来我是直接写的,后面发现相关流程写完后,我自己都看晕了,然后我就把一些过程用Execl整理出来,发现过程 ...

  9. Ogre中OIS的输入的使用

    OIS的使用有两种模式:缓冲模式和非缓冲模式.非缓冲方式能处理鼠标或键盘长按的事件,实时性强缓冲方式则不能长按事件,用于非实时响应. 非缓冲输入:1.创建方式:其中 false 参数代表使用非缓冲模式 ...

随机推荐

  1. VC++NMAKE

    目录 第1章 NMAKE    1 1.1 运行NMAKE    1 1.1.1 NMAKE的实质    2 1.2 描述块    3 1.2.1 定义    3 1.2.2 多个描述块    3 1 ...

  2. requestAnimationFrame在Chrome里的实现

    requestAnimationFrame是HTML5游戏和动画必不可少的函数,相对于setTimeout或setInterval它有两个优势,一是它注册的回调函数与浏览器的渲染同步,不用担心Time ...

  3. mixamo fuse三维角色制作

    软件下载: http://www.cgtsj.com/cg/yj/1302/index.html 资源名称: Mixamo Fuse三维角色制作软件V1.3版 本站编号:  YJ1302 百度网盘:下 ...

  4. jmeter 实时搜索结果

    因为JMeter 2.13你可以得到实时搜索结果发送到后端通过 后端侦听器 使用潜在的任何后端(JDBC.JMS网络服务,€Š) 通过提供一个实现类 AbstractBackendListenerCl ...

  5. python 练习 26

    Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. br ...

  6. ArcMap中"开始编辑"遇到一个或多个带有警告的图层“如果继续,可能无法编辑某些图层”的警告框

    开始编辑后可能出现的错误: 如果 ArcMap 在所选数据上启动编辑会话时遇到问题,将弹出一个对话框以提供附加信息.您可能会收到错误.警告或信息消息. 出现错误  时用户不可以启动任何编辑会话.只有解 ...

  7. css -- 题目汇总

    1.描述下浮动和它的工作原理.模块浮动,使其脱离文档流,并且生成一个块级框.(所以父级撑不开就得到了很好的解释) 2.清除浮动的方法有那些,分别适用于什么情形.clear  ,  父级元素overfl ...

  8. poj---(2886)Who Gets the Most Candies?(线段树+数论)

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 10373   Acc ...

  9. hdu---(1421)搬寝室(dp)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. 原生JavaScript实现mouseenter

    mouseenter和Mouseleave都是jquery的事件,JavaScript的mouseover和mouseout每个子元素都会触发,从子元素移到父元素也会触发,用起来不很方便,而且触发的太 ...