Unity 3D 使用高度图创建地形|| Unity 3D 使用笔刷绘制地形

news2024/9/28 7:16:50

Unity 3D 使用高度图创建地形

在 Unity 3D 中编辑地形有两种方法:

  • 通过地形编辑器编辑地形。

  • 通过导入一幅预先渲染好的灰度图来快速地为地形建模。

地形上每个点的高度被表示为一个矩阵中的一列值。这个矩阵可以用一个被称为高度图(heightmap)的灰度图来表示。

灰度图是一种使用二维图形来表示三维的高度变化的图片。近黑色的、较暗的颜色表示较低的点,接近白色的、较亮的颜色表示较高的点。

通常可以用 Photoshop 或其他三维软件导出灰度图,灰度图的格式为 RAW 格式,Unity 3D 可以支持 16 位的灰度图。

Unity 提供了为地形导入、导出高度图的选项。

  • 单击 Settings tool 按钮,找到标记为 Import RAW和 Export RAW 的按钮。

  • 这两个按钮允许从标准 RAW 格式中读出或者写入高度图,并且兼容大部分图片和地表编辑器。

案例构思

在 Unity 3D 中支持 RAW 格式的高度图导入。

RAW 格式相当于各种图片格式的“源文件”,它的转换是不可逆的。

注:

  • 在 Photoshop 软件中可以使用滤镜功能制作高度图。

本案例根据在 Photoshop 中制作好的高度图导入 Unity 3D 系统,自动生成地形。

案例设计

本案例通过 Photoshop 中制作好的高度图在 Unity 3D 中创建一个简单的地形,在地形参数列表里设置导入高度图的信息,导入的高度图地形效果。

案例实施

  1. 创建地形。执行 GameObject → 3D Object → Terrain 菜单命令。

  1. 在 Inspector 面板中单击 Import Raw 按钮添加地形,如下图所示。

  1. 设置地形参数。

  1. 进行测试,即可观察到基于高度图创建出来的地形效果。

参数列表

参数含义描述
Depth深度根据文件格式设置,可以是8位或16位。
Width宽度设置高度图的宽。
Height高度设置高度图的高。
Byte Order字节顺序根据文件格式设置,可以是MacWindows
Terrain Size地形大小定义地形的大小。

Unity 3D 使用笔刷绘制地形 

在 Unity 3D 中,除了使用高度图来创建地形外,还可以使用笔刷绘制地形。

刚创建的初始地表只有一块巨大的平面。Unity 3D 提供了一些归纳于地形菜单栏的工具,可供游戏开发者在该平面上创建很多地表元素。

地形菜单栏一共有7个按钮,含义分别为

  • 编辑地形高度。

  • 编辑地形特定高度。

  • 平滑过渡地形。

  • 地形贴图。

  • 添加树模型。

  • 添加草与网格模型。

  • 其他设置。

如下图所示,每个按钮都可以激活相应的子菜单对地形进行操作和编辑。

地形高度绘制

在地形编辑器中,前 3 个工具用来绘制地形在高度上的变化。

左边第一个按钮激活 Raise/Lower Height 工具,如下图所示。

当使用这个工具时,高度将随着鼠标在地形上扫过而升高。如果在一处固定鼠标,高度将逐渐增加。这类似于在图像编辑器中的喷雾器工具。

如果鼠标操作时按下 Shift 键,高度将会降低。不同的刷子可以用来创建不同的效果。

例如:

  • 创建丘陵地形时,可以通过 soft-edged 刷子进行高度抬升。

  • 而对于陡峭的山峰和山谷,可以使用 hard-edged 刷子进行高度削减。

  1. Paint Height,类似于 Raise/Lower 工具,但多了一个属性 Height,用来设置目标高度,如下图所示(左边第二个)。

  • 当在地形对象上绘制时,此高度的上方区域会下降,下方的区域会上升。

  • 游戏开发者可以使用高度属性来手动设置高度,也可以使用在地形上 Shift + 单击 对鼠标位置的高度进行取样。

  • 在高度属性旁边是一个 Flatten 按钮,它简单地拉平整个地形到选定的高度,这对设置一个凸起的地平线很有用。

  • Paint Height绘制的地表包含高出水平线和低于水平线的部分,(例如在场景中创建高原以及添加人工元素——道路、平台和台阶等)都很方便。

  1. Smooth Height 并不会明显地抬升或降低地形高度,但会平均化附近的区域。这缓和了地表,降低了陡峭变化,类似于图片处理中的模糊工具(blur tool)。

