上面是我绘制的一张图。

关于八叉树场景管理器主要需要关注两个类,其一是松散八叉树的数据结构Ogre::Octree,其二是八叉树场景管理器Ogre::OctreeSceneManager。

下面摘录图片中的文字:

松散八叉树的数据结构。

属性:
其中mBox为其包围盒,mHalfSize定义为包围盒大小的一半。
mChildren是一个大小为8的静态数组,里面保存了8个Octree指针,由八叉树场景管理器创建,由本类管理。
mNodes为挂接到当前八叉树上面的八叉树场景节点,
mNumNodes保存了挂接到当前八叉树及其子树上面的节点数量总和。mParent为当前八叉树的父树。

方法:
_isTwiceSize 返回当前树的包围盒是否两倍大于参数中的包围盒。
_getChildIndexes 八叉树在3维空间中被等分成8个子立方体,这个方法的作用就是返回参数给定的包围盒位于
这8个子树当中的哪一个当中。
_getCullBounds 这个方法决定了这是一颗松散八叉树,它返回的是当前树包围盒两倍大的包围盒。
             可以参看《实时计算机图形学》。这个返回的盒子将用于裁剪。

八叉树场景管理器。
      使用松散八叉树数据结构来管理场景节点,通过八叉树数据结构来实现可见性裁剪。这个场景管理器只使用了
OctreeCamera的视锥体来判断目标节点的包围盒是否在其中,如果在则加入渲染队列,否则忽略;而没有对视锥
内部的节点与节点之间做遮挡裁剪。
       属性:
       mVisible保存可见的场景节点,好像没什么用处目前。
       mOctree 当前场景管理器使用的松散八叉树数据结构,目前默认深度为8,默认包围盒大小为正负10000。
       mBoxes 保存需要渲染的WireBoundingBox.
       mNumObjects 保存需要渲染的场景节点的数量总和
       mBox 八叉树的大小
       mLoose 应该是用于标识是否是松散的,不过现在没用到
      其它还有一些用来绘制场景包围盒的颜色和索引缓冲。
     
      方法:
      init 初始化
      destroySceneNode 先将其从八叉树数据结构中删除,然后再调用父类的函数做释放内存等等事情。
      _updateSceneGraph 每次渲染都会调用 跟基类一样
      _addOctreeNode 添加一个新的八叉树场景节点。 如果八叉树深度没有到达最大深度且当前聚焦的八叉树包围盒两倍大于目标节点的包围盒,那么则继续递归的向本树的子树进行添加,否则添加到当前聚焦的八叉树中。
      _findVisibleObjects 每次渲染前都会调用,用于查找可见的场景节点(实际上是查找全部或部分位于摄像机视锥内的节点),通过调用walkOctree来实现。
      walkOctree 递归遍历八叉树,查询每个场景节点是否位于摄像机视锥内。
      _findNodes 这是提供给射线查询、包围盒相交查询、球形相交查询使用的函数。使用八叉树进行有层次的相交查询会明显快于逐节点的查询。

提问:为何要做场景管理器,硬件不是可以自动的裁剪么?

回答:硬件裁剪的局限性在于只能逐图元的裁剪,即判断某个顶点是否是在视锥之外。这个通常是在发生在光栅化之前。举个例子,如果在视锥外有一个由300万个面组成的模型,若是让硬件去裁剪的话,要多久?如果这个模型恰好位于一个八叉树的节点当中,我们首先判断就可以得到这个节点的包围盒不在视锥内,那么这个包围盒内部的图元是不是也肯定不在视锥内了呢?相比较这个速度吧。

至于相交检测也是同样的道理。以FPS游戏中的狙击枪为例,我们可以将弹道视为一条射线,如果这条射线与整个包围盒都不相交,那么你怎么可能打中位于包围盒中的敌人呢?由于包围盒通常是规则的图形,而敌人是由不规则的模型构成的,因此测试效率天差地别。把这条设想放到八叉树场景管理器中,通过对八叉树及其子树的包围盒的相交检查就可以一片一片的排除,这岂不是要快很多?

