首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 游戏天堂 > 游戏开发 > Ogre学习笔记(4):OctreeSceneManager
【标  题】:Ogre学习笔记(4):OctreeSceneManager
【关键字】:Ogre,OctreeSceneManager
【来  源】:http://blog.csdn.net/yanonsoftware/archive/2006/08/15/1067265.aspx

Ogre学习笔记(4):OctreeSceneManager

既然前面分析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,以完成查询。
SQL Server导入导出概述与比较:【上一篇】
粒子系统模拟烟花:【下一篇】
【相关文章】
  • Ogre学习笔记(3):Mesh的渲染流程
  • Ogre学习笔记(2):Mesh的加载
  • in progress
  • Atlas 学习之004:“UpdatePanel ”和“UpdateProgress ”使更新数据呈现动画效果
  • Ogre学习笔记(一)
  • eclipse SWT progressbar 进度条
  • Atlas学习手记(6):使用Atlas UpdateProgress控件
  • 5年后的OGRE3D,与从其中SHARED_PTR谈开
  • OGRE学习日志5
  • 先玩玩Ogre
  • 【随机文章】
  • 在别人QQ中删除自己两种方法
  • Latex 中文支持CJK的安装与配置
  • TCP/IP 协议
  • 怎样用VB在应用程序中调用API
  • 深入浅出话“友元”
  • 数1的个数
  • Eclipse开发Web应用视频教程--用户注册及登录示例
  • 细说Windows屏幕保护程序的密码
  • [Portal参考手册]生命周期
  • CISCO命令集——IP寻址
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.