Unity3D中的地形类似于Maya中使用置换贴图来变形高段数的多边形平面,其原理是自动创建一个中等多边形密度的mesh plane(多边形平面),然后指定一张16bit的灰阶图作为height map(高差图),并根据mesh各个顶点所对应的灰度数值沿着Y轴改变该顶点的高度,形成高低起伏的复杂地形。
Unity3D内置了一套简单的brush(笔刷)工具来方便用户对地形物体的编辑修改。
通过菜单GameObject
> 3D Object
> Terrain
可以创建一个Terrain (地形)。
Terrain Settings
Terrain Settings是对Terrain整体的参数设置面板。
最上面的一排按钮分别用来对地形及植被进行“刷制”的工具面板切换,最右边的Terrain Setting
面板是针对地形整体的设置,这里挑一些常用的重点的来讲:
-
Base Terrain
:基本地形设置-
Draw
:是否显示该地形 -
Pixel Error
:贴图和地形之间的准确度,值越高越不准,但系统负担越小 -
Pixel Map Dist.
:在多少距离以外地形贴图将自动转为较低分辨率(以提高效率) -
Cast Shadow
:是否投射阴影(如果是很平的地形可以不投射阴影) -
Material
:地形使用的材质类型 -
Reflection Probes
:地形是否会被反射探球所计算(也就是说是不是能出现在反射贴图里面) -
Thickness
:在发生碰撞时,该地形向-y方向延伸的厚度(用来防止高速物体穿过较薄的地形)
-
-
Tree & Detail Objects
:树和细节物体-
Detail Distance
:在多少米视距范围内显示Details物体 -
Collect Detail Patches
-Detail Density
:Details物体的密度(1单位面积内最多出现多少个Detail物体) -
Tree Distance
:在多少米视距范围内显示Tree物体 -
Billboard Start
:多少米以外Tree物体开始显示为一张贴图 -
Fade Length
:从多少米以外Tree物体开始被逐渐替换成贴图 -
Max Mesh Trees
:场景中最多出现多少颗真正的多边形树(也就是说超过这个数量的树不论距离摄影机的距离有没有达到标准都会被替换成一张贴图),这个值太小的话,“跳帧”现象会非常明显
-
-
Wind Settings for Grass
:风和草的设定-
Speed
:风速,风速越快,草的摆动越大 -
Size
:草物体的基础大小 -
Bending
:草物体被风吹弯的最大程度 -
Grass Tint
:对草物体统一添加一个颜色,通常会设置为与地面颜色接近的颜色
-
-
Resolution
:地形分辨率-
Terrain Width
:地形最大宽度(米) -
Terrain Length
:地形最大长度(米),所以默认500×500就是500米×500米,1/4平方公里区域范围 -
Terrain Height
:地形最大高度(米),这个值决定了我们能够刷出的最高的地形高度 -
Heightmap Resolution
:刷出来的高差图的分辨率,513的话代表一个像素值控制大概1米区域的地貌,由于我们的笔刷是按照像素来规定大小的,如果我们在一个较低的Heightmap Resolution下刷好地面以后修改Heightmap Resolution为一个较高的值,会发现我们刷好的范围会变成一个角落里的一小块地形,所以千万不要刷到一半的时候再去修改这个数值 -
Detail Resolution
: -
Detail Resolution Per Patch
: -
Control Texture Resolution
:控制贴图的分辨率,所谓控制贴图是说控制各层贴图的“透明通道”的分辨率,比如基层贴图是泥土,上层贴图是草地,那么草地贴图本身是完全覆盖的,但通过一个“控制贴图”的灰度来决定每个点草地贴图与泥土贴图如何融合 -
Base Texture Resolution
:对于很远处的地形,Unity3D会切换成显示一个自动创建好的“融合”了各层贴图效果的Basemap,这样比去计算多层贴图融合要高效很多,这个参数就是设置这个Basemap的分辨率的
-
-
Heightmap
:这里可以导入RAW图像作为heightmap使用,或者将当前的heightmap导出成RAW图像。我们可以从地理数据库中获得真实的某一地区的地形高差图,也可以利用第三方工具(如:Bryce)创建地形然后将高差图导出给Unity3D使用。
要注意的是,
Heightmap Resolution
是指水平方向的分辨率,而不是地形的垂直分辨率,地形垂直分辨率取决于高差图的色深范围。,如果是普通jpg或者png图片做高差图的话,垂直分辨率就是256,代表最多能表达256个不同高度,用这样的垂直分辨率刷高山区域,很容易出现“梯田”状的结果,所以最好使用16bit或32bit色深的高动态图片来做高差图。我们用笔刷刷出来的heightmap都是16bit的。
Raise / Lower Terrain
按下鼠标左键开始提升地形高度,如果同时按住shift
键,则降低地形高度直到0。
-
Brushes
:我们可以选择不同的笔刷形状来进行绘制工作,简单来说就好像在Photoshop里面绘制一张16bit色深的灰阶图。 -
Settings
:-
Brush Size
:笔刷大小 -
Opacity
:笔刷透明度 -
Lighting
:关于光照烘焙的详细设置
-
Paint Height
直接刷出特定高度,按住shift
键获取某一点的高度。非常适合用来刷出非水平面高度的平整地形,比如山顶或山间的一块平整地面等等。同时如果场景中有水面,由于Terrain不能刷出水平面以下的地形(最低刷到水平面),可以首先将全部地形提升到一定高度,再将水域地形刷低。
-
Settings
:-
Brush Size
:笔刷大小 -
Opacity
:笔刷透明度 -
Height
:目标高度,后面的Flatten按钮可以将这一高度应用到全部地形 -
Lighting
:关于光照烘焙的详细设置
-
Smooth Height
相当于光滑笔刷工具
-
Settings
:-
Brush Size
:笔刷大小 -
Opacity
:笔刷透明度 -
Lighting
:关于光照烘焙的详细设置
-
Paint Texture
在地形表面上绘制贴图。
首先需要在Textures栏中点击Edit Textures...
,再选择Add Texture
以添加一层贴图。
在这个“添加地形贴图”面板中我们可以设置一张颜色贴图和一张法线贴图,并指定贴图的重复度。如果检测出颜色贴图含有Alpha通道,就会将这个Alpha通道与作为光滑度的贴图,否则就会出现一个Smoothness参数供我们调节这一层表面的光滑度,此外还提供一个Metallic参数供我们调节这一层表面的金属颜色。
这里的贴图都需要处理成无缝贴图,否则场景中会出现明显的接缝。贴图不需要特别大,因为重复度会被设置得比较高,通常512或者1024分辨率的贴图就可以了。
第一层贴图会默认覆盖整个地形区域,从第二层(从左往右)开始,添加好贴图以后需要在地形上刷出该层贴图的出现范围。
-
Settings
:-
Brush Size
:笔刷大小 -
Opacity
:笔刷透明度 -
Target Strength
:相当于笔刷的最大力度,配合Opacity参数可以得到比较细致的力度控制,当然如果使用手绘板来绘制就更好了 -
Lighting
:关于光照烘焙的详细设置
-
需要编辑各层的贴图设置只需点击Edit Textures...
> Edit Texture...
,需要删除贴图层就点击Edit Textures...
> Remove Texture
。
我一直都觉得这是个非常精妙的设计,用无缝贴图的大量重复来覆盖区域,然后叠加多层贴图以消除重复感,不论是颜色贴图还是控制贴图都不需要很大的尺寸就能覆盖超大的地形区域。
可以尝试在Maya中使用这种思路来设计地面材质的shading network。
Place Trees
在地形上刷出树来。
按下鼠标左键开始刷树,按住Shift
键再刷可以删除已经刷出来的树,按住Ctrl
键再刷可以删除当前选择的特定类型的树。
在Trees栏点击Edit Trees...
,再选择Add Tree
,可以添加一个GameObject作为“树”。这个物体可以是任意GameObject,并不一定非要是Tree Object。
然后就可以用鼠标在地形表面“刷”出这类树来了,同时也会出现具体的Settings参数。
-
Settings
:-
Brush Size
:笔刷大小 -
Tree Density
:树的密度,还可以点击Mass Place Trees
按钮来用一大批树布满整个地形 -
Tree Height
:树的高度(Y轴缩放),如果勾选Random?
则可以设置一个范围,系统自动随机生成不同高度的树 -
Lock Width to Height
:是否锁定缩放比例,如果不锁定,可以在下面Tree Width参数中设定树的宽度(X轴和Z轴一定是等比缩放的) -
Color Variation
:颜色的随机变化程度,会自动让不同的树的颜色产生一定的差异 -
Lighting
:关于光照烘焙的详细设置
-
我们可以添加多种type的树,然后一层层刷出复杂的森林结构。
同样的,我们也可以点击Edit Trees...
> Edit Tree
给树更换GameObject,或点击Edit Trees...
> Remove Tree
删除某一层的树。
说是Place Trees,其实可以用来放置各种场景物体,我个人比较喜欢用这个功能在场景中添加比较大块的岩石,因为不会出现自旋的现象。
Place Details
在地形上刷出细节物体,通常用来做草。
按下鼠标左键开始刷细节物体,按住Shift
键再刷可以删除已经刷出来的细节物体,按住Ctrl
键再刷可以删除当前选择的特定类型的细节物体。
在Details栏点击Edit Details...
,再选择Add Grass Texture
,打开Add Grass Texture面板设置新建“草贴图”的参数:
-
Detail Texture
:选择一张花或者草的贴图 -
Min Width
、Max Width
、Min Height
、Max Height
:单个草物体的最大最小的宽高值 -
Noise Spread
:添加一点分布随机度 -
Healthy Color
:草的健康颜色(会被tint到贴图的上部) -
Dry Color
:草的干枯颜色(会被tint到贴图的底部) -
Billboard
:是否以永远面向摄像机的单面形式生成单个草物体,如果选否的话就会以十字交叉双平面方式来生成单个草物体
在Details栏点击Edit Details...
,再选择Add Detail Mesh
,打开Add Detail Mesh面板设置新建“细节面片”的参数:
-
Detail
:选择一个prefab作为细节模型 -
Noise Spread
:添加一点分布随机度 -
Min Width
、Max Width
、Min Height
、Max Height
:单个细节模型的最大最小的宽高值 -
Healthy Color
:细节模型的健康颜色(会被tint到顶部) -
Dry Color
:细节模型的干枯颜色(会被tint到底部) -
Render Mode
:细节模型的渲染模式,选择Grass
的话模型会被压扁成一个薄片,然后用草物体的渲染方式来渲染,选择Vertex Lit
的话模型会以顶点照明的方式接受场景光照