天天看点

关于地形编辑器的一些想法

最近看了一些引擎的地形编辑器和文章,特别针对了评价相当高的Far Cry的Sandbox。觉得对于一个完整的引擎类作品来说,地形编辑器真的很重要,因为合适的地形编辑器有助于更好地展现引擎的效果。

下面是我在各方面的一些想法:

1.  UI方面

UI方面最重要的是人性化。现在的编辑器已经逐渐脱离了3DMAX的框架,不仅突出了透视图,而且把地形、植被、人物、脚本等做成面板放在显要的位置,使用户更容易上手。

其中Sandbox已经成为很多朋友设计编辑器的蓝本。他不仅功能齐全,还把一些重要的功能做成按钮。Freeworld3D在地形面板提供的鼠标直接拉伸地形也很方便,但是为地形添加纹理的时候就显得相对困难了。而像涂鸦的起点编辑器那样没有地形生成的直接面板就显得比较麻烦了。

除了继续支持透视图和分类面板外,我觉得编辑器除人物和脚本外的实体都可以添加自动生成和调节的功能。

2.  地形方面

地形生成的时候我比较推崇灰度图,因为它比较直观而且可以满足大部分的需要。而在生成后,再向BSP或者其他的组织形式转换。我觉得如果像FarCry这样的偏向室外场景的游戏,HeightMap就可以应付了,而且还可以适应像ClipMap这样的渲染方案。当然像Freeworld3D采用多层地形可以解决空间问题,不过我觉得就地形而言似乎没必要。

在地形的自动生成方面,我比较熟悉的有分形和Perlin Noise,2种算法的速度都不错。对比Sandbox里边自动生成的地形,我觉得以上2种算法是可以接受的。分形的好处在于在开始的时候我们可以自己设定种子,这样就可以让用户定义地形的类型或者大致的起伏,这可能可以成为一个新的功能;而Perlin Noise可以在添加噪音方面起到作用。

地形的微调方面,我觉得Sandbox的刷子不是很好掌握,而Freeworld3D的几个拉伸函数效果似乎更好些,而且以线框图的形式微调比较容易。

在用户手工绘制地形高度图的时候,地形一般都呈现成曲线的形状,但这样的地形不是很逼真,因为山地是带有岩石特性的,所以在生成的时候应该加入折痕的效果(如图1)。我希望能用平滑然后细分的方式做出这种效果,当然效果的范围可以由用户选择。

图1 PugetSound的截图

除了山地外,场景还应该包含河流。我在SandBox等编辑器里边都没有找到单独的河流生成功能,但是我觉得它是应该存在的,因为河流的的生成是跟地形的高度相关的。所以,如果可以的话我能加入河流生成功能,根据地形的走势生成河流。

而在地形基本生成后,我比较期待在地形上的pick功能,跟Freeworld3D的pick类似,但是我更希望可以拾取一定坡度或者高度的以片地形,这样就可以选中一个带的区域或者一片悬崖之类的地形,这样可以直接对其进行微调或者纹理编辑。

3.  纹理方面

比起地形来,现在很多编辑器的纹理编辑功能都大同小异了,基本上都有分层纹理和纹理刷。

我试了下Sandbox的纹理编辑,顺便截了以下几个图:

图2

图3                                                                        图4

从图2和图3可以看出生成纹理时Sandbox的贴图方式。贴图的方案很直观,不用我解释,我有以下观点:

首先,虽然Sandbox每层纹理中都含细节纹理,但是图2那样容易产生大量的纹理重复,让人感觉失真。所以我觉得可以参考我们WereU里边提到的纹理向上抽样+扰动的方案,对每格纹理都进行一定随机的微调。

从图3中可以看出纹理生成是不同纹理间是没有过渡的,这样可能会产生一条很明显的分界线而需要美工人员去手工调整,所以我觉得应该增加过渡区,过渡区不是简单的插值alpha混合,而是能像图4的纹理刷一样的效果,而且过渡区可以不在一个水平线上,比如在北半球,南面的植被过渡区应该比北边的过渡区高。

此外,在纹理生成的时候,算法得注意优化。由于纹理是分层的,所以生成表面纹理的运算量比较大,256×256的地图在我 512M 内存的机子上用了1-2分钟,而这样的速度其实已经算快的了。我在网上找到了一些关于优化方面的讨论,主要是合成的时候采用数组预存的方式。

4.  植被方面

Sandbox里边的植被是采用“混合种植”的方式,这在网上受到很多人的好评。我用起来也觉得相对好用很多。在这方面我想的比较多是参考人工生命的模式在地图上添加大规模的植物群,主要是可以减少一块块植物添加的麻烦以及改进同一种植物模型完全一致的效果,但具体的添加方式得和美工方面的人员请教后才能确定。

5.  连接方面

现在比较流行的关于连接的技术主要包括:地形的无缝连接,无限地形,室内外的不同空间的无缝切换。

前两者是针对现在游戏地形的不断增大而提出来的,而大规模地形只能采取分块存储的方式,再采用displacement或者clipmap之类方法拼合起来。

所以我觉得在编辑器里边也可以采取分块存取的方法来应对大规模的地形。在引入新地形块时候必须使它的边缘跟相邻的旧块高程一致来完成连接。

无限地形的话一般都是利用原地形的镜像来做的,因此可以采用跟处理分块地形类似的方法实现。

在处理块过渡的时候clipmap可能会有些麻烦。

此外,可能还需要建立不同分辨率的地形数据。

而室内外的无缝切换的具体实现后很多方案,据说FarCry用的BSP。不同方案个人认为只是速度不同,像有些朋友将不同空间放在不同的场景管理器里边最后还是可以实现的。所以,在做跟深入的研究跟实验之前,我不敢妄加讨论。

继续阅读