浅谈 Scene Management(一)

也许我们都或多或少的听说过 SceneGraph,也听说过 Scene Management,还听说过 BSP\Portal\Quadtree\Octree 等空间管理数据结构,那么这些概念之间的关系是怎样的?他们之间的区别在哪里?分别在 3D 图形应用中起什么样的作用?针对这些疑问,我希望能用这个系列文章来解答这些问题。
以前我对 SceneManagement(以下简称 SM)的概念非常模糊,最直接的印象是 OGRE 的 SM 类(那个真的是一个包罗万象的管理类),后来又接触到了 SceneGraph(以下简称 SG),于是我到处寻找资料,国内的 SM、SG 的资料非常少,仅有的几篇也是含糊不清。这期间我主要看的是David H.Eberly 的《3D Game Engine Architecture》的关于 SceneGraph 的样章部分,有了一些概念。后来在 GameDev 上看关于 SG 的讨论时看到了一个帖子,这个帖子的内容基本上颠覆了我原来对 SG 的理解。后来我又去下了 OpenSG 的代码和技术文章,还有 Java3D 的 SG 接口说明,我逐渐认识到了 SG 的本质。
那么 SG 是什么?首先我给出自己对于 SG 的定义:SG 是一种更高层次的数据结构,它管理了 3D 场景中所有的有形和无形的对象,包括:transform\light\shader\geometry\animation 等等,它将有形的对象按照空间关系组织在一起,将无形的对象按照逻辑关系组织在一起。它提供了场景对象的统一的访问控制接口,使外部应用能够方便的访问并控制这些对象。SG 是由两种 Node 组成,一种是用于构建整个层次结构的 Node ,一种是保存场景对象的 Node,由于多个层次 Node 可以共享一个场景对象,所以这就构成了一个图的结构。由于这些逻辑空间关系是有向的,所以 SG 是一种有向非循环图 DAG。它是 SM 中不可缺少的一部分,也是最核心的部分。
为什么要使用 SG? 3D 应用中最简单的对象管理就是把所有对象放在一个列表结构中,访问时遍历,但是如果在运行时更改它们之间的逻辑关系,使用这种方式就非常困难,人们为了解决这个问题,自然而然的想到了层次的树形结构,但树形结构不能共享相同的资源,于是将树叶子共享,就形成了图的结构。使用 SG 能很容易的将骨骼动画这种层次结构包含在 SG 中,无须再另组织一套数据结构。类似的,对于层次运动变换,更是容易,比如:太阳系的运动。
SG 能做什么?SG 负责维护场景对象的逻辑关系,负责提供访问控制场景对象的统一接口,是整个 3D 应用运转的核心,如果没有好的 SG 来管理场景对象,维护复杂场景对象的关系将会变得异常困难,你将不得不 Hard code 一些功能在你的引擎中,这会使引擎变得越来越臃肿,没有扩展能力,很难适应应用需求的变化。由于包围体层次和 SG 层次类似,所以可以把 SG 作为 包围体层次结构,这样无需再建立另一套包围体层次结构,在一次遍历中就可以更新整个包围层次。
SG 不能做什么?SG 不能做渲染状态排序,不能做 minimize render state change,不能做静态场景的可视性剔除,不能做碰撞检测。那么这些事情由谁来做?Rendering state sort 和 minimize render state change 由 shader System 来完成;visible culling 由具体的空间管理算法完成,比如 BSP\Portal\Quadtree\Octree 等;碰撞检测由 Collision System 或者外部的 Physical Engine 来完成。
SG 包含什么?Transform \Shader\Geometry\Animation\Light 等等,所有有形无形的场景对象都可以放入到 SG 中管理,场景中的对象不是孤立存在的,它一定和其他对象有逻辑关系。比如:某一动态点光源会照亮某几个物体,在 SG 中就表示为 Light 节点下关联着几个被照亮的 Geometry 节点。
SG 还有哪些问题?有很多人试图将所有场景管理的操作都统一到 SG 中,但目前还没有一个很完美的办法。我的观点是分而制之,至少不在结构上搞得非常复杂,也许效率会受些影响,但硬件的发展速度能缓解这个问题。另外,对于动态物体和静态物体的管理,也是难以统一,所以这还要在实际的情况中去验证和测试,得出最适合自己情况的一套方案。
下一篇我会详细的讲解 SG 的内部结构和运行流程。
Advertisements
此条目发表在DreamEngine 3D 图形引擎开发分类目录。将固定链接加入收藏夹。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

w

Connecting to %s