如何使得Unity Terrain(地形)的高度匹配道路模型的高度

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

0.参考

1.Unity Terrain

Unity Terrain是什么呢?它在窗口中看起来像一个Mesh,有很多的网格。

在这里插入图片描述
但是它并没有Mesh Filter和Mesh Renderer组件,取而代之的是Terrain组件。

在这里插入图片描述
Mesh好理解,但是这个Texture是什么呢?

Terrain tools that affect height, such as Raise or Lower Terrain and Set Height, use a grayscale texture called a heightmap. 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<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值