Smooth Height 可以用于缓和地表上尖锐、粗糙的岩石。参数列表如下:

参数含义描述
Brushes笔刷设置笔刷的样式。
Setting设置
Brushes Size笔刷尺寸设置笔刷的大小。
Opacity不透明度设置笔刷绘制时的高度。
Height高度设置绘制高度的数值。

地形纹理绘制

在地形的表面上可以添加纹理图片以创造色彩和良好的细节。

由于地形是如此巨大的对象,在实践中标准的做法是使用一个无空隙地(即连续地)重复的纹理,在表面上用它成片地覆盖,可以绘制不同的纹理区域以模拟不同的地面,如草地、沙漠和雪地。

绘制出的纹理可以在不同的透明度下使用,这样就可以在不同地形纹理间形成渐变,效果更自然。

地形编辑器左边第四个按钮是纹理绘制工具,单击该按钮并且在菜单中执行 Add Texture 命令,可以看到一个窗口,在其中可以设置一个纹理和它的属性。

添加的第一个纹理将作为背景使用而覆盖地形。如果想添加更多的纹理,可以使用刷子工具,通过设置刷子尺寸、透明度及目标强度(Target Strength)选项,实现不同纹理的贴图效果,如下图所示。

参数列表:

参数含义描述
Brushes笔刷设置笔刷的样式。
Setting设置
Opacity不透明度设置笔刷绘制时的高度。
Textures纹理设置绘制地形纹理图片样式。
Brush Size笔刷尺寸设置绘制纹理的笔刷的大小。
Target Strength目标强度设置所绘制的贴图纹理产生的影响。

树木绘制

Unity 3D 地形可以布置树木。可以像绘制高度图和使用纹理那样将树木绘制到地形上,但树木是固定的、从表面生长出的三维对象。

Unity 3D 使用了优化(例如,对远距离树木应用广告牌效果)来保证好的渲染效果,所以一个地形可以拥有上千棵树组成的茂密森林,同时保持可接受的帧率。

单击 Edit Trees 按钮并且选择 Add Tree 命令,将弹出一个窗口,从中选择一种树木资源。

  • 当一棵树被选中时,可以在地表上用绘制纹理或高度图的方式来绘制树木,按住 Shift 键可从区域中移除树木,按住 Ctrl 键则只绘制或移除当前选中的树木。树木绘制面板如下图所示。

  • 参数列表:
参数含义描述
Tree Density树木密度设置树的间距。
Setting设置
Tree Height树木高度设置树的高度,勾选Random选项,可以出现树木高度 在指定范围内随机变化的效果。
Lock Width to Height锁定树木的宽高比锁定树木宽高比。
Brush Size笔刷尺寸设置种植树时笔刷的大小。
Tree Width树木宽度设置树的宽度,勾选Random选项,可以出现树木宽度 在指定范围内随机变化的效果。
Random Tree Rotation树木随机旋转设置树木随机旋转一定的角度。

草和其他细节

一个地形表面可以有草丛和其他小物体,比如覆盖表面的石头。草地使用二维图像进行渲染来表现草丛,而其他细节从标准网格中生成。

在地形编辑器中单击 Edit Details 按钮,在出现的菜单中将看到 Add Grass Texture 和 Add Detail Mesh 选项,选择 Add Grass Texture,在出现的窗口中选择合适的草资源,如下图所示。

参数列表:

参数含义描述
Detail Texture细节纹理指定图片作为草的纹理。
Min Width最小宽度设置草的最小宽度值。
Max Width最大宽度设置草的最大宽度值。
Min Height最小高度设置草的最小高度值。
Max Height最大高度设置草的最大高度值。
Noise Spread噪波范围控制草产生簇的大小。
Healthy Color健康颜色设置草的健康颜色,此颜色在噪波中心处较为明显。
Dry Color干燥颜色设置草的干燥颜色,此颜色在噪波中心处较为明显。
Billboard广告牌草将随着摄像机同步转动,永远面向摄像机。

地形设置

