3D游戏引擎入门课程——场景管理

目录

  • 写在前面
  • 场景管理
    • 场景管理概述与BVH
    • 场景组织结构:场景树,八叉树和BSP树
      • 场景树
      • 八叉树
      • BSP树
    • 场景管理实例
      • OGRE场景管理
      • OSG场景管理
      • Panda3D场景管理

写在前面

本专栏内容均为学堂在线慕课《3D游戏引擎架构设计基础》中的内容。个人将其转化成文字和图片的版本(个人更加喜欢文字版本的教程,阅读速度更快很多),方便查阅。
原课程链接:3D游戏引擎架构设计基础。

场景管理

场景管理概述与BVH

为了提高场景管理的效率,场景对象的逻辑组织架构通常是树型的结构。举例:

3D游戏引擎入门课程——场景管理_第1张图片

游戏场景组织的架构包括:

  • 场景图,多用于管理动态场景。

  • 八叉树,多用于管理大型室外场景。

  • 二叉空间分割,即BSP树,多用于管理室内场景。

BVH(Bouding Volume Hierarchies)包围体层次结构,用于快速判断场景对象之间的几何位置关系,其通过BVH方法为每个对象计算包围体。BVH就是节点有包围体信息的树状结构。举例:
3D游戏引擎入门课程——场景管理_第2张图片

其中包围体类型又包括:包围球,轴平行包围体,有向包围体,k-离散有向多面体。其计算复杂度是逐渐上升的。其中计算方法如下图所示:

3D游戏引擎入门课程——场景管理_第3张图片
3D游戏引擎入门课程——场景管理_第4张图片
3D游戏引擎入门课程——场景管理_第5张图片3D游戏引擎入门课程——场景管理_第6张图片

场景组织结构:场景树,八叉树和BSP树

场景树

  • 用层次结构表示场景中的对象

  • 上层对象的操作影响其所有子树的对象

  • 有向无环图

场景图的抽象描述如下:

3D游戏引擎入门课程——场景管理_第7张图片
3D游戏引擎入门课程——场景管理_第8张图片
3D游戏引擎入门课程——场景管理_第9张图片

八叉树

将空间分成八等份,如果被分的部分填满了场景内容,或被分的部分没有场景内容,则不再分割;否则,继续分割,直到满足终止条件。

八叉树的组织:

3D游戏引擎入门课程——场景管理_第10张图片

其缺点是叶子节点的指针空间都为空,浪费很多空间。其中一种改进的做法是:

3D游戏引擎入门课程——场景管理_第11张图片
线性八叉树节省了储存空间,场景运算也非常简便。

八叉树分割算法:
3D游戏引擎入门课程——场景管理_第12张图片

其中可以通过计算分割的立方体与几何包围体的包含关系来确定几何体与场景的几何关系是F(Full)还是E(Empty)。递归的分割算法实现非常简洁快速。

八叉树的构建思想决定了场景的有序性,当镜头位置和方向确定后,场景的遍历顺序就可以确定。八叉树的遍历方式可以从后向前遍历,或是从前向后遍历。其中前者被也称为画家算法,这种方式不需要计算遮挡关系,但是需要渲染每一个面,效率很低。后者是最近的面先渲染,再通过遮挡关系或深度缓存信息,决定像素的最终渲染结果。这种方法深度缓存需要在像空间执行,但是减少了很多渲染计算,效率较高。

八叉树的优点如下:
3D游戏引擎入门课程——场景管理_第13张图片

BSP树

是用空间超平面,递归地将空间分割为凸多面体集,用二叉树表示被分割的空间。

其中凸多面体的定义为:由若干平面多边形所圈成的封闭的立体叫做多面体,这些平面多边形称为多面体的面,这些多边形的边和顶点分别称为多面体的棱和顶点。如果多面体在它们每一面所决定的平面的同一侧,则称此多面体为凸多面体,或欧拉多面体。凸多面体的任何截面都是凸多边形,与凹多面体相反。

其分割思想为:
3D游戏引擎入门课程——场景管理_第14张图片
其构建算法为:
3D游戏引擎入门课程——场景管理_第15张图片
其中几个几何问题算法包括:

  • 如何判断凸多面体:
    3D游戏引擎入门课程——场景管理_第16张图片

  • 如何判断两个面片的几何位置关系:
    3D游戏引擎入门课程——场景管理_第17张图片

  • 判断面片与顶点的几何位置关系:
    3D游戏引擎入门课程——场景管理_第18张图片
    3D游戏引擎入门课程——场景管理_第19张图片

