对各种场景编辑器中地形编辑的分析

来源:互联网 发布:腾讯地图api js定位 编辑:程序博客网 时间:2024/05/05 22:18

概述(Absent)

本文从地形生成、高程编辑、纹理生成混合、植物种植、无缝拼接、超大规模/无限场景等方面简单地分析了现行各种场景编辑器中地形编辑分析的表现,并简单介绍一下我们自行研发的场景编辑器及其地形编辑、多分辨率分析组织方案。

 

关键字(Keywords):编辑器、场景编辑、地形生成、无缝拼接、无限场景

引入(Introduce)

对一个完整的引擎类作品来说,场景编辑器是一个基本工具,因为合适的场景编辑器有助于更好地展现引擎的效果。

 

现在的场景编辑器很多,包括游戏带的关卡编辑器(如FarCry),引擎软件带的编辑器(如TrueVision),以及一些爱好者编写的编辑器(如Freeworld3D)。最出名的是FarCrySandboxUnreal的场景编辑器。其中Unreal是商业引擎,所以编辑器比较难下载。我主要对比的是Sandbox编辑器,开源的Freeworld3D编辑器,以及国内涂鸦的起点编辑器。

 

其中Sandbox已经成为很多朋友设计编辑器的蓝本,不仅功能齐全,在功能的编排上也充分考虑到可操作性。Freeworld3D在地形面板提供的鼠标直接拉伸地形以及提供透视图不同渲染方式的切换可以很好地方便用户,但是为地形添加纹理的时候显得相对困难。而起点编辑器则缺少直接地形生成面板。

 

一般的场景编辑器都主要分为地形、纹理、实体(如植被)、AI(如人物)等主要面板,在面板中包含生成功能和调节编辑功能。本文主要讨论地形的编辑方面。一般编辑器的地形的制作过程是:用户制定地图大小->生成灰度图或者网格图->对地形进行微调->设置纹理层->计算纹理->纹理微调->完成。目前场景编辑器的主要缺点是缺少一些自动生成的功能,生成的场景缺乏真实感,需要美工人员花大量精力进行调整。

1、地形生成

地形生成的时候一般先生成灰度图或者拓扑图(网格图)。Sandbox是以灰度图的形式生成地形的。这样的优点是在生成的过程直观快捷,例如用户可以在2D平面上用刷子画高度图,而且可以以纹理的形式快速存取。而FarCry等偏向室外场景的游戏,先生成灰度图是比较理想的方案。而且可以生成后再向其他的组织形式转换,可以统一分割成BSP形式,还可以适应像Clipmap这样的渲染方案。此外,Freeworld3D提供了多层地形,这样可以解决空间上的地形层叠问题。

 

Sandbox带有地形自动生成的功能,但生成的地形都偏向岛屿。我比较熟悉的有分形和Perlin Noise。对比Sandbox里边自动生成的地形,我觉得以上2种算法在速度上是可以接受的。分形的好处在于在开始的时候我们可以自己设定种子,这样就可以让用户定义地形的类型或者大致的起伏,这可能可以成为一个新的功能;而Perlin Noise可以在添加噪音方面起到作用。地形的微调过程中,编辑器一般都提供了“刷子”的功能,可以用来拉伸地形。但是不同编辑器刷子的效果相差较大,估计是平滑函数不同的关系。例如Sandbox的刷子比较容易刷出三角形的平面,而Freeworld3D在每个顶点高度调整时都会引发周围地形的平滑。我觉得Freeworld3D的平滑功能及线框图的形式在微调时可以带来更好的效果。在用户手工绘制地形高度图的时候,地形一般都呈现成曲线的形状,但山地是带有岩石特性的,所以在在山峰处容易产生折痕的效果(如图1)。我希望能用平滑然后细分的方式做出这种效果,当然效果的范围可以由用户选择。

1 我们自行开发的WorldExplor载入PugetSound浏览时的截图

 

除了山地外,场景还应该包含河流。我在SandBox等编辑器里边都没有找到单独的河流生成功能。我觉得在地形生成的时候可以考虑加入在制定区域河流生成的功能,因为河流的的生成是跟地形的高度相关的。即让用户决定河流的起源及大致流经地,然后根据地形的走势生成河流。为了方便微调,编辑器一般允许用户用在透视图的状态下鼠标拾取一小块地形进行调整,这用mousepick就可以实现。我觉得还可以增加拾取一定坡度或者高度的以片地形的功能,这样就可以选中一个带的区域或者一片悬崖之类的地形,这样可以直接对其进行微调或者纹理编辑。

 

2、地表纹理编辑

比起地形来,现在很多编辑器的纹理编辑功能和流程都大同小异了,基本上都采用分层纹理混合和纹理刷。以下是我在Sandbox生成纹理时的截图:

2

                         

3                                                                             4

 

从图2和图3可以看出生成纹理时Sandbox的贴图方式。贴图的方案很直观,无须解释,我有以下观点:首先,虽然Sandbox每层纹理中都含细节纹理,但是图2那样容易产生大量的纹理重复,让人感觉失真。所以我觉得可以参考我们WereU里边提到的纹理向上抽样+扰动的方案,对每格纹理都进行一定随机的微调。从图3中可以看出纹理生成时不同纹理间是没有过渡的,这样可能会产生一条很明显的分界线而需要美工人员去手工调整,所以我觉得应该增加过渡区,过渡区不是简单的插值或者alpha混合,而是能像图4的纹理刷一样的效果,而且过渡区可以不在一个水平线上,比如在北半球,南面的植被过渡区应该比北边的过渡区高。此外,在纹理生成的时候,算法得注意优化。由于纹理是分层的,所以生成表面纹理的运算量比较大,256×256的地图在我512M内存的机子上用了12分钟,而这样的速度其实已经算快的了。我在网上找到了一些关于优化方面的讨论,主要是合成的时候采用数组预存的方式。

 

3、植物覆盖种植

一般的场景都有大量的植物覆盖,所以对比起其他实体,植物更需要在大规模添加时的操作优化。Sandbox里边的植被是采用“混合种植”的方式,即把多个植物模型设在同一个刷子上,往地形上一次性添加。除了“混合种植”的优化外,我觉得可以参考人工生命的模式在地图上添加大规模的植物群,主要是可以减少一块块植物添加的麻烦以及改进同一种植物模型完全一致的效果。

 

4、无缝拼接、无限地形

现在较多关注的大规模/无限地形组织技术主要涉及地形的无缝连接,无限场景组织,室内场景的拓扑连接和切换。前两者是针对现在游戏地形的不断增大而提出来的,而大规模地形只能采取分块/分层/金字塔存储方式,再采用多级多分辨率LODDisplacement Mapping或者Geometry Clipmap之类方法拼合起来。因此,在编辑器里采取分块存取的方法来应对大规模的地形。在引入新地形块时候必须使它的边缘跟相邻的旧块高程一致来完成连接。无限地形的话一般都是利用原地形的镜像来做的,因此可以采用跟处理分块地形类似的方法实现。在处理块过渡的时候clipmap可能会有些麻烦。此外,可能还需要建立不同分辨率的地形数据。而室内外的无缝切换的技术实现的并不多(或者说我孤陋寡闻)。FarCry中使用Heightfield管理室外场景,对室内场景采用BSP组织,并没有做到拓扑上的无缝切换。HalfLife2从室内场景设计出发,把整个场景以BSP方式组织,而对于室外地形,则对应二分后每个Surface采用Displacement的形式衔接,同一Surface四角点值相同。

附:我刚做的场景编辑器的界面截图