第九章 Terrain地形.docx
《第九章 Terrain地形.docx》由会员分享,可在线阅读,更多相关《第九章 Terrain地形.docx(71页珍藏版)》请在冰豆网上搜索。
第九章Terrain地形
第九章Terrain地形
第九章Terrain地形
第九章:
Terrain(地形)
9.1什么是地形?
Terrain(地形),就像所有《Unreal》中的其他内容一样,是一种actor。
这种地形actor可以为室外关卡创造出逼真得地貌。
具体而言,这种actor就是一片依靠高度图来控制自身形状的几何体。
高度图简而言之就是一种灰度级图像,有点类似于地形图,用以决定海拔高度。
图9.1——地形令您的室外关卡更加栩栩如生。
图9.2——左图是高度图,右图则是由它创建的地形。
地形actor的几何体在游戏运行时网格动态生成,这就意味着地形内多边形的数量——即物理细节的数量——是持续变化的。
此种变化依赖于对于地形中某区域的接近程度。
如果玩家接近地形中的某个区域,对此区域的动态生成的网格数量就会增加,从而可以看到此地形的更多细节。
而当玩家远离那个区域时,动态生成的网格数量就会减少,也就是说那一区域的物理细节就会减少。
如此一来随着距离越来越远,远处地形的物理细节也逐渐减少,从而减少了运算量。
9.2进入地形编辑
在地图中创建地形其实是一个非常简便的过程,不过要使您的地形设计如愿以偿,就需要花一番功夫了。
地形actor可以在Actor类浏览器下的“Actor>Info>Terrain”内找到。
一旦放置好地形actor,就可以和其他actor一样使用属性窗口来改变地形属性。
按F4显示属性窗口。
图9.3——地形在刚创建时就像一张平板纸。
要通过改变物理形状来编辑地形,必须先用地形编辑对话框调整地形的高度图。
点击工具箱中的“TerrainEditingMode”(地形编辑模式)图标可以弹出此对话框。
地形编辑对话框会在之后的第9.5节深入探讨。
图9.4——以类似画笔的方式编辑地形。
地形的外形也可以通过导入外部软件(比如AdobePhotoshop)制作的高度图来创建。
稍后我们会对此方法进行讲解。
指南9.1创建第一个地形
1.运行UnrealEd,选择“File>New”创建一个新地图。
弹出对话框时选择添加。
2.打开Actor类别浏览器。
在Actor浏览器中选择“Actor->Info->Terrain”。
图9.5——地形Actor在Info项下。
3.右击Top视口(鸟瞰视口),选择“AddTerrainHere”(在此添加地形),在地图上放置新的地形。
图9.6——请注意已出现了一个地形图标。
4.选中地形后按F4打开其属性窗口。
在地形区域下方把NumPatchesX(Xpatches数量)和NumPatchesX(Ypatches数量)的属性设置为128。
图9.7——打上patches后的地形会变得很大。
5.回到Actor类别浏览器中,在Actor浏览器中选择“Actor-〉Light-〉DirectionalLight”,在视口中的地形上右击选择“AddDirectionalLightHere”(在此添加定向光源)在地图中放置定向光源。
沿Y轴旋转定向光源约20度,将它指向下方的地形。
图9.8——添加定向光源能帮助我们看清地形的轮廓。
注意:
可能需要将视图模式变为“Wireframe”(线框)或“Unlit”(无光照)模式才能看清地形,用以对地形进行右击。
记得创建定向光源后把视图模式变回原来的“Lit”(光照)模式。
6.保存关卡。
此时您的地形仍是非常乏味的。
在下面的指南中,我们会介绍“TerrainEditingMode”(地形编辑模式),向您展示塑造地形的基础知识。
<<<<指南结束>>>>
指南9.2编辑第一个地形
在尝试此篇指南前请先完成指南9.1。
1.按下工具箱中的“TerrainEditingMode”(地形编辑模式)按钮,打开地形编辑器。
之后会弹出地形编辑对话框,这个对话框可以提供所有的地形编辑功能。
稍后本章会对此对话框进行深入探讨。
图9.9——地形编辑对话框会在进入地形编辑模式后出现。
2.在GenericBrowser中打开“Terrain_Demo”(地形演示)文件包,演示包在本教程配套的DVD中。
选择“tls_base”地形层设置(TerrainLayerSetup)。
这是非常基本的图层设置,它包含3种用于地形斜坡的材质。
3.在地形编辑器对话框内右击地形浏览器区域,看起来像一个宽的灰色盒子,在靠近地形编辑器对话框的底部,选择“AddSelectedLayer”(添加已选图层),弹出对话框后键入名称Layer0,这样就可以把GenericBrowser中选中的地形层设置添加到地形中。
此时的地形应该加有草地材质的渲染。
图9.10——在地形浏览区域内选取关联菜单中的“AddSelected”(添加已选)。
注意:
可能需要把鼠标移到perspective视口(透视视口)上才能显示更新与新赋予的材质。
4.在地形编辑对话框的浏览区域,点击高度图层,在地形编辑器的工具栏中选择“PaintTool”(绘制工具)。
在设置区域把半径和落差分别设置为512和384。
按住Ctrl键,点击鼠标的左键或右键,拖动鼠标以设置的半径的距离单位抬高或下压地形顶点。
通过设置不同的半径和落差值,此工具可以在地形上建立一些山丘。
注意在绘制山丘时的贴图变化。
图9.11——可以用鼠标左右键对地形进行抬升与下压。
5.切换到“Flattentool”(地形平整工具),分别设置半径和落差为512和384。
将鼠标放在山侧约一半的高度,按住Ctrl键,同时按下鼠标左键就可以在山的旁边创建一个高原。
图9.12——地形平整工具创建的高原效果图。
6.地形平整工具会大幅改动相邻顶点间的高度,由于贴附于地形上材质的拉伸所以这种改变是很显眼的。
为了修复此问题,可以选择“SmoothTool”(平滑工具),同时按下Ctrl键与鼠标左键将鼠标沿高原边缘环绕拖曳。
您还需要调整半径和落差值将平滑限制在一个很小的范围内,这样就能在平滑高原边缘的同时保持其整体形状。
图9.13——使用平滑工具平滑高原的边缘。
7.此时您已经创建了一个基本地形并可以对其测试了。
重建地图,使用“PlayInEditor”(在编辑器中游戏)功能,测试新地形。
除了强度,半径和落差设置外,您还可以尝试使用其他的地形编辑工具。
<<<<指南结束>>>>
9.3地形剖析与属性
在完全掌握地形创建系统所有的功能之前,必须了解许多术语和属性。
本节在涵盖关键属性,用以进行有效地形设计的同时,重点讲解重要的地形组件
TerrainAnatomy(地形剖析)(术语解释)
Patches
地形几何体构成实际上就是一系列三角形的拼接体。
一对三角形形成一个四边形。
这些小四边形就被称作Patches。
Components
Components是一组patches,当计算碰撞和遮挡时作为一个实体考虑。
HeightMap(高度图)
高度图是一种灰度图,它的像素值被映射到相应的地形的几何顶点上成为高度信息。
由于顶点的数量在各个方向上总是比Patches的数量大1(就好比要用四根手指头才能在它们之间做出3条空隙),高度图的大小总是等于(XPatches数量+1)×(YPatches数量+1)。
Tessellation(多边形细分)
在使用地形时,多边形细分是指当玩家靠近或远离某个区域时,此区域的地形表面的面数的变化。
简而言之,当玩家走远时,地形的多边形数量会下降——或者说是几何意义上的简化。
这种细节的变化发生在5种不同的距离上,距离越远,多边形细分的下降就越大。
下面介绍的地形属性能完全控制多边形多边形细分的发生方式。
发生范围的默认值如下(以《Unreal》中定义的单位计):
0-1024
1024-2048
2048-4096
4096-8192
8192+
注意:
上述为多边形细分发生范围的默认值,此范围值可通过调节TessellationDistanceScaleproperty(多边形细分距离比例属性)的值进行更改。
图9.14——此图表展示了多边形细分随距离改变而产生的变化。
TerrainProperties(地形属性)
地形
DecoLayers(装饰层)
这个属性是列出所有在地形上使用到的DecoLayers。
DecoLayers会在稍后的第9.7节中具体介绍。
Layers(图层)
此属性列出所有地形中的图层。
图层会在第9.4节中详细描述。
NumPatchesX(Xpatches数量)
此属性决定沿地形X方向的最高级别多边形细分(细节)时的patches(或四边形)数量。
NumPatchesY(Ypatches数量)
此属性决定沿地形Y方向的最高级别多边形细分(细节)时的patches(或四边形)数量。
MaxComponentSize(最大组件尺寸)
此属性设置地形组件的单行patches数量(沿X和Y两方向)。
如果将其设置成4,则每个组件的patches数量就为4乘4。
请牢记,组件就是用于决定遮挡筛选的。
要使地形的某一部分不被渲染,则整个地形组件都必须被遮挡。
若组件尺寸太大,就很难完全遮挡组件,这就意味着地形的有些部分仍然可见,即使他们处于另一个物体的后面。
如果部件尺寸太小,计算遮挡与筛选的处理效能会大大降低。
最大组件尺寸的使用其实就是一种平衡行为。
它的衡量标准主要体现于地形的任何部分在任何特定时间内被遮挡的可能性。
MaxTessellationLevel(最高多边形细分水平)
此属性决定最低多边形细分水平下的单个patch在最高多边形细分水平下能被分解成的patches(四边形)数量。
这个数字必须是1到16之间2的幂,也就是说只能是1,2,4,8,和16。
默认值是4。
如之前在多边形细分中所说明的,UnrealEngine可以根据玩家的距离以5个层次的范围对地形细节进行降格。
在距玩家1024的单位距离(默认),细节进行第一次降格,每一个2X2的方格变成单个patch。
在2048的单位距离,每一个2X2的新方格再浓缩成单个patch。
以此类推,直至原始patches数量浓缩至最高多边形细分水平所规定的数量。
或者换句话说,如果设定最高多边形细分值为8,那么最高细节水平中的64个patches会在最低细节水平中浓缩成1块,假设最低多边形细分水平值为1。
此处提供一个好的经验:
您的地形越平坦,最高多边形细分水平值就可以设得越高。
MinTessellationLevel(最低多边形细分水平)
它代表每个方向上的最大多边形细分所能浓缩到的最小patches数。
因此,如果最大多边形细分水平设为8,最小多边形细分水平设为2,那么一旦完成一系列多边形细分处理,一个8X8的patches组可以降格为2X2的patches组。
如果最低多边形细分水平值等于最高多边形细分水平值,就不再产生任何多边形细分动作,地形会始终保持最高的细节程度。
此数值必须是1到16内2的幂,并且只能小于等于最大多边形细分水平值。
EditorTessellationLevel(编辑器多边形细分水平)
此属性设置在编辑器视口(editor’sviewport)中使用的多边形细分水平。
此数值必须是1到16之内,最低多边形细分水平值与最高多边形细分水平值之间2的次方数。
数值0代表在编辑器视口中使用游戏中的多边形细分算法对地形实行动态分解。
TessellationDistanceScale(多边形细分距离比例)
此属性相当于多边形细分算法的除数,来决定离玩家多近时几何体进行多边形细分。
值越高表明多边形细分发生的位置离玩家越近。
例如,在多边形细分距离比例为2时,第一次多边形细分处理发生在离玩家512单位的地方,而不是默认的1024单位。
NormalMapLayer(法线贴图层)
法线贴图层允许为图层设置一个索引值(以0为基础),此图层中的各种材质的法线贴图会被混合在一起,作为整个地形的法线。
如果值为-1,所有图层的材质的法线贴图都会被混合,用作整个地形的法线。
LightingProperties(光照属性)
bIsOverridingLightResolution/StaticLightingResolution(bIsOverriding光源分辨率/静态光照分辨率)
这两个属性是相互联系的,使您能够精确控制地形中的静态阴影。
bIsOverridingLightResolution取消限制(或覆盖)地形中的StaticLightingResolution,或者说为地形中的阴影贴图使用的每个patch的texels(texturepixels(贴图像素))量。
每个地形组件都有一个阴影贴图,这就意味着你必须记住MaxComponentSize(最大组件尺寸)的属性,因其控制着每个组件的patches数。
组件越大,每个阴影贴图要覆盖的区域就越大。
当bIsOverridingLightResolution为设为否时,StaticLightingResolution必须为1至最高细节水平属性(MaxTesselationLevel)值中2的幂。
若bIsOverridingLightResolution设为“True”,StaticLightingResolution必须是大于等于1的2的幂,但没有上限。
所以在使用这个选项时要特别小心,因为极有可能无意识的在地形中产生大量的阴影贴图,这样做会降低性能。
CollisionProperties(碰撞属性)
CollisionTessellationLevel(碰撞多边形细分水平)
此属性针对碰撞计算中每个组件的多边形细分水平进行设置。
它的数值必须是从1至最高多边形细分水平(MaxTesselationLevel)属性值之间的2的幂。
指南9.3创建户外环境,第I部分:
初始地形创建
1.运行UnrealEd,打开配套DVD中此章节的terrain_demo_start地图。
2.在Actor类型浏览器中选择Actor浏览器的Actor->Info->Terrain,在鸟瞰视口中右击,选择“AddTerrainHere”(在此处添加地形),在地图中放置一个新地形。
图9.15——向您的关卡添加新地形。
3.把地形放置在鸟瞰视口中天空网格的中央,在侧视口中使其与天空网格底部对齐。
4.选中地形,按下F4打开它的属性。
在移动中设定位置Z属性为0,在建立一个“TerrainLayerSetup”(地形图层设置,在以后的指南中会涉及到)来使用TerrianMaterials(地形材质)的最大和最小高度时这将很有必要。
如果地形不在Z=0处,就要调整TerrainLayerSetup(地形层设置)值进行修补,因为某些应该出现在特定的高度的材质将不会出现在这些高度上。
5.在地形项下,设置以下属性值:
∙NumPatchesX(Xpatches数量):
512
∙NumPatchesY(Ypatches数量):
512
∙MaxTessellationLevel(最高多边形细分水平):
4
6.在Display(显示)项下,设置地形的“DrawScale3D”(3D绘图比例,此项与主编辑器窗口中的描3D绘图比例一致)为以下值:
∙X:
64
∙Y:
64
∙Z:
256
图9.16——现在的地形比之前的小多了。
7.请保存您的关卡以便于我们继续下面几章的指南。
<<<<指南结束>>>>
9.4地形材质与图层
材质可以通过TerrianMaterials(地形材质)选项应用到地形上。
TerrianMaterials(地形材质)实质上就是附加了terrain-centric(以地形为中心)功能的标准材质的过渡体。
它包括位移控制、植被添加或者调整地形表面材质的缩放比例。
TerrianMaterials(地形材质)可以在GenericBrowser中创建:
选择File>New>TerrainMaterial或者右击GenericBrowser中的空白区域选择关联菜单中“NewTerrainMaterial”(新的地形材质)。
本章将对地形材质进行逐步讲解。
TerrianMaterials(地形材质)属性
DisplacementMap(位移贴图)
此属性允许你使用一个32位的Targa(TGA)文件对一个灰度贴图赋值。
只要此地形材质暴露于地形之上,引擎就会使用此图象移动地形的顶点。
此种移动沿表面法线进行,而不是如高度图一样简单的垂直移动。
DisplacementScale(位移比例)
这一数字是用于与位移贴图的位移量相乘的乘数。
Foliage(植被)
植被数组允许您为静态网格物体赋值——例如草和灌木丛的模型——在相应的材质应用部分丰富地形内容。
这有点和DecoLayers(装饰层)相类似,将在稍后的第9.7节中讨论。
MappingPanU(贴图坐标平移U)
此属性是将材质位置沿贴图坐标系U方向在地形表面平移的偏移量。
MappingPanV(贴图坐标平移V)
此属性是将材质位置沿贴图坐标系V方向在地形表面平移的偏移量。
MappingRotation(贴图坐标旋转)
材质旋转的偏移量。
MappingScale(贴图坐标比例)
此属性是与材质的贴图坐标系相乘的乘数。
MappingType(贴图坐标类型)
在材质应用到地形时,此属性允许选择一个对齐材质贴图的特定贴图坐标平面,当然也可以简便地使用自动选择的方法。
∙TMT_Auto–允许引擎自动选择使用最佳贴图坐标平面。
∙TMT_XY–沿XY平面对齐材质。
∙TMT_XZ–沿XZ平面对齐材质。
∙TMT_YZ–沿YZ平面对齐材质。
材质
此属性包含用于此TerrainMaterial(地形材质)的常规材质。
地形层
TerrainMaterials(地形材质)可以按图层分组。
“图层”这一概念为关卡设计者提供了一条建立材质组的途径,这样可以将其显现于地形上、基于各种环境进行混合,比如地形上的高地或者山丘与高山的斜坡。
例如:
可以创建一个包含丛林环境材质的图层,其中包括了平原草地、深褐色岩石峭壁的陡坡和山谷里密布的沼泽。
再来设置另一个雪地环境的图层,其中有冰冷的岩石峭壁、铺满路面的冰雪。
然后您可以将这两个环境迥异的图层进行无缝融合。
图9.17——地形编辑对话框的浏览区域中可以看到所有的“图层”。
权重图
地形层使用权重图来决定每个地形表面材质的准确位置。
这些权重图就是简单的RGBA贴图,其中的4个通道分别代表某个特定材质的透明度。
这些透明度都是按照稍后论述的TerrainLayerSetup(地形层设置)中的四个设定值自动创建的,用于在特定情况下(如在特殊的高地或给定斜坡上),显示特定材质。
之所以将权重图从多灰度Alpha贴图压缩为RGBA贴图是因为着色器包含的贴图总数有限。
如果每个图层的Alpha图有一种贴图,那么一个多图层的地形很快就会到达它的贴图数上限。
对单个RGBA贴图的4个通道来使贴图总数大了4倍,而每一地形就可以使用更多的图层。
尽管权重图是自动生成的,但也可以在GenericBrowser中找到。
要查看权重图,可以在此关卡文件包中找到。
请注意,这些权重图无法导出。
地形层设置
每一图层中的材质可以用地形层设置赋值到特定的斜坡或高地上。
地形层设置是地形材质与一系列控制材质显示和渲染属性的集合。
图9.18——图中不同材质的patches就是地形层设置的结果。
地形材质被分配到“材质”数组中,每个数组条目都有一个地形材质的引用和一系列控制材质在地形表面显示细节的属性,。
材质数组可以有任意多的条目,但请记住材质是从下往上进行渲染的,也就是说数组条目[0]在数组条目[1]的上方而先被渲染,依此类推。
这一点非常重要,因为当材质被应用到同一个地点时,他们在材质数组中的位置将决定各自的渲染次序。
材质数组中的每一条目包含了下列属性:
UseNoise(使用噪声)
告知本条目是否要对最低最高高度和最小最大斜坡使用噪声设置,或者忽略所有噪声。
NoiseScale(噪声比例)
用以与噪声值相乘的乘数。
NoisePercent(噪声百分率)
控制应用于材质的总体噪声效果数量。
MinHeight(最低高度)
最低高度决定材质绘制的最小高度。
例如,如果它的值是256,那么材质只能放在海拔高度为256单元高度或更高的地形上。
它的值以绝对世界坐标为准。
Base(基值)
这是最低高度计算的实际值。
NoiseScale(噪声比例)
此属性控制应用于最低高度基值的噪声频率。
这个值越小,总噪声就越小。
NoiseAmount(噪声量)
此属性设置沿基值上下浮动的噪声变化的数量。
MaxHeight(最高高度)
最高高度允许您设置此材质渲染的最高高度。
例如,如果把这个值设为256,那么材质就只能放置在高度为256单位或更低的高低上。
此数值以绝对世界坐标为准。
Base(基值)
这是最高高度计算的实际值。
NoiseScale(噪声比例)
此属性控制应用于最高高度基值上的噪声频率。
它的值越小,总噪声就越小。
NoiseAmount(噪声量)
此属性设置沿基值(Base)上下浮动的噪声变化的数量。
MinSlope(最小坡度)
最小坡度设置坡度的最小值,或者说是使材质可见的地形表面角度。
此属性的数值较为有趣,0代表水平面(无坡度),1代表45度倾斜,无限大代表90度(垂直)。
显然,您的值不可能达到无限大,这应该很容易理解,因为地形不可能达到和超过垂直的坡度。
设置最小坡度后,比定义的最小坡度角度大的斜坡均可被赋予材质。
(基值)
这是最低高度计算的实际值。
NoiseScale(噪声比例)
此属性控制应用于最高高度基值上的噪声频率。
它的值越小,总噪声就越小。
NoiseAmount(噪声量)
此属性设置沿基值(Base)上下浮动的噪声变化的数量。
MaxSlope(最大坡度)
最大坡度设置坡度的最小值,或者说是设置地形表面与显示材质所形成的角度。
此属性的数值较为有趣,0代表水平面(无坡度),1代表45度倾斜,无限大代表90度(垂直)。
显然,您的值不可能达到无限大,这应该很容易理解,因为地形不可能达到和超过垂直的坡度。
设置最大坡度后,比定义的最大坡度角度小的斜坡均可被赋予材质。
Base(基值)
这是最高高度计算的实际值。
NoiseScale(噪声比例)
此属性控制应用于最高高度基值上的噪声频率。
它的值越小,总噪声就越小。
NoiseAmount(噪声量)
此属性设置沿基值上下浮动的噪声变化的数量。
Alpha
此属性控制材质的不透明性。
0代表完全透明,1代表完全不透明。
如果材质数组中任何条目的透明度值为1,那么由于排序的顺序,所有在此材质以下的材质将不被渲染。
Material(材质)
这是对于此材质数组条目中使用的地形材质的引用。
指南9.4创建户外环境,第II部分:
地形编辑——材质
作为在实时游戏开发环境中进行游戏开发的关