解决了上述几个几何问题,继续讨论BSP树的构建。另外一个问题是,如何确定分割的超平面,选择步骤为:

3D游戏引擎入门课程——场景管理_第20张图片

  • 剔除凸包面
    3D游戏引擎入门课程——场景管理_第21张图片
  • 计算NF、NB、NS
    3D游戏引擎入门课程——场景管理_第22张图片
  • 选择分割空间的超平面
    3D游戏引擎入门课程——场景管理_第23张图片
    最后是BSP树完整的构建算法:
    3D游戏引擎入门课程——场景管理_第24张图片
    BSP树的遍历算法(画家算法):
    3D游戏引擎入门课程——场景管理_第25张图片
    可以通过从前往后遍历,通过深度缓存进行计算进行优化。
    BSP树的应用:
    3D游戏引擎入门课程——场景管理_第26张图片
    最后对几种算法进行对比:
    3D游戏引擎入门课程——场景管理_第27张图片

场景管理实例

OGRE场景管理

OGRE中场景类型分为:静态、动态、扩展的:

  1. 静态型:非常庞大、向四周不规则蔓延的、不可移动的、由三角形网格组成的物,包括地形、天空盒等,有以下的表示:SkyPlane, Skybox, SkyDome(SceneNode *);World geometry, 通常是一个确定的SceneManager;Static geometry,通常SceneManager的树结构是确定的,如室内场景。

  2. 动态性:可在场景中移动的、离散的、相对较小的物体,主要包括实体(Entity)、粒子、摄像机等,用SceneNode类和MovableObject类表示。

  3. 扩展型:主要包括BSPSceneNode, OctreeNode, PCZSceneNode等。

OGRE场景管理部分类图:
3D游戏引擎入门课程——场景管理_第28张图片
其中的主要类描述:
3D游戏引擎入门课程——场景管理_第29张图片
SceneManger(场景管理单例)主要功能图:3D游戏引擎入门课程——场景管理_第30张图片
OGRE创建场景对象示例:
3D游戏引擎入门课程——场景管理_第31张图片3D游戏引擎入门课程——场景管理_第32张图片

OSG场景管理

OSG的场景管理主要模块:3D游戏引擎入门课程——场景管理_第33张图片
OSG场景关系类图:
3D游戏引擎入门课程——场景管理_第34张图片
下面是OSG场景管理中几个核心类:
3D游戏引擎入门课程——场景管理_第35张图片3D游戏引擎入门课程——场景管理_第36张图片3D游戏引擎入门课程——场景管理_第37张图片
OSG场景管理设计分析:
3D游戏引擎入门课程——场景管理_第38张图片

Panda3D场景管理

Panda3D场景管理概念:

  1. 场景图有一个公共基类(PandaNode抽象类),派生所有场景节点类;

  2. 场景图的任何一个节点可以由一个以上的父节点,即场景图是有向无环结构;

  3. 派生的几何节点类是场景图的叶子节点,是可渲染的节点;

  4. NodePath类时管理场景图的接口类,操作场景节点,获取从根到访问节点的路径等。

Panda3D场景管理部分类图:

3D游戏引擎入门课程——场景管理_第39张图片
Panda3D场景管理基类定义:
3D游戏引擎入门课程——场景管理_第40张图片
下面是Panda3D中场景管理几个核心类的描述:
3D游戏引擎入门课程——场景管理_第41张图片
3D游戏引擎入门课程——场景管理_第42张图片3D游戏引擎入门课程——场景管理_第43张图片
3D游戏引擎入门课程——场景管理_第44张图片
Panda3D场景管理模块关系图:
3D游戏引擎入门课程——场景管理_第45张图片
Panda3D场景管理示例:
3D游戏引擎入门课程——场景管理_第46张图片

  • 几种游戏引擎场景管理比较:
    3D游戏引擎入门课程——场景管理_第47张图片3D游戏引擎入门课程——场景管理_第48张图片

你可能感兴趣的:(3D游戏引擎)