收藏 分享(赏)

游戏场景管理.pptx

上传人:fcgy86390 文档编号:6325958 上传时间:2019-04-07 格式:PPTX 页数:99 大小:4.96MB
下载 相关 举报
游戏场景管理.pptx_第1页
第1页 / 共99页
游戏场景管理.pptx_第2页
第2页 / 共99页
游戏场景管理.pptx_第3页
第3页 / 共99页
游戏场景管理.pptx_第4页
第4页 / 共99页
游戏场景管理.pptx_第5页
第5页 / 共99页
点击查看更多>>
资源描述

1、游戏中的场景管理技术,浙江大学软件学院 梁秀波 Email:,游戏Quake3的场景,三维游戏中的图形技术可分为三个层面 场景的几何组织与优化 着重于提高绘制效率 场景的画面真实度,采用一系列特效生成技术 包括高级纹理映射,过程式建模等 基于真实物理定律的游戏效果模拟 主要是阴影模拟和碰撞检测 本次课程将着重讲解三维游戏场景的几何组织,优化管理以及在此基础上的OGRE中的复杂场景的管理,三维游戏场景的组织和绘制,三维场景的组织和管理 游戏场景的几何优化 三维场景的快速可见性判断与消隐 地形场景的绘制与漫游 碰撞检测简介,基于场景图(Scenegraph)的表达和管理,第一步 根据游戏的需要更新

2、场景图必要的部分 这种更新是部分的,不需要从根节点遍历 第二步 场景图的剔除和绘制,太阳系的场景图,太阳系场景图绘制伪代码,绘制太阳 将当前矩阵压入矩阵堆栈设置第一个旋转矩阵绘制行星A将当前矩阵压入矩阵堆栈设置第二个旋转矩阵绘制卫星A绘制卫星B从矩阵堆栈弹出顶部矩阵绘制行星B将当前矩阵压入矩阵堆栈设置第三个旋转矩阵绘制卫星C 绘制卫星D 从矩阵堆栈弹出顶部矩阵 从矩阵堆栈弹出顶部矩阵,改进后的太阳系场景图绘制伪代码,绘制太阳 将当前矩阵压入矩阵堆栈将当前矩阵压入矩阵堆栈设置第一个旋转矩阵绘制行星A将当前矩阵压入矩阵堆栈设置第二个旋转矩阵绘制卫星A绘制卫星B从矩阵堆栈弹出顶部矩阵从矩阵堆栈弹出顶

3、部矩阵将当前矩阵压入矩阵堆栈设置第三个旋转矩阵绘制行星B将当前矩阵压入矩阵堆栈设置第四个旋转矩阵绘制卫星C 绘制卫星D 从矩阵堆栈弹出顶部矩阵从矩阵堆栈弹出顶部矩阵 从矩阵堆栈弹出顶部矩阵,基于绘制状态的场景管理,把场景物体按照绘制状态分类,绘制状态集合实例,绘制状态树实例,基于场景包围体的场景组织,加速判断场景物体之间的空间关系,主要有两种方法 对单个物体建立包围体,在包围体的基础上建立包围盒层次树 场景剖分,常用的包围体技术,包围体和包围球示例,球的体积比立方体大,OBB树的构造示意图,物体的凸包围体,常用的类型 增量式(incremental) 礼包式(gift-wrapping) 分治

4、式(divide-and-conquer) 快速凸包算法(quick-hull) k-dop(discreted orientation polytope,离散有向多面体) 比上述的包围体更紧密地包围原物体,创建的层次树节点更少,8-dop结构,场景绘制的几何剖分,将场景中的几何物体通过层次性机制组织起来 优点 使用灵活,能快速剔除层次树的整个分枝 注意 要保持树的平衡!,包围树,常用的几何剖分技术,BSP树,(左)场景的BSP树剖分;(右)BSP树结构示意图,BSP树的构造过程,(左)一次剖分后的场景平面图;(右)一次剖分后的BSP树,(左)两次剖分后的场景平面图;(右)两次剖分后的BSP树

