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 参数代表使用非缓冲模式 ...
随机推荐
- virutalbox虚拟机硬盘扩容
大小改变为30GB VBoxManage modifyhd d:\newxp.vdi --resize 30000 然后用diskgenius扩从容量
- java中的异常和处理
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...
- Mybatis 实用
1.<delete id="removeZtreeS" parameterType="String"> DELETE FROM sys_fun WH ...
- IO流--字符流
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...
- Akumuli时间序列数据库——列存储,LSM,MVCC
Features Column-oriented time-series database. Log-structured append-only B+tree with multiversion c ...
- Word文档增加快捷键
- Go语言并发与并行学习笔记(三)
转:http://blog.csdn.net/kjfcpua/article/details/18265475 Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于G ...
- 一些Shell命令
lsof -nP -itcp:8080 查看本机8080端口在被什么应用占用,可以查看此应用对应的pid. netstat -ant|grep 8081 查看本机8081端口的使用情况. telnet ...
- 手动实现ArrayList
public interface List { public void insert(int i,Object obj)throws Exception; public void delete(int ...
- c# 关键字delegate、event(委托与事件)[MSDN原文摘录][2]
//Demo1:Declaring an event in an interface and implementing it in //a class. // event_keyword.cs usi ...