转: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游戏中的狙击枪为例,我们可以将弹道视为一条射线,如果这条射线与整个包围盒都不相交,那么你怎么可能打中位于包围盒中的敌人呢?由于包围盒通常是规则的图形,而敌人是由不规则的模型构成的,因此测试效率天差地别。把这条设想放到八叉树场景管理器中,通过对八叉树及其子树的包围盒的相交检查就可以一片一片的排除,这岂不是要快很多?
当然,这只是一个加速的方法而非替代硬件裁剪的过程,当使用场景管理器的时候可以显著减少传递到图形硬件的数据量。
转:Ogre的八叉树场景管理器OctreeSceneManager的更多相关文章
- 转:OGRE场景管理器介绍
一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可 ...
- [Axiom 3D]3.SceneManager场景管理器
首先看看Axiom.Core命名空间下public abstract class SceneManager : DisposableObject A SceneManager organizes th ...
- ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...
- 转:Ogre源码剖析 - 场景管理之Octree
由于本人的引擎ProjectGaia服务于08年创新杯的游戏项目 – 3D太空游戏,所以理所应当加入Octree(八叉树 – 已经周宁学长发帖介绍过)场景管理器.参考了无数Octree的代码,发现还是 ...
- ogre3D学习基础6---场景管理器的使用
场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计
目 录 第四章 设备驱动管理器的设计... 2 4.1 接口定义... 2 4.2 设备容器... 7 4.3 ...
- 【腾讯GAD暑期训练营游戏程序班】游戏场景管理作业说明文档
场景管理作业说明文档 用了八叉树的算法,测出三层时最快,区域范围内物体数量为21块,控制台打印出的结果如图所示: 场景物体:游戏中,所有具有空 ...
- JAVA GUI布局管理器
边界布局管理器: a.布局方式:是把整个容器划分为五个部分.东西南北中,南北要贯通,中间最大 (不仅是中间的范围最大,权利也最大)当周边不存在的时候中间会占领周边,当中间不存在的时候周边不能占据中间 ...
随机推荐
- IDEA远程debug的使用
1.打开配置页面 2.添加远程调试配置 3.进行参数配置 不同的jdk版本,配置的参数是不一样的! 其中Host为远程服务器的地址,Port为远程debug的端口,注意要与前面设置的address保持 ...
- NLP的神经网络训练的新模式
https://blog.csdn.net/jdbc/article/details/53292414 该模式分为:embed.encode.attend.predict四部分.
- C# winform DevExpress上传图片到数据库【转】
实现功能如下图: 注明:此文使用的是DevExpress控件,winform 原生控件也是一样使用方法. 1.点击选择图片按钮,功能为通过对话框选择要上传的文件,并将该文件在下面的PictureEdi ...
- SCRIPT5009: “Sys”未定义 部署.net ajax 解决方案
今天在部署asp.net ajax 的时候发现部署服务器的时候,ajax刷新不正确,开始以为是System.Web.Extensions没有引用到本地,baidu一圈发现(最近google上不了郁闷~ ...
- iOS开发-策略模式
策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
- mybatis plus 主键生成 Twitter雪花算法 id 及修改id为字符型
mybatis plus配置主键生成策略为2,就是 使用Twitter雪花算法 生成id spring boot中配置为: GlobalConfiguration conf = new GlobalC ...
- C#将数据集DataSet中的数据导出到EXCEL文件的几种方法
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.W ...
- GPS精度因子(GDOP,PDOP,HDOP,VDOP,TDOP)
PDOP:位置精度因子(Position Dilution of Precision),直译为“精度强弱度”,通常翻译为“相对误差”.具体含义是:由于观测成果的好坏与被测量的人造卫星和接收仪间的几何形 ...
- Python 通过打码平台实现验证码
在爬虫时,经常遇到登录需要验证码的情况,简单的验证码可以自己解决,复制的验证码需要借助机器学习,有一定的难度.还有一个简单的方案就是采用付费的打码平台. 比如R若快(http://www.ruokua ...
- Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)
Key Vertex Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...