5、,BSP算法处理四个嵌套遮挡的多边形,用画家算法无法处理四个嵌套遮挡的多边形情形,四叉树,(a)场景多边形; (b)第一次剖分; (c)第二次剖分,八叉树,(a) (b) (c),(a)初始节点; (b)第一次剖分; (c)第二次剖分,景物包围体和场景剖分技术比较,景物包围体和场景剖分技术比较,场景包围体和场景剖分技术比较,(左)场景包围体技术(右)场景剖分技术,层次细节(LOD)技术,简单取舍型LOD 平滑过渡型LOD 静态LOD 动态LOD,LOD,经典的简化算法,顶点删除边删除 最有效!面删除,基于边删除的顶点简化,兔子模型的四个层次,LOD Models,渐进网格和连续多分辨率绘制技术

6、,对于数据量庞大的复杂模型 LOD模型只能预先产生多个间断的简化模型 引起实时绘制时图形画面的跳跃 为克服LOD的缺点,Huppe等人于1995年提出 渐进网格技术(Progressive Mesh) 预计算简化过程中原顶点和新顶点的关系 由基本网格模型逐步恢复模型细节,示例: SpeedTree的LOD过渡,示例: SpeedTree的LOD过渡,示例:SpeedTree的LOD过渡,Demo1,Demo2,场景的可见性判断,可见性判断算法分类,遮挡面剔除技术,遮挡面剔除技术,适用于人造建筑物少的室外场景 代表性算法:基于阴影体技术,(左)遮挡剔除之前;(右)基于阴影体的遮挡剔除,包围球加速

7、,(左)球A 至少在一个平面之外,球B在所有平面之内,但其半径大于球心到其中一个平面的距离,球C在所有平面之后且到所有平面的距离足够大。(右)一种包围球没有被完全遮挡但包围盒被完全遮挡的情形,故物体不应被绘制,可见性计算,可见性(Visibility)算法用于决定场景中可能可见的物体 一般的:保守地指定这些物体并将他们发送到图形绘制引擎 确切的可见性决定对于游戏而言是可能的,但是代价太大 因此,存在平衡:在软件中进行可见性判断的时间和在硬件中绘制多余的不可见物体的代价 最简单的就是绘制引擎本身自带的视域裁剪算法 但是这个算法对于高度复杂性的场景并不合适,特别当很多物体位于单个象素之后 比如,第

8、一人称视角游戏中常见的建筑物具有高度的深度复杂性。,区分可见性信息,Cell-to-Cell 可见性 告知在一个cell中的某点处是否可以看到其他的房间 但是无法知道每个房间的那个部分可能是可见的,也无法知道观察者在这个房间的哪个地方可以见到另外的房间 Cell-to-Region 可见性 可以知道某点处,其他房间的哪些部分是可见的 Cell-To-Object: 对于某给定的房间,告知哪些物体是可见的。 Eye-To-Region 可见性 记录当前视点处的哪些房间的哪些部分是可见的 同理,Eye-to-Cell 以及 Eye-To-Object,基于入口(Portal)技术的可见性判断,根据

9、单元与单元之间的邻接图,通过深度遍历建立起单元与单元的入口序列,基于入口结构的绘制技术,分为两类 精细型入口绘制方式 粗略型入口绘制技术 优点 方便定义场景 快速绘制 缺点 消耗大量的内存,换取效率的提高 不适合室外渲染,Cell-Portal 结构,许多可见性算法假设单元和入口的数据结构 数据结构类似于一个图:节点是房间,边是入口 Portals本质的意思是两个房间的墙之间存在洞 Portal 形状一般是多边形 两个房间之间也可有多个Portals 如何建立这个数据图? Kd-trees 或者BSP树用于生成cell结构以及寻找与之相关的 portals 自动或者手工生成 建筑物最合适这种情

10、况,Cell Portal 实例,Portals 可以是房间的边缘(即墙壁) Graph一般保存相邻信息 每个房间保留其外向的边(即portals),A,B,C,D,E,F,A,B,C,D,E,F,Cell-Portal 可见性,跟踪观察者所在的房间 然后遍历graph穷举所有可见的区域 可以预处理,对每一个房间计算可能可见集合potentially visible set (PVS) Cell-to-region 可见性,或者 cell-to-object 可见性 也可以在运行之间更进一步地精确获得可见集合 从已知观察者的位置出发 Eye-to-region 或者 Eye-to-cell 可

