文章目录
0.参考
- Unity官方文档:关于Terrain的介绍与API参考
- Unity Assets Store资源:Road Maker Optimized:这个项目提供了一个API文档,可以查看每个函数的含义,比起自己去看源码寻找,方便很多。此外,由于这个项目不提供源码,所以需要使用ILSpy反编译dll文件。反编译的效果还是不错的,大部分代码是可以看懂的。
1.Unity Terrain
Unity Terrain是什么呢?它在窗口中看起来像一个Mesh,有很多的网格。

但是它并没有Mesh Filter和Mesh Renderer组件,取而代之的是Terrain组件。

Mesh好理解,但是这个Texture是什么呢?
Terrain toolsthat affect height, such asRaise or Lower TerrainandSet Height, use agrayscale texturecalled aheightmap. Unity represents the height of each point on the Terrain as a value in a rectangular array. It represents this array using a grayscale heightmap. Heightmaps are built into the Terrain, and the values stored in a heightmap define the height of each point or vertex on the Terrain.
根据官方文档的以上描述,我们可以知道,Unity内部是用一个二维数组(rectangular array)来存储Terrain每个点的高度的。而每个点的高度又是从一张灰度图(heightmap)里采样的。
这张灰度图可以在Terrain组件的Texture Resolutions选项卡里Import或者Export,选择导出后我得到了个名为“terrain.raw”的文件。使用PhotoShop打开,可以看到该图片的属性如下:宽度和高度都为513像素,和Terrain组件中的“Heightmap Resolution”的值一致。通道数量为2,深度为8位。

这张heightmap长这样:

对比Untiy窗口的Terrain渲染图,我们可以观察到黑色代表高度为0,白色代表高度为最大值(由Mesh Resolution中的Terrain Height定义),灰色则代表(0~maxHeight)中的一个值。
2.如何使用代码 get/set Terrain某一点的高度
(1)heightmap的坐标系
以左下角为原点,向右向上为正。如下图,白色正方体所在的位置为世界坐标系的原点。选中的Terrain在世界坐标系中,坐标和原点重合,position=(0,0,0)。可以看到,虽然移动工具在Terrain的中心,但是Terrain的左下角和position重合。

(2)将Terrain左下角的五分之一面积的高度设置为0
- terrain.terrainData.heightmapResolution
- terrain.terrainData.GetHeights()
- terrain.terrainData.SetHeights()
public class TestTerrain : MonoBehaviour
{
Terrain terrain;
// Start is called before the first frame update
void Start()
{
terrain = GetComponent<

本文介绍了如何在Unity中让Terrain的高度与道路模型匹配,通过理解Unity Terrain的heightmap和坐标系,使用代码get/set Terrain高度,获取道路模型高度并进行平滑处理,以避免高度变化过于突兀。
最低0.47元/天 解锁文章
1808

被折叠的 条评论
为什么被折叠?



