转:Ogre的八叉树场景管理器OctreeSceneManager

上面是我绘制的一张图。

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

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

时间: 2024-10-16 09:35:34

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

转:OGRE场景管理器介绍

一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可能由山,树木,微微摇动的草地,飘着云彩的天空组成.Ogre提供了一套不同的场景管理器,每一种特别支持某种场景,本文档将列出Ogre提供的场景管理器和它们的优缺点. 1 选择一个场景管理器 2 八叉树场景管理器(Octree Scene Manager) 3 地形场景管理器(Terrain Scene

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

由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是我们可爱的Ogre写的最好,于是狂看n千行代码,把精髓提取出来给大家共享. 鉴于我们游戏版教程又n久没有更新了,今天发一篇我对Ogre场景管理器之Octree源代码分析的笔记. 所有代码采用伪代码. 首先回顾一下Ogre场景管理的架构 Ogre以插件形式提供了多种场景管理器 1. BSP管理用于支持

Ogre bsp场景管理笔记

1.用到的知识点 如何判断点在平面哪一边? 以及判断aabb盒子在面的哪一边? Real Plane::getDistance (const Vector3& rkPoint) const { return normal.dotProduct(rkPoint) + d; } //----------------------------------------------------------------------- Plane::Side Plane::getSide (const Vect

09应用输入管理器转动场景--《程序员学Unity3d》

为什么极品飞车等等游戏,都可以通过系统设置很方面地根据自己喜欢设置操作方式,有人喜欢用箭头来控制没有喜欢用用"W,S,A,D"来控制,这就说明了程序员不会把控制方式写死在程序里面,来看看Unity3d如何让用户可以随时修改"快捷键". 优点:不仅方便后期维护,也可以减少很多代码. Edit --Project Settings -- Input 打开输入管理器 前面17组是系统配置的,可以修改或删除. 将Size改为18,新增一组.(名称为Test,对应按键为 a)

MQ队列管理器搭建(一)

多应用单MQ使用场景 如上图所示,MQ独立安装,或者与其中一个应用同处一机.Application1与Application2要进行通信,但因为跨系统,所以引入中间件来实现需求. Application1需要连接MQ,并将消息放入队列Queue中,Application2同样连接MQ,监听在Queue队列上,一旦发现有消息进入则取出该消息进行处理. 下面将给出创建队列管理器和队列的示例: 定义队列管理器名称为Qm1,本地队列名称为Queue,服务器连接通道CHAN_SERVER_CON,监听端口

MQ队列管理器搭建(三)

MQ集群及网关队列管理器的搭建 描述: 如上图所示,为MQ的集群搭建部署图.CLUSTERA.CLUSTERB分别是两个集群,其中Qm1-Qm3.GateWayA为CLUSTERA集群中的队列管理器:Qm1-Qm3.GateWayB是CLUSTERB集群中的队列管理器.GateWayA与GateWayB负责网络路由和消息分发,使用集群的方式可以达到负载均衡的目的,除此之外还能提高MQ使用的稳定性.同一个集群中除网关队列管理器外的任意队列管理器因故关闭或停止工作后,其他的队列管理器可以接管它的工作

MQ队列管理器搭建(二)

MQ级联方式使用场景 使用场景: 如上图所示,Application1与Application2要进行通信或者消息互换,使用MQ中间件作为中介.上图中,Application1与Application2通信不进行直接连接,而是通过与MQ通信从而实现二者的通信.图中两个MQ的信息如上描述.其中RemoteQueue为远程队列,该队列指定了目标端对应的队列为Queue,并且该远程队列指定了传输所使用的传输队列尾TransQueue:而此传输队列TransQueue与发送通道CHAN_QMGR1_TO

nodejs-npm模块管理器

JavaScript 标准参考教程(alpha) 草稿二:Node.js npm模块管理器 GitHub TOP npm模块管理器 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 简介 npm init npm set npm config npm info npm search npm list npm install 基本用法 安装不同版本 避免系统权限 npm update,npm uninstall npm run 参数 scripts脚本命令最佳实践 p

JAVA GUI布局管理器

边界布局管理器: a.布局方式:是把整个容器划分为五个部分.东西南北中,南北要贯通,中间最大 (不仅是中间的范围最大,权利也最大)当周边不存在的时候中间会占领周边,当中间不存在的时候周边不能占据中间 b.使用场景:不是用来直接放组件,而是用来放置子容器(中间容器)的 流布局管理器 : FlowFrame a.布局方式:是按从左往右,从上往下,由中间开始的方式依次排放组件,组件大小根据组件内容确定,组件的位置会随着容器大小的改变而改变 b.使用场景:用来放置组件,而不是用来放中间容器,流布局最好只