11、见性 平衡:节省下列的时间 vs. 计算小的可能可见集合的代价 与所在环境有关,如房间的尺寸、房间物体的个数,PVS:可能可见集,PVS: 对于某个特定的房间,可能可以看到的房间/区域/物体/多边形 一般地,保存可以看见的物体的标识号 也要考虑内存的因素 预处理的计算过程 应该能良好地管理动态变化的物体列表 用法: 可见性确定 对于当前房间,绘制所有PVS中的多边形 做为第一步:获得可能相关的区域,并做进一步处理,Cell-to-Cell PVS,Cell A 在 B的 PVS中,当且仅当存在一根线,从B出发射到A,并且在途中与任何物体不相交 隔壁房间理所当然在PVS之中,I 的PVS 包括:

12、 B, C, E, F, H, J,Stab 树,这个树状结构表示: 当前房间的PVS 一个串着的相关的portal序列 在进一步的可见性处理中 可以减少需要检查处理的cells/portals 数目,A,C,D,E,A/C,C/D1,C/D2,C/E,A,B,C,D,E,F,D,F,D/F,Cell-to-Cell的用法,大多数算法比cell-to-cell可见性算法更复杂 因为它过估计 当实际上99.6%的模型应该是不可见的时候,仅排除了大约90%的模型, 而更好的算法可以排除98% 但是,保持cell-to-cell可见性有利于动态物体 当房间中有一个移动的物体 并且房间是静态的,Cel

13、l-to-Cell的缺点,存在的问题: 将一个房间中的所有物体都标记为可能可见,尽管只有一小部分是可能可见 如果我们要列出可能可见集意味着我们要将这个房间中的所有物体都列出来。 并没有考虑到观察者的位置,无法报告观察者可能看不到的物体 进一步处理可以解决这个问题,Cell-To-Region 可见性,记录房间中某点处可能可见的某个房间的某个区域 因此,只绘制这个区域中的物体 关键想法视设置隔离平面(对于二维,就是隔离线):,如果将左边的portal视为光源,动态可见性处理,PVS 完全是一个预处理过程 在运行时刻,只需要绘制PVS即可 更进一步的优化是做进一步处理 有时候由PVS指导 大多数游

14、戏不这么做 一个可能的办法是观察者的位置已知,因此可以使用 Eye-to-Region的可见性,Eye-to-Region (1),View,Eye-to-Region (2),没有Cell 或者Portals怎么办?,很多场景并没有好的cell和portal结构 场景中没有大的共面多边形去做为遮挡器或者房间的墙 例如森林-你无法看到后面的场景,但是总不能设置叶子为Cell 解决方案? 定义一些遮挡物体,称为occluders并利用他们来剔除几何物体,Occluders,若 occluder是一个多边形 否则,使用物体的侧影轮廓线 从视点和多边形的边构成裁剪平面 也叫支撑平面:Supporti

15、ng planes 所有在支撑平面内部的是不可见的 Occluder自身是一个裁剪平面 位于其外部的是可见的,eye,occluder,supporting planes,Occluders(续),Occluders 一般在预处理阶段获得 选择的标准? 如果它遮挡了很多物体 如果大的多边形与视点很近,该方法很有效 场景中的一些物体也可以融合起来形成大的occluders 例如,将很多树的billboards融合 occluding 多边形可以任意指定,但是,每一occluder 只对某一些视点区域有效 问题:如果一个物体被某个occluder部分遮挡,又被另外一个部分遮挡, 那么很难决定是否该

16、物体被全部遮挡,Occluders(续),用多个occluders来隐藏一个物体是一个很有趣的问题 Hierarchical Z-Buffer 方法在图像(屏幕)空间建立遮挡子 需要特殊的图形硬件与软件实现 张寒松的Hierarchical Occlusion Maps(层次遮挡图) 将遮挡子绘制到一个纹理图中,然后将物体与纹理比较 Schaufler Occluder Fusion 建立一个被遮挡区域的空间数据结构,真实的游戏场景,当打开遮挡面剔除时,仅需绘制7,000个三角形,帧率为50fps。 当遮挡面剔除关闭时,三角形绘制数目增长到17,300, 帧率下降到20 fps,地形场景的绘制