当然,这只是一个加速的方法而非替代硬件裁剪的过程,当使用场景管理器的时候可以显著减少传递到图形硬件的数据量。

转:Ogre的八叉树场景管理器OctreeSceneManager的更多相关文章

  1. 转:OGRE场景管理器介绍

    一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可 ...

  2. [Axiom 3D]3.SceneManager场景管理器

    首先看看Axiom.Core命名空间下public abstract class SceneManager : DisposableObject A SceneManager organizes th ...

  3. ogre3D学习基础11 -- 交换两个场景管理器

    这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...

  4. 转:Ogre源码剖析 - 场景管理之Octree

    由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是 ...

  5. ogre3D学习基础6---场景管理器的使用

    场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...

  6. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)

    接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...

  7. [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计

    目       录 第四章           设备驱动管理器的设计... 2 4.1           接口定义... 2 4.2           设备容器... 7 4.3          ...

  8. 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档

    场景管理作业说明文档                              用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...

  9. JAVA GUI布局管理器

    边界布局管理器: a.布局方式:是把整个容器划分为五个部分.东西南北中,南北要贯通,中间最大 (不仅是中间的范围最大,权利也最大)当周边不存在的时候中间会占领周边,当中间不存在的时候周边不能占据中间 ...

随机推荐

  1. c#中的 数组

    数组即是一组相同类型组合在一起,使用一个通用的名称,通过分配的下标访问的数据集合中的元素. 数组是具有相同类型的一组数据.当访问数组中的数据时,可以通过下标来指明.c#中数组元素可以为任何数据类型,数 ...

  2. libcurl库的http get和http post使用【转】

    一.libcurl中的http get使用方法 1. 为什么要使用libcurl 1) 作为http的客户端,可以直接用socket连接服务器,然后对到的数据进行http解析,但要分析协议头,实现代理 ...

  3. [leetcode]Text Justification @ Python

    原题地址:https://oj.leetcode.com/problems/text-justification/ 题意: Given an array of words and a length L ...

  4. JS获取当前网页内容,创建文件并下载,URL.createObjectURL和URL.revokeObjectURL

    有时候需要在前端侧对于动态生成的内容进行下载,比如页面上某一段文本信息,再比如对页面进行分享的时候,希望分享图片是页面内容的实时截图,此时,这个图片就是动态的,纯HTML显然是无法满足我们的需求的,借 ...

  5. 【Spark】Spark-foreachRDD需要注意的问题

    Spark-foreachRDD需要注意的问题 dstream.foreachRDD_百度搜索 通过Spark Streaming的foreachRDD把处理后的数据写入外部存储系统中 - 吾心光明 ...

  6. 【ElasticSearch】ES5新特性-keyword-text类型-查询区别

    ES5新特性-keyword-text类型-查询区别 elasticsearch-head Elasticsearch-sql client junneyang (JunneYang) es keyw ...

  7. Centos6.4下安装protobuf及简单使用

    1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/ 2.下载最新的protobuf,下载地址:https ...

  8. Git 以分支的方式同时管理多个项目

    你是否遇到过这样的问题: 你的客户在你们这边做了N个项目,而项目之间又存在着某些业务关联(数据库访问等) 之前你可能是这样处理的,为客户的每个项目创建单独的Git版本 PC项目 手机项目 微信项目 其 ...

  9. Cognos11中通过URL传参访问动态Report

    一.需求: 在浏览器输入一个URL,在URL后面加上参数就可以访问一个有提示值的报表?比如下面的报表 二.解决办法 Cognos  Model 查询主题设计层概要 Select * from [UCO ...

  10. junit与spring-data-redis 版本对应成功的

    spring-data-redis  版本:1.7.2.RELEASE junit 版本:4.12