Ogre中OctreeSceneManager
转自: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的更多相关文章
- 在Ogre中加载自己的资源包
转自:http://www.cnblogs.com/minggoddess/archive/2011/02/19/1958472.html 由于数据保护的需要,一款游戏一般都会有自己独有的资源包,这样 ...
- OGRE中Any 类型的实现
[OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...
- Axiom3D:Ogre中Mesh网格分解成点线面。
这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...
- Ogre 中使用OIS的两种模式
关于OIS的输入 要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题.先把OIS的输入简单回忆一下. OIS有两种输入模式:非缓冲输入以及缓冲输入. 无论用哪种输入方式,都应该有 ...
- Ogre代码学习之1——Ogre中地形lod的基础:deltaHeight的计算
Ogre的地形系统中的重要概念:高度差,英文HeightDeltas,表示某个完整细节中的顶点,在某个它被隐去的lod中被插值之后的高度和原始高度(即高度图中的高度)之差. DeltaHeight = ...
- Ogre中TerrainSceneManager
转自:http://blog.csdn.net/yanonsoftware/article/details/1103665 TerrainSceneManager是一个OctreeSceneManag ...
- Ogre中Mesh的加载过程详述
转自:http://blog.csdn.net/yanonsoftware/article/details/1031891 如果新开始写一个3D渲染引擎,Mesh应该是一个很好的切入点.当一个看似简单 ...
- Axiom3D:Ogre中Mesh文件格式分析(一)
在Axiom3D,或者说是Ogre的mesh的文件格式我们可能通过代码反推出相关格式,相关过程本来我是直接写的,后面发现相关流程写完后,我自己都看晕了,然后我就把一些过程用Execl整理出来,发现过程 ...
- Ogre中OIS的输入的使用
OIS的使用有两种模式:缓冲模式和非缓冲模式.非缓冲方式能处理鼠标或键盘长按的事件,实时性强缓冲方式则不能长按事件,用于非实时响应. 非缓冲输入:1.创建方式:其中 false 参数代表使用非缓冲模式 ...
随机推荐
- VC++时间函数总结
目录 第1章基本概念 1 1.1 基本概念 1 1.2 时间表示法 2 第2章 Win32 API 3 2.1 获取 3 2.1.1 时间间隔 3 2.1.2 时刻 ...
- robotframework笔记18
测试执行 如何创建测试套件结构解析 执行测试数据,如何继续执行一个测试用例失败后, 以及如何优雅地停止整个测试执行. 执行流 执行测试套件和 总是在一个测试套件执行测试用例. 一个测试套件 创建从一个 ...
- Spring Boot 环境变量读取 和 属性对象的绑定
网上看到的一些方法,结合我看到的 和我们现在使用的.整理成此文: 第一种方法 参见catoop的博客之 Spring Boot 环境变量读取 和 属性对象的绑定(尊重原创) 第二种方法 class不用 ...
- poj----(1470)Closest Common Ancestors(LCA)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 15446 Accept ...
- Play framework logging设置
play的logger是基于Log4j,Play 2.0 uses logback as its logging engine. 一.配置 1. 在conf/application.conf中设置lo ...
- extjs 控件属性
1.textfield labelSeparator :'' 这个属性当fieldLabel有值得时候,默认会加上一个分号,这个属性就是控制那个的... 2.numberfield decimal ...
- FaceBook Twitter实习生简历求内推
写在博客里面吧. 有一个朋友,男,博士在读,研究方向为图像处理,计算机视觉相关. 想在在读期间有一些海外实习经历.不知道哪位博友,有相关的人脉,求内推啊.内推成功的话请吃大餐,哈哈!
- [转]C#设置WinForm快捷键
1.Alt+*(按钮快捷键)按钮快捷键也为最常用快捷键,其设置也故为简单.在大家给button.label.menuStrip等其他控件的Text属性指定名称时,在其后面加上‘&’然后在加上一 ...
- JS对象的写法
写法1: <script> var database = function () { function add(){ console.info("add"); } fu ...
- JavaOne 2016——观众得以一睹JShell的威力
导读 在JavaOne 2016的主题演讲中,Java平台组的首席架构师Mark Reinhold指出Java 9并不仅仅是Jigsaw,针对Java 9,一共包含了85个JEP.我在这里会关注一个他 ...