17、与漫游,(上左)地形的基础三角网格; (上右)高度图; (下左)应用高度图后的地形网格; (下右)渲染后的地形图,游戏中的地形场景,地形绘制,基于四叉树的绘制方法 利用图形硬件加速 绘制模式 保留模式 立即模式 绘制优化 使用场景的层次剖分技术进行视域剔除 消除对画面贡献极小的多边形,自适应的四叉树剖分,根据当前节点的误差度量判断是否需要继续剖分 可能在两个相连的节点之间产生漏洞 解决方法 保证两个相邻节点之间最多相差1个层次 保证两个相邻的边拥有相同的顶点数目,地形绘制的优化,动态层次细节算法 缺点 层次之间切换会产生跳跃感 几何变形法 具有光滑过渡的视觉效果,地形绘制中的难题,存储量大,内

18、存消耗太多 解决的方法 细节纹理 细节纹理的拼接具有很大的挑战性!,利用细节纹理技术的地形绘制实例,OGRE的场景树,OGRE中的场景管理,在OGRE中场景管理器的类型有四种: ST_GENERIC 普通场景 ST_EXTERIOR_CLOSE 室外封闭场景 ST_EXTERIOR_FAR 室外无限场景 ST_INTERIOR 室内场景,室内场景,首先读入地图包。代码如下 BspApplication() / Load Quake3 locations from a fileConfigFile cf;cf.load(“quake3settings.cfg“);mQuakePk3 = cf.g

19、etSetting(“Pak0Location“);mQuakeLevel = cf.getSetting(“Map“); ,选择正确的场景管理器,void chooseSceneManager(void)mSceneMgr = mRoot- getSceneManager(ST_INTERIOR);,最后是创建场景,void createScene(void) / Load world geometrymSceneMgr-setWorldGeometry(mQuakeLevel);/ modify camera for close workmCamera-setNearClipDistanc

20、e(4);mCamera-setFarClipDistance(4000);/ Also change position, and set Quake-type orientation/ Get random player start pointViewPoint vp = mSceneMgr-getSuggestedViewpoint(true);mCamera-setPosition(vp.position);mCamera-pitch(90); / Quake uses X/Y horizon, Z upmCamera-rotate(vp.orientation);/ Dont yaw

21、along variable axis, causes leaningmCamera-setFixedYawAxis(true, Vector3:UNIT_Z);,室外场景,OGRE在其引擎提供的Plugin_OctreeSceneManager.dll插件中提供了通过八叉树算法实现的ST_EXTERIOR_CLOSE室外封闭场景管理器。,室外场景,室外场景漫游,首先需要选择室外场景管理器,代码如下: virtual void chooseSceneManager(void) / Get the SceneManager, in this case a generic onemSceneMgr

