SceneManager 负责场景的创建,组织和管理. 在我的理解中,场景有两个基本要素:场景的空间层次结构及其组织;场景中的物体(实体, 光源,照相机等)。 场景的创建也就可以分为两个步骤:1) 创建场景的空间层次结构(空间布局);2) 在创建好的空间层次结构上加载实体对象。
场景的空间层次结构及其组织:它是对场景的空间布局的描述。 好的场景组织结构可以提高诸如裁减,光线追踪,碰撞检测等操作的性能。
目前比较常用的场景组织结构有BSP树, 八叉树等。 当然, 最基础的就是不做任何处理和优化的普通的树结构. 目前, TinyRenderEngine 暂时
只支持一般的场景树结构. 具体的说:每个场景有一个根节点(root), 它可以有多个子节点, 每个子节点又可以有多个子孙节点,依次类推,
构成一颗场景树。每个节点都有一个位置和朝向(旋转)信息(通常是相对于父节点坐标系)。 根节点没有父节点,它的位置和朝向相对于世界
坐标系。每个节点通过从根节点到本身的路径上的所有节点的空间变换的累积可以得到它在世界坐标系下的位置和朝向,由此, 我们得到了一
个场景的空间布局(每个场景节点在世界坐标系下的空间位置和朝向)。下图是场景树节点的类图, 它是一个Composite模式:
场景中的物体:场景中的各种物体,比如光源(light), 它定义了场景中的光照; 比如照相机(Camera), 它定义了视点;还有实体(Entity),
它是定义了mesh和材质(material)的可绘制的物体;当然还有其他种类的物体。 需要绘制的实体(Entity)需要加载到场景节点(SceneNode)
上后才能成为场景中的一部份而被绘制出来。所以创建一个场景跟现实中的情况是很类似的:先规划好空间布局,然后把每个物品放到对应的空
间位置上去(加载实体)。除了待绘制的实体外,还可以在场景节点上加载光源(light),相机(Camera)等, 这适用于光源和照相机在场景中运
动的情况(比如在第一人称射击游戏中,照相机随着人物移动). 所有可以加载到SceneNode上的类都派生自基类MovableObject.下图是
MovableObject的类图:
SceneManager 提供了以下主要接口:
1) 创建SceneNode
2) 创建SceneNode的孩子节点
3) 添加SceneNode的孩子节点
4) 创建Light,Camera, Entity
5) 加载Light,Camera, Entity
6) 设置Active的Light,Camera
7) SceneNode/Node/Light/Camera/Entity 的查询