Unity中基于高度图的地形系统总结

来源:互联网 发布:天天特价淘宝网衣服 编辑:程序博客网 时间:2024/06/04 15:45

Unity中基于高度图的地形系统总结

一、高度图

         什么是高度图?从狭义上来理解,高度图是一张带有灰阶的图片,图片中的每个像素具有不同的灰度值,这些灰度值代表了不同的高度:像素的灰度值越大,表示对应的高度越高;像素的灰度值越小,表示对应的高度越低。从编程的角度来理解,高度图是一个二维数组。因为从高度图映射到一个地形,需要创建一个与高度图大小相同的顶点网格,所谓大小相同指的是高度图中的每个像素对应顶点网格中的一个顶点。这个代表高度图的二维数组,其中的索引值用来定位不同的顶点,而对应的存储值则表示了顶点对应的高度,也就是像素的灰度值。如图1所示是一个顶点网格,X-Z维度分别对应了高度图的两个维度:


图1

 

二、Unity中的地形系统与高度图

         高度图有一个重要的属性,就是它的像素分辨率。像素分辨率表示了高度图在长和宽两个方向上的像素数量。在Unity中,当我们选中一个地形对象时,选择Terrain->Set Resolution选项,就可以在其中设置该地形对应的高度图的分辨率。之所以说高度图的分辨率十分重要,是因为该分辨率与地形对象的顶点网格的细节表现具有对应关系。总的来说就是:在地形对象大小不变的前提下(世界单位中),对应的高度图分辨率越大,则顶点网格中的顶点越密集,顶点之间的间距越小,所能表现的细节越强,反之同理。顶点之间的间距可表示为图1中的Block Scale属性。如图2所示,在Unity中设置高度图的分辨率:


图2

 

         在Unity中,高度图分辨率的最小值为33,并以32的倍数为差值增加,具体表现为33、65、129、257、…等。其中的Terrain Width、Height、Length属性,分别表示了在世界单位下地形对象在X、Y、Z三个维度下的大小。因为分辨率的大小影响了一个地形系统变化的精细程度,也就是改变了地形顶点网格中相邻顶点间的距离属性。该属性在Unity中对应了TerrainData.heightmapScale变量,每个高度图采样的大小。该属性并未在上图中显示出来,不过可以通过打印输出来查看,如图3所示,是与图2设置所对应的地形对象的一些属性的打印输出,Scale即表示了顶点间的距离:


图3


 

        当你在Unity中修改地形时,在Scene视图中切换到wireFrame显示模式下,针对同一个地形对象,设置不同的高度图分辨率,便会清楚地看到地形顶点网格在不同分辨率下的精细程度变化,如图4、5所示:


图4(分辨率为33所对应的块大小)

 


图5(分辨率为65所对应的块大小)

 

       最后,在Unity中,你还可以导入或者导出地形的高度图,如图6所示:


图6

 

        以上是自己总结的一些高度图的基本知识,以及高度图在Unity的地形系统中的基本应用。后续自己还会把一些基于地形系统的应用继续总结,若有不对的地方欢迎大家的批评指正: )

2 0
原创粉丝点击