22、 = mRoot-getSceneManager( ST_EXTERIOR_CLOSE ); ,室外场景漫游,选择好室外场景管理器后,通过该场景管理器创建场景就可以了。 void createScene(void)/ Set ambient lightmSceneMgr-setAmbientLight(ColourValue(0.5, 0.5, 0.5);/ Create a lightLight* l = mSceneMgr-createLight(“MainLight“);/ Accept default settings: point light, white diffuse, just

23、 set position/ NB I could attach the light to a SceneNode if I wanted it to move automatically with/ other objects, but I dontl-setPosition(20,80,50);mSceneMgr - setWorldGeometry( “terrain.cfg“ );mSceneMgr-setFog( FOG_EXP2, ColourValue:White, .008, 0, 250 );mRoot - showDebugOverlay( true ); ,White&B

24、lack,碰撞检测,碰撞检测问题 是机器人、动画仿真、虚拟现实等领域不可回避的问题基本任务 确定两个或多个物体彼此之间是否发生接触或穿透。起源 早期在机器人路径规划、自动装配规划等领域中,为检测机器人与场景中的物体或零件与零件之间是否发生碰撞,产生了一系列碰撞检测算法。,碰撞检测算法分类,从两个角度对碰撞检测算法进行分类 从时间域的角度来分 从空间域的角度来分,基于时间域的碰撞检测算法分类,分为静态、离散和连续的碰撞检测算法 静态碰撞检测算法 静止状态下进行碰撞检测 Dobkin 1985Agarwal 1991Chazelle 1989 离散碰撞检测算法 在每一时间的离散点上进行碰撞检测 是

25、研究的重点和热点 Lin 1998Jimnez 2001,基于时间域的碰撞检测算法分类,离散碰撞检测算法 存在问题 存在刺穿现象 遗漏应该发生的碰撞 连续碰撞检测算法 连续的时间间隔内进行碰撞检测 计算速度还太慢 Cameron 1990Canny 1986Redon 2001Redon 2002a,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 基于图象空间的碰撞检测算法,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用一般表示模型的碰撞检测算法 采用空间结构的碰撞检测算法,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用一般表示模型的碰撞检测算法 多边

26、形表示模型 多边形集合,结构化表示模型 非多边形表示模型 CSG表示模型,隐函数曲面,参数曲面,体表示模型,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用一般表示模型的碰撞检测算法 面向多边形表示模型的碰撞检测算法 Hubbard 1995Gottschalk 1996 Klosowski 1998Zachmann 1998 面向凸体的碰撞检测算法,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 面向凸体的碰撞检测算法 基于特征的碰撞检测算法 Lin-Canny的“最邻近特征算法”Lin 1991, Lin1993 Lin 1995, Cohen 1995, Chun

27、g 1996, Mirtich 1998, Ehmann 2000, Ehmann 2001 基于单纯形(Simplex)的碰撞检测算法 Gilbert、Johnson和Keerthi Gilbert 1988Gilbert 1990提出的GJK算法 Cameron 1997Bergen 1999,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用一般表示模型的碰撞检测算法 面向CSG表示模型 Zeiller 1993Su 1996Poutain 2001 面向隐函数曲面表示 Farouki 1989Miller 1991Shene 1991 面向参数曲面表示 非均匀有理B样条曲线

28、(NURBS) Turnbull 1998 体表示模型 主要用于虚拟手术中可变形物体的碰撞检测 Heidelb 2003Boyles1999魏迎梅 2001,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用一般表示模型的碰撞检测算法 采用空间结构的碰撞检测算法 空间剖分法(space decomposition) 均匀剖分、BSP树、k-d树和八叉树(Octree)等Samet 1989Naylor 1990Bourma 1991 层次包围体树法(hierarchical bounding volume trees),基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用

29、空间结构的碰撞检测算法 层次包围体树法,包围体类型的不同来加以区分 层次包围球树Hubbard 1993Hubbard 1995Palmer 1995OSullivan 1999、 AABB层次树(Aligned Axis Bounding Box)Zachmann 1997Bergen 1997Larsson 2001、 OBB层次树(Oriented Bounding Box)Gottschalk 1996 k-dop层次树(Discrete Orientation Polytope)Klosowski 1998Zachmann 1998 QuOSPO 层次树(Quantized Orie

30、ntation Slabs with Primary Orientations) He 1999 凸块层次树Ehmann 2001 混合层次包围体树Wan 2001等等,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 采用空间结构的碰撞检测算法 层次包围体树法,包围体类型的不同来加以区分,(a) 包围球 (b) AABB包围盒 (c)OBB包围盒 (d) 6-dop包围体 (e)凸包包围体 包围体二维示意图,基于空间域的碰撞检测算法分类,基于物体空间的碰撞检测算法 基于图象空间的碰撞检测算法 利用图形硬件 对物体的二维图象采样 相应的深度信息,基于空间域的碰撞检测算法分类,基于图象空间的碰撞检测算法 Shinya等Shinya 1991和Rossignac等Rossignac 1992 Myszkowski等Myszkow 1995 Baciu等Baciu 1997Baciu 1999 Hoff等Hoff 2001,Kim等Kim 2002, Lombardo 1999,Vassilev 2001,Heidelb 2003,Govindar 2003 基于可编程图形硬件.,粒子聚类的碰撞检测,碰撞检测算法框架,归纳出一个统一的碰撞检测算法框架,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 游戏攻略

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报