单击地形编辑器最右边的按钮可以打开地形设置面板,如下图所示。该面板用于设置地形参数,如下表所示。

基本地形参数:

参数含义描述
Draw绘制绘制地形。
Pixel Error像素容差显示地形网格时允许的像素容差。
Base Map Dist基本地图距离设置地形高度的分辨率。
Cast Shadows投影设置地形是否有投影。
Material材质为地形添加材质。

树和细节参数:

参数含义描述
Draw绘制设置是否渲染除地形以外的对象。
Detail Distance细节距离设置摄像机停止对细节渲染的距离。
Detail Density细节密度设置细节密度。
Tree Distance树木距离设置摄像机停止对树进行渲染的距离。
Billboard Start开始广告牌设置摄像机将树渲染为广告牌的距离。
Fade Length渐变距离控制所有树的总量上限。
Max Mesh Trees网格渲染树木最大数量设置使用网格形式进行渲染的树木最大数量。

风参数:

参数含义描述
Speed速度风吹过草地的速度。
Size大小同一时间受到风影响的草的数量。
Bending弯曲设置草跟随风弯曲的强度。
Grass Tint草的色调设置地形上的所有草和细节网格的总体渲染颜色。

风域

地形中的草丛在运行测试时可以随风摆动,如果要实现树木的枝叶如同现实中一样随风摇摆的效果,就需要加入风域。

执行 GameObject → 3D Object → Wind Zone 菜单命令,创建一个风域,风域的参数如下图所示。

参数列表:

参数含义描述
Mode风域模式设置风域模式:Directional模式下整个场景中的树木都受影 响,Spherical模式下只影响球体包裹范围内的树木。
Main主风设置主要风力,产生风压柔和变化。
Turbulence湍流设置湍流风,产生一个瞬息万变的风压。
Pulse Magnitude波动幅度定义风力随时间的变化。
Pulse Frequency波动频率定义风向改变的频率。

风域不仅能实现风吹树木的效果,还能模拟爆炸时树木受到波及的效果。

需要注意的是,风域只能作用于树木,对其他游戏对象没有效果。场景中不同模式下的风域参数设置如下表所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win11关闭Windows Defender实时保护,暂时关闭和永久关闭方法 | Win10怎么永久关闭Windows Defender实时保护

文章目录1. 按2. 暂时关闭Windows Defender实时保护3. 永久关闭实时保护3.1. 方法一:改组策略(Windows11实测可以)3.2. 方法二:改注册表(Windows11实测不行)1. 按 开启Windows Defender实时保护有时候会导…

HJ2 计算某字符出现次数

HJ2 计算某字符出现次数1 题目2 解法2.1 count_if 本题代码2.1.1 C STL非更易型算法--count_if介绍2.1.2 C中cin(),cin.get(),cin.getline(),getline()总结:2.2 一般做法3 【扩展】C STL--非更易型算法1 题目 题源链接 描述 写出一个程序,接受一个由字…

【HTTP】浏览器缓存(HTTP缓存)

文章目录一、强制缓存1.1、ExPires1.2、Cache-Control二、协商缓存2.1、last-modified2.2、etag浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页…

在国内 PMP 有多少含金量?

PMP 证书已经在全球206个国家和地区得到认可,据 PMI 官方数据统计,截至2021,全球持有效 PMP 证书人数达110 W,国内占比28.98%,超33 W人次。 第一,PMP证书有什么价值? 01.PMP认证的重要性 PMP是…

Unreal UPROPERTY属性标记宏

BlueprintReadOnly,让该变量可在蓝图中访问。新建一个继承AActor的C类CustomActor,添加int变量TestProperty,并给他加上BlueprintReadOnly标记:这样,就能在蓝图中引用该变量。BlueprintReadWrite,让该变量可以在蓝图中使用以及修改。给TestProperty变量添加BlueprintReadWrite标…

【云原生进阶之容器】第二章Controller Manager原理2.7节--Indexer剖析

7 Indexer Indexer是client-go用来存储资源对象并自带索引功能的本地存储,Reflector从DeltaFIFO中将消费出来的资源对象存储至Indexer。Indexer中的数据与Etcd集群中的数据保持完全一致。client-go可以很方便地从本地存储中读取相应的资源对象数据,而无须每次都从远程Etcd集群…

复现yolov5CPP经验贴

