3 ogre场景管理

2020-03-01 169浏览

  • 1.第 3 课 Ogre 场景管理 为什么使用场景管理: 不仅提供了对用户在空间中查找和搜索物体提供了高速的优化, 并且针对程序库(对我们而言就是 Ogre )的渲染需要,提供了 相应的搜索、排序以及剔除功能。在某些时候也被用来进行碰撞 检测。在一些具体的设计里面,场景图甚至可以被所有子系统使 用,比如声音和物理系统都可能依赖场景图来实现相应的功能。 场景管理的实现方法: 通过引擎所使用的插件机制, Ogre 通常会使用一些外部“插入” 的场景图算法来使用。 Ogre 中提供的 SceneManager 类只不 过是场景图的接口,你可以通过它来调用 Ogre 本身提供的几个 不同的场景图算法,也可以在网上找到一些 Ogre 场景算法的其 他实现
  • 2.第 3 课 Ogre 场景管理 Ogre 场景管理的特点: Ogre 从核心设计之初就已经将场景结构(场景图)和场景 内容完全分离,把场景图的结构和它所使用的数据节点作为 平等的继承体系来使用。这种灵活且强大的设计理念,使得 多种场景图的管理方式(比如 BSP 、八叉树或者 KD-Tre e )可以灵活的替换,而不会影响具体的场景内容的实现。
  • 3.第 3 课 Ogre 场景管理 场景管理器的作用: · 在场景中创建和放置活动物体、灯光以及摄像机,并维护他们的 在场景图中的周游和变换。 · 载入和布置世界地图( World geometry ,与活动实体不同, 世界地图是巨大且可以延伸的,通常情况下是不可移动的,比如 一个完整的 BSP 地图)。 · 对场景查询( Scene Queries )的支持,比如回答“在世界的某 个原型空间内,都包含了那些物体”。 · 剔除不可见物体并且将可见物体放入渲染队列。 · 根据当前和渲染物体的透视图,对无方向的光源 ( Nondirectional Light )进行组织和排序(按由近到远)。 · 设置并且渲染场景中的阴影。 · 渲染场景中的其他物体,如背景和天空盒 · 发送组织好的内容到渲染系统执行渲染
  • 4.第 3 课 Ogre 场景管理 场景对象: 对于场景中存在的物体(即场景对象),不论是否能被渲染 ,都会交给场景管理器进行具体的管理工作。比如:灯光、 摄影机、实体、粒子系统以及公告栏这些活动物体,以及天 空盒、静态几何体和世界地图这些非活动物体。 对场景对象的“管理”指的是对场景中物体整个生命周期的管理 :提供了创建、获得、销毁以及销毁本类型全部实例的方法。 任何从场 景管理器得到的 场 场场场 场场 场场场 象必 场场 场 由同一个 场场 场场场 景管理器 场场 场场场 :换句话说,不可以直接“删除”任何有场景管理器创建返回 给你的指针所指对象。当你需要释放和清空整个场景的时候 ,必须让相应的场景管理器自己来做(也可以让 Ogre 的 Root 对象在关闭的时候自动得帮你调用相应的方法)。
  • 5.第 3 课 Ogre 场景管理 场景节点 场景管理器用场景节点来定义场景图的结构。这些场景节点以层次 的结构组织在场景管理器中:一个场景节点可以有一个父节点和 任意数量的子节点。你可以对场景管理器中的节点进行绑定或者 摘除操作;这里提供一个简单的办法来关闭场景中的某个部分: 只要把不希望渲染部分的根节点从场景图中摘除下来,这个部分 就不会被渲染了。场景节点必须通过创建它们的场景管理器来销 毁。 场景的根节点 场景的根节点( Root Scene Node )——场景中唯一没有父节点 的场景节点。根节点的概念对整个场景图至关重要,所以用户无 权销毁它。对于场景图来说,根节点的显式作用可以用来挂接所 有场景中存在的其他节点;隐式作用是场景图用它来挂接静态物 体和整个世界地图。尽管你可以移动根节点,但尽量不要这么做 ,因为大多数时候都需要保持根节点的稳定性。
  • 6.第 3 课 Ogre 场景管理 挂接场景节点的示意图
  • 7.第 3 课 Ogre 场景管理 场景内容:  在你创建了一个场景节点之后,场景管理器不会往上面挂接 任何内容。当你需要的时候,应该自己创建内容并向需要操 作的节点挂接。单独的节点上面并没有限制帮定内容的数量。 你可以把所有内容对象都帮定到一个节点上面,不过这也就 意味着无法单独的移动它们。  就像我们之前所说,场景内容独立于场景节点。你可以把场 景内容从场景节点中分离出来,这样的操作并不会引起场景 内容的销毁或者删除。  在场景图中有三个重要的空间操作(移动、旋转、缩放), 它们的操作目标都是场景节点,而不是场景内容。换句话说 ,用户操作场景节点,场景内容跟随着所挂接节点一同移动 、旋转和缩放。
  • 8.第 3 课 Ogre 场景管理 场景查询 场景管理器另外一个很重要的功用就是用来进行空间场景查 询(从场景中得到查询的反馈信息),其中包括: 光线查询( Ray Queries ) 球体查询( Sphere Queries ) 边界盒查询( Bounding-Box Queries ) 边界平面查询( Bounding-Plane Queries ) 相交查询( Intersection Queries )
  • 9.第 3 课 Ogre 场景管理 空间变换 最常使用的坐标系统空间有世界空间( World )、父 节点空间( Parent )以及本地空间( Local )。
  • 10.第 3 课 Ogre 场景管理 物体空间 如果你创建了一个物体(不论是通过 3D 模型工具产生还是手 动构造),物体的顶点都会被放置在世界空间中。我们在这 里举个例子:我们在这里是用 3DS Max 工具来进行模型的 制作,在编辑场景的原点( 0 , 0 , 0 )建立一个边长为 1 的立方体,这样他的顶点都在类似( 0.5 , 0.5 , 0.5 )的 范围内。 单位立方体相对于物 体空间的顶点位置
  • 11.第 3 课 Ogre 场景管理 物体空间 当物体被挂接到场景节点上的时候,这个场景节点上的世界空 间转换矩阵就会应用到这个物体上面的所有顶点上,从而把 物体转换到世界空间的绝对位置,这也是确定物体在 3D 空 间位置、缩放以及方向的原理。事实上这些转换并不是直接 施加在物体顶点上面的,所以这些操作也不会影响物体上面 所顶点到所挂接场景节点位置的距离。 不管场景节点如何移动 ,立方体相对于场景节 点的位置不会改变
  • 12.第 3 课 Ogre 场景管理 本地空间 对于物体的旋转和缩放来说,“本地空间”的概念就是绕着自己 的轴旋转;相对于自己的中心点进行缩放。 在本地空间中,一个节点沿着自己的 轴旋转。图中的箭头表示旋转的方向 在本地空间,一个节点在 自己的中心位置进行缩放
  • 13.第 3 课 Ogre 场景管理 本地空间 虽然在转换的过程中,我们要依赖场景节点进行旋转或者缩放 ,不过实际上,并没有对场景节点做任何操作,因为节点既 不能被看到也不能被渲染出来,所以真正被操作的是节点所 挂接物体上面的每个顶点,参考图 5-5 所示。对场景节点的 影响只是让其中的变换矩阵转化成新的状态。比如,偏移 ( yaw )、倾斜( pitch) 以及滚动( roll )的操作都可以 改变场景节点自身的旋转矩阵的状态(或者也可以通过四元 数或者方向来改变)。
  • 14.第 3 课 Ogre 场景管理 父节点空间 父节点空间变换就是相对于父节点的变换。 (a) 为变换前的父节点与子节点 (b) 为变换后子节点变为父节点空间的 (-1,-1,-1) 。 在父节点没有旋转的情况下,父空间轴向平行于世界坐标系轴 向,这时子节点在世界坐标系的位置,可以简单通过本身在父 空间的位置和父节点在世界坐标系位置向累加得到。
  • 15.第 3 课 Ogre 场景管理 父节点空间 子节点会随着父节点的移动 、旋转以及缩放而变换到新 的位置。并且同样因为对一 个节点的变换会同时作用到 它的子节点,并且依次向下 传递。所以当一个节点旋转 的时候,其所有子节点依次 旋转同样的角度,并且这些 子节点的子节点也会变换。 进而导致这个分支的所有节 点都会发生改变。 ( a )旋转一个场景节点同时它的子节点也跟着旋转。 (b) 中,父节点绕着自身 Z 轴倾斜 ( 父节点在本地空间旋 转)
  • 16.第 3 课 Ogre 场景管理 世界空间  世界空间永远平行于全局坐标轴,并且总是使用这些轴向来 表示世界空间坐标系。  世界空间对渲染和观察投影( View Projection )操作有非 常重要的作用,除非像在世界空场 内布置物体 场 场 场 场 场 场 种特殊的操 场场 场场场 作除外,用户很少直接使用世界空间来进行工作。大部分的 场景内节点的操作(比如以动物体),通常是在其他空间内 完成。
  • 17.第 3 课 Ogre 场景管理 场景中的活动物体 活场 物体( 场 场 场 Movable Object )由场景管理器创建,并且绑定 到场景节点上,最后再由场景管理器销毁。 其中可以被渲染的活动动物,比如只包含几何和纹理的模型, 在它们里面并不包含或处理具体的场景图信息。而另外不可 渲染的活动物体(比如进入场景中的灯光或者摄影机等), 场 然 并不包含任何几何体或者 场 场 理数据,但是它 场 场 场 场 场 场 场 场 仍然有能 场场场 力简单的绘制自己(例如你可以在需要的时候让一个摄影机 在场景中可见)。
  • 18.第 3 课 Ogre 场景管理 场景中的活动物体 以资源为基础的物体 以四边形为基础的物体 天空面、穹顶、天空盒 渲染对象 渲染对象( Rendering Objects )和之前看到的可渲染物体 ( Renderable Object )概念不同。渲染对象指的是用来帮助场景图进行渲染 功能的对象,而不是被渲染到屏幕的物体。在场景中两个最主要的渲染对象是摄 象机和灯光。 摄像机 灯光(点光源、聚光灯、有向光)
  • 19.第 3 课 Ogre 场景管理 世界地图 可以认为世界地图中包含除了活动物体( Movable Object ) 之外所有的东西,比如高度场地图,网格地图,以及在地图 上面的建筑和自然景观(树木以及植被),室内的门和窗户 。
  • 20.第 3 课 Ogre 场景管理 空间分割策略( 1 ) 四叉树 / 八叉树空间分割策略 四叉树是一种历史悠久的 2D 分割策略,不过在某些 3D 场景 中也可以很好的使用,比如那些垂直高度变化很小的室外场 景或者地形中。而八叉树是一种比较适合小型室外场景等分 割方式,并且在允许摄像机随意位置的室内场景中工作的一 样良好(比如摄像机可以在天棚上面或者地板之下)。
  • 21.第 3 课 Ogre 场景管理 空间分割策略( 2 ) 二叉空间分割树 BSP ( binary-space partitioning )是一个非常有效的场景 组织方式,但是对于现在的应用程序而言,更倾向于使用 BSP 做空间快速碰撞检测而不是几何体分割。 虽然 Ogre 提供了一个简单得 BSP 支持(事实上也就是《雷神 之锤 III 竞技场》所使用的地图格式),不过因为《雷神之锤 III 》因为历史的原因,更倾向于把几何数据划分成很多小的 数据块而不是打包成大的数据批次,这使得现代的图形硬件 并不能很好的进行处理。也便因此,已经没有开发人员继续 维护这种 BSP 格式的简单实现。虽然现在仍然提供这种 BSP 地图场景管理器插件,但是它的作用也仅限于载入那些 使用《雷神之锤 III 》关卡编辑器制作的地图所用。
  • 22.第 3 课 Ogre 场景管理 静态几何体 静场 几何体会由很多不再活 场 场场 场场场 场场 场场 场场 的活 场 场场 物体来构成 场 场场 场 现代的 GPU 更适合渲染少量巨大物体,而不是很多小几何片 断。
  • 23.第 3 课 Ogre 场景管理 静态物体的几个缺点 · 一般而言,巨大的静态物体需要在使用前被构建,通常这 是一个缓慢的过程,所以不能在每一帧都执行。 · 静态几何体将按着放入物体的材质来进行分类,并且把材 质相同的集合体放置到同一个渲染设置当中(换句话说, 也就是放到同一个簇中)。但这并不表示只要把一组几何 体打包成一个静态物体就能神奇的把它们捆绑到一个渲染 设置中:不同材质的物体仍然会被拆分成不同的簇中被渲 染。所以这时候你需要在两种需求中进行折衷:是在一次 调用中渲染最多的三角形还是最少的调用的次数(也就意 味着决定在静态物体中放置多少不同的材质)。
  • 24.第 3 课 Ogre 场景管理 静态物体的几个缺点 · 在静态几何体中“静态”的含义是:一旦物体被放入静态几 何体中,你就不能在单独移动它了。任何对静态几何体的 世界变换都会应用到所有里面包含的物体上。这就好像放 入咖啡中的方糖,你可以扔进去,但是再也捞不到它了。 · 通常来说静态几何体会比同样大小的活动物体占用更多的 内存;这是因为对于活动物体来说,可以多个实体共享一 个网格模型。而静态几何体会为每一个实体创建一个网格 模型数据的拷贝。不过在这本书写作的时候, GPU 的几 何处理也正在发生变革,可能在这本书出版之后,硬件会 支持更加优化静态几何体的处理方式。
  • 25.第 3 课 Ogre 场景管理 静态物体的几个缺点 · 就算在你的视野里(视截体)中看到了整个静态几何体的一小 部分,甚至包括在你身后的整个数据都会传到图形硬件中渲染。 假如你把场景中所有的植被都放到一个静态物体中,即使你只 看到一颗小草,那么整个森林都会被渲染。 此外,在场景对静态几何体材质和模型的 LoD (细节等级)处理 中,会遵照整个静态场景最远的物体距离来设定整组物体的等 级。这导致当距离改变的时候,整个静态物体的 LoD 都会有相 同的改变。不过除了上面说的问题之外也有好的一面,场景管 理器会通过空间分割算法把静态几何体分组,进而把那些没有 在显示空间的静态几何体直接屏蔽到渲染队列之外。对于静态 几何体的处理就和所有软件工程中所出现的问题一样,你必须 为提高程序的性能而进行一系列设计上的折衷。