场景树
这是整个场景的一个层次结构的表示,通过一棵简单的树来实现:一个“节点”有一个父亲和任意数量的孩子。这个数据结构用来管理层次结构的物体变换(位置和方向),以及他们的动画。在FlExtEngine中,CSceneNode类拥有一个update方法,用于对node的变换进行更新;它还有一个accept方法,这样就可以使用访问者模式以实现更好的扩展性。
空间图
这是整个场景的一个空间关系的表示,是通过有向无环图的形式来表示的:将世界分成不同的区域,以实现高效的可视性拣选,这些区域中存放着绘制的物体。类CSpatialNode中有一个cull函数来进行可视性判断,它也有一个accept函数,同样可以使用访问者模式来达到可扩展。
为了让访问者(Visitor)能够在空间分割节点和其中存放物体的节点之间区别开来,从CSpatialNode类构造了一个类CSpatialBranch,CSpatialBranch是所有节点的基类;同时构造了一个CSpatialLeaf类,该类是存储在空间图中的物体的基类。
有很多空间划分的算法可供使用,我会快速介绍几个通用的:
八叉树(The Octree)
八叉树从一个包围整个世界的节点开始,然后将这个节点沿着X,Y,Z轴进行分割,等分成八个子节点,这样递归下去直到一个给定的层级(level)。通常,一个物体保存在完整的包含它的一个节点中,这样做导致了将很多节点移动到了它本来应该在的节点的上一层节点中了,从而降低了拣选的效率。该问题的一个解决办法是松散八叉树(Loose Octree),和上面一个节点正好严格的等分成八个子节点不同,该方法中子节点的大小可以轻微的膨胀(比如10-25%);这样的话,以前因为很小一部分不适合该节点的物体,现在就可以放在该节点当中了。![](https://img-my.csdn.net/uploads/201302/06/1360128313_7778.png)
八叉树在魔域幻境之浴血战场中用于存放游戏角色。
四叉树(The quadtree)
四叉树的3D版本便是八叉树,一棵四叉树从一个包围整个世界的节点开始,然后沿着X,Y轴分割。四叉树一般用于将地形分割成块,它也可以像八叉树那样使用(适合在2D场景中)。四叉树在虚幻2引擎中用于存储地形。
BSP树
![](https://img-my.csdn.net/uploads/201302/06/1360128348_4530.png)
BSP树,全称叫做二分空间树,从任意一个平面开始,该平面将世界一分为二,然后递归的用平面进行分割,直到一个节点拥有了给定数量的三角形。和八叉树以及四叉树不同的是,在BSP树中,只有叶子节点中才保存三角形。
BSP树在ID software的许多作品中使用了,例如雷神之锤(Quake),雷神之锤II,雷神之锤III 竞技场中,用于存放世界的集合信息。
KD树
KD-树中,K是树的子节点的最大个数,表示树种有多少个轴可以用来产生切割平面。在BSP树中可以有任意的平面来分割世界,而在KD树中,只能沿着某个K轴来产生切割平面。Sectors and portals
Sector/Portal: that scheme divides the world into convex Sectors, which are connected (one or two way) with Portals. The Sectors are to be convex for the system to work best, as then, there's the guarantee that from any point inside the Sector, any other point might be visible.The Sector and Portal scheme has been used along with a BSP in Doom III and Quake IV.
The adaptive binary tree
ABT树和BSP树有点类似,不同的地方是它的实时更新的,当一个分支含有的节点或者物体的比例太小时,这个分支会重新计算来使得存放在里面的物体最适合。ABT树使用在vTales Grahpics公司。