源码: https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp 该源码亲测可行,但是还是有一些问题 此处改成False 此处改成自己转换好的onnx模型路径 用神经网络工具: https://github.com/lutzroeder/netron 用该工具可查看输入…

【UE4 第一人称射击游戏】24-添加人工智能的敌人跟随功能

上一篇:【UE4 第一人称射击游戏】23-添加子弹伤害本篇效果:步骤:将 导航网格体边界体积 拖入视口按P键显示区域将导航区域扩大一些如果不想让导航体覆盖上面的区域可以将导航体的高度降低一些打开“SimpleAI”,添加一个“Pawn感应…

Java Type

Type 是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java 中所有类型的”爹“。其中”所有类型“的描述尤为指的关注。它并不是我们平常工作中经常使用的int、String、List、Map等数据类型,而是从Java语言角度磊说&am…

shell练习之安全脚本

题目: 将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问 1.初始配置 首先使用systemctl工具启用firewalld服务: ​[rootlocalhost ~]# systemctl enable firewalld如果已经启用了,我们现在可以通过执行以下命令启动firewalld&a…

失败就是差一点的成功,社科院与杜兰大学金融管理硕士项目为你在职读研助力

失败的人,只差了一点点;成功的人,是多做了一点点;顶尖的人,则是再多做一点点。小事成就大事,细节成就完美,所以,千万不要只差那么一点,就放弃了。都说失败是成功之母&…

从Reactor模式俯瞰Nginx,你会发现你与高手的差距就在设计模式上

我们知道了Nginx是做什么的以及它为何如此高效,以至于全宇宙拿它来做负载均衡或者说web server。 但是如果你只是了解了使用和知道了原理就认为已经掌握了它,那只能说你肤浅了,原理和使用技能看看大家都知道了,没必要拿出去和别人…

快排递归、迭代的实现和两种优化方法

目录 快速排序 实现代码 时间复杂度 快排的优化 随机选择策略 三位取中法 非递归的快排 快速排序 快速排序算法是基于分治策略的一个排序算法,其基本思想是对于输入的子数组进行分解、递归求解,最后合并。 分解:以数组中左边第一个数作…

运行flutter doctor命令检测环境是否配置成功报错及解决方案

/** 运行flutter doctor命令检测环境是否配置成功,报如下错误**/ 1. cmdline-tools component is missing & Android licenses status unknown 1.1.安装cmdline-tools 1.2.配置android-licenses 运行命令flutter doctor --android-licenses,提示…

封装一个帧动画组件,使用的是精灵图

我写的是淘宝小部件,限制很多,用的是精灵图,说下大概思路,主要是通过背景图片的X Y轴去控制,首先创建一个组件 例: 然后在props定义需要的参数,可通过父组件传递修改 需要传入精灵图地址、单…

【云原生】Prometheus监控docker容器

部署node-exporter用于搜集硬件和系统信息 // 全部主机都要做 docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --nethost prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-point…

Windows系统pagefile.sys删除、移动

背景 在使用windows系统中通常会发现c盘系统盘容量和实际容量不符。以至于你以为还有几十个G的空间,但操作程序时会出现空间不足的情况 。 例如以下错误: # There is insufficient memory for the Java Runtime Environment to continue. # Native memo…

【六】Netty Google Protobuf 编解码

Netty Google Protobuf 编解码Google Protobuf 介绍Protobuf 的入门Protobuf 开发环境搭建Protobuf 下载创建.proto文件第五节的 对应实体(SubscribeReq,SubscribeResp )SubscribeReq.proto 文件SubscribeResp.proto利用命令生成对应的java文…

详解c++---string模拟实现

这里写目录标题前言准备工作构造函数析构函数迭代器的实现插入数据有关的函数实现reservepush_backoperatorappendinserterasefindresize[ ]clear>>>>新式拷贝构造函数新式赋值重载前言 在前面的文章里我们学习了c中string的用法,那么这篇文章我们将带…

Vue的双向绑定(数据劫持)

双向绑定所谓的双向绑定其实就是,ui或者数据有一方做了修改,那么另外一个也会随着改变。简单来说,视图驱动数据,同时数据也能驱动视图。视图驱动数据,只需要绑定事件。数据驱动视图,则需要去对数据做监听&a…