博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转)场景管理
阅读量:5294 次
发布时间:2019-06-14

本文共 1446 字,大约阅读时间需要 4 分钟。

原文地址:

一、场景管理有很多种方法,如四叉树、八叉树、BSP、模糊K-D树、包围球层次结构等。室内环境主要是BSP为主,从quake3一直延续到现在主流的引擎都是以BSP为基础,BSP使用并不难,关键是数据的生成,这就牵涉到场景编辑器。 

   Quake3、Unreal:BSP,有自己的编辑器。

   FarCry:场景分为室内和室外两部分,室内场景使用BSP, 室外不清楚但应该跟地形有很大关系,同时为了支持超远距离视距使用了地形Occlusion Culling,另外也可以手动放置OcclusionArea。

   RenderWare:模糊K-D树,内置了很多种K-D树切割方法,读者可以借鉴到自己的引擎,我自己试过把标准的RenderWare K-D树生成代码移植到Gamebryo,RW的切割还是很有技巧的。
   GameBryo: 包围球层次结构,可以根据自己的需要进行修改。
    二、基于地形、室外为主的MMO网游,个人认为还是用四叉树进行场景管理。之 前我们也尝试K-D树,问题是室外的实体太多了,而且实体非常密集,无论怎么切割,生成的K-D树深度都不能承受,毕竟实体不是点。八叉树也没必要,普通 的一张512*512地图,实在没必要在Z轴上继续划分。提升效率的另外一个途径是Occlusion Culling,OC算法有很多。在场景编辑器或美术导出的时候指定PlanarOccluder,渲染之前进行遮挡检测。最明显的例子就是城墙,在城外 打怪的时候望向城墙,城内的实体就不应该被渲染。目前有专门的OC中间件Umbra,Gamebryo集成了该插件。

 

    三、目前我的做法,主要介绍下室外四叉树,室内及室内室外衔接做完了再做介绍。

 

   场景元素:

   1.地形,由Tile组成。

   2.静态实体,指WorldBound固定不变的实体,如静止的房屋。

   3.动态实体,指WorldBound变化的实体,如烟雾特效、天生飞翔的老鹰。

 

   场景层次结构:

   1.场景实体全部处于同一级;

   2.地形按四叉树组织
   3.地形四叉树的叶子节点Tile包含处于该TileAABB内的所有静态场景实体列表;一个静态实体有可能跨多个Tile

 

   场景更新:

    静态物体:

1. 当添加实体的时候,根据实体的世界坐标及AABB,可确定实体处在哪些Tile,并更新相应Tile的实体列表索引。

2. 当删除实体的时候,遍历所有的地形Tile,更新实体列表索引。

3.   当移动、旋转、缩放即WorldBound变化的时候,马上更新相应Tile实体列表索引。编辑器、游戏内都一样。

            对于动态物体,没有特殊处理,进行最简单也是低效的视椎体裁剪。

 

   剔除及次序:

 

    1.地形四叉树剔除,确定可视VisTileList

    2.静态物体:遍历可视VisTileList,地形Tile的实体进行视椎体裁剪,获得VisEntityList
    3.动态物体:视椎体裁剪,添加到VisEntityList
    4.所有实体包括Tile跟PlaneOccluder进行OcclusionCull

 

   场景渲染及次序:

    1.先绘制ui

    2.绘制VisEntityList的非透明实体,被渲染的实体更新当前帧数避免重复渲染。

    3.绘制地形。

    4.绘制VisEntityList的透明实体,被渲染的实体更新当前帧数避免重复渲染。

    5.最后绘制天空盒

转载于:https://www.cnblogs.com/mazhenyu/archive/2013/03/14/2959270.html

你可能感兴趣的文章
Sqli labs系列-less-4 这关好坑!!!
查看>>
路由跟踪工具0trace
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
T-SQL触发器,限制一次只能删除一条数据
查看>>
boost库使用:vs2013下boost::container::vector编译出错解决
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
理解运算符重载 4
查看>>
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
断言简介
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>
数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
查看>>
使用pager进行分页
查看>>
吐医疗器械研发可配置性需求的槽点
查看>>
UVA - 1592 Database
查看>>