Unity程序化地形教程 第二期 噪声图的完善和更多细节添加

前言:完整的程序化地形教程在我的主页相关专栏中,目前正在持续更新,可以添加收藏,方便日后查找

零、学完本期能够实现的效果

书接上期,学完之后相比上期能够有更多的细节和优化,话不多说,赶快开始吧!

一、noise脚本的属性值添加

相比上一期noise的属性值,这一期里面新添加了五个属性值,我们在上图中也能看到相关的效果,这五个值分别是

 public int octaves; //八度数量 高峰的数量public float persistance; //持久值 可以理解为平滑还是不平滑public float lacunarity; //缺陷 可以理解为粗糙度public int seed;  //地图种子 相对于偏移量来说能够更大程度上去改变地图的整体面貌public Vector2 offset; //偏移量

在这里我们添加上相关属性后的代码,各个函数都有相关的注释

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public static class Noise
{public static  float[,] GenerateNoiseMap(int mapWidth,int mapHeight,int seed, float scale,int octaves,float persistance,float lacunarity,Vector2 offset)  //利用噪声来设置地形的高低{                                                                     //回到相同地图的种子       新增八度音阶数量    持久值      缺陷    float[,] noiseMap = new float[mapWidth, mapHeight]; //两个维度的浮点数类型的数组//创建一个系统点随机对象  伪随机数生成器System.Random prng = new System.Random(seed);Vector2[] octaveOffsets = new Vector2[octaves];for(int i=0;i<octaves;i++){float offsetX = prng.Next(-100000, 100000) + offset.x;float offsetY = prng.Next(-100000, 100000) + offset.y;octaveOffsets[i] = new Vector2(offsetX, offsetY);}if(scale<=0){scale = 0.0001f;}//返回的归一化处理float maxNoiseHeight = float.MinValue;float minNoiseHeight = float.MaxValue;//将噪声图的缩放设置在中心点上 计算e值是地图宽度的一半float halfwidth = mapWidth / 2f;float halfHeight = mapHeight / 2f;//对传入的函数的长、宽参数进行灰度值赋值 模拟噪声for (int y =0;y<mapHeight;y++){for(int x=0;x<mapWidth;x++){//频率和振幅float amplitude = 1;float frequency = 1;float noiseHeight = 0;for(int i =0;i<octaves;i++){//除以scale 让影响scale的同时能够影响到地图缩放的大小float sampleX = (x-halfwidth) / scale *frequency +octaveOffsets[i].x;float sampleY = (y-halfHeight)/ scale*frequency+octaveOffsets[i].y;//柏林值 Mathf.PerlinNoise可以简单理解为随机获得在这个点的灰度值float perlinValue = Mathf.PerlinNoise(sampleX, sampleY) * 2 - 1;  //让噪声取值为-1到1的范围 让地形发生更多的变化 //将灰度值返回给这个点noiseMap[x, y] = perlinValue;noiseHeight += perlinValue * amplitude;amplitude *= persistance;frequency *= lacunarity;}//获取噪声值的范围 便于后期归一化处理if(noiseHeight>maxNoiseHeight){maxNoiseHeight = noiseHeight;}else if(noiseHeight<minNoiseHeight){minNoiseHeight = noiseHeight;}//将高度应用于我们的噪声图 使坐标XY等于该噪声高度值noiseMap[x, y] = noiseHeight;}}//将取值限定 归一化处理for (int y = 0; y < mapHeight; y++){for (int x = 0; x < mapWidth; x++){noiseMap[x, y] = Mathf.InverseLerp(minNoiseHeight, maxNoiseHeight, noiseMap[x, y]);}}//返回噪声前对其进行归一化处理,使所有的值都回到0到1的范围内//跟踪噪声图中的最低值和最高值return noiseMap;}
}

二、地图生成器MapGenerator脚本的属性添加

很好理解,地图生成器是根据noise脚本为基础来创造噪声图的,noise脚本中修改的属性也要在这个脚本中进行更改

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MapGenerator : MonoBehaviour
{public int mapWidth;public int mapHeight;public float noiseScale;public int octaves; //八度数量[Range(0,1)] //以滑块的形式限定范围public float persistance; //持久值public float lacunarity; //缺陷public int seed; //种子public Vector2 offset;  //偏移量public bool autoUpdate; //是否自动更行//生成地图public void GenerateMap(){//这里将输入的长、宽、大小代入刚刚定义好的生成噪声的函数中float[,] noiseMap = Noise.GenerateNoiseMap(mapWidth, mapHeight, seed,noiseScale,octaves,persistance,lacunarity,offset);//MapDisplay是用来将噪声转化为地形的脚本 在这里将上面处理后的数据转化为地形//下一个脚本再具体介绍 这里可以直接写MapDisplay display = FindObjectOfType<MapDisplay>();display.DrawNoiseMap(noiseMap);}private void OnValidate() //脚本中的数据改动时会自动调用{//将脚本中的值进行限定 因为超出这个值后没有意义if(mapWidth<1){mapWidth = 1;}if(mapHeight<1){mapHeight = 1;}if(lacunarity<1){lacunarity = 1;}if(octaves<0){octaves = 0;}}
}

三、最终的效果展示

保存脚本、之后我们就可以在Unity中运行查看效果了,对于不理解的新添属性值,我们可以在Unity的调试界面对这些属性值进行更改,看对于噪声图会发生怎样的变化

这样一个基本的用于控制地形生成的噪波图就制作好了,是不是很有趣呢?感兴趣的话点个关注,后面持续更新!

上期教程连接:Unity程序化地形教程 第一期 噪波图的制作

Unity程序化地形教程 第二期 噪声图的完善和更多细节添加相关推荐

  1. Unity程序化地形教程 第一期 噪波图的制作

    Unity程序化地形教程 第一期 前言:最近在准备作品集,想吧Blender里面利用shader实现的程序化地形导入Unity中,发现我弄不了,于是转向了直接在Unity中实现程序化地形的新途径,但是 ...

  2. Unity程序化地形教程集合

    Unity程序化地形教程集合 Unity程序化地形教程 第一期 Unity程序化地形教程 第二期

  3. Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵. 这里继续讲二次元角色材质.这次打算讲一下描边和细节的添加. 一.外描边 外描边的做法也不止一种,比如后处理方法的偏导数ddx/ddy之类的, ...

  4. 将高程图导入Unity生成真实地形教程

    1.生成真实地形,需要用到地形高程图 这里提供两种获取高程图的方式: 1.1 准备一块DEM数据,格式为img或tiff,并准备好Global Mapper和Photoshop两款软件: DEM下载地 ...

  5. unity c 语言教程,程序丨Unity教程:如何用最简单的方式创建Simplex噪声?

    原标题:程序丨Unity教程:如何用最简单的方式创建Simplex噪声? 翻译:刘甜甜(青悠) 审校:周伟杰 (Senser) 在本篇教程中,你将学会创建Value噪声与Perlin噪声的替代噪声,即 ...

  6. Unity无限地形生成(基于柏林噪声的简单生成)

    Unity无限地形生成(基于柏林噪声的简单生成) 要求:构建一个户外开放世界游戏,为该游戏添加天空,地形,植物,并支持场景里自由漫游.这里实现一个无限地形的产生: 实现漫游 漫游的功能由玩家移动和摄像 ...

  7. go中文网第二期培训教程

    go中文网第二期培训教程-----Go中文网官方出品的<资深Go开发工程师> 下载地址:百度网盘 2020最新版[Go语言中文网]资深Go开发工程师第二期 Go作为专门为并发和大数据设计的 ...

  8. unity与Gaea互导(介于高度图)在制作好的unity地形之上用gaea添加自动化地型细节

    unity与Gaia互导(介于高度图) 问题:当在unity中制作的地型基本已经完成,但是由于地形是手刷,当跑地图时发现角色走在场景中时会感觉整个场景很空旷,整体效果不够丰富.则需要对地形进行细节调整 ...

  9. 单细胞转录组单飞第二期开课啦!!

    单细胞转录组之前是跟常规转录组一起开课的,但后来因为涉及内容多,也需要更专业的讲解,8月份第一次单飞独自开课,邀请中科院单细胞分析算法开发博士倾力授课,一鸣惊人,取得了很好的效果. 现于2019年11 ...

最新文章

  1. Linux 守护进程的原理与实现
  2. 最简MacOs10.8安装
  3. 无锡易保Java面试笔试_易保面试题 - willim - BlogJava
  4. No such file or class on classpath: WordCount
  5. reactjs ref属性:字符串类型的ref和createRef
  6. C语言函数参数既做出参又做入参的代表
  7. 进击吧! Blazor !第五期 安全
  8. php在指定html元素中输出,如何从PHP中的数组输出html svg元素?
  9. 一个REST风格的URI设计方案[Blog Web Services]
  10. linux恢复fat文件系统,使用‘fsck’修复Linux中文件系统错误的方法
  11. html打包apk_将打包彻底一键化!Unity和Jenkins真是绝配
  12. 《深入理解Java虚拟机》第5章 调优案例分析与实战
  13. Mysql报错(必解决):The user specified as a definer (‘mysql.infoschema‘@‘localhost‘) does not exist
  14. 5步绘制软件开发流程图
  15. 实验三 直流扫描分析
  16. 申请与认证IB课程全流程
  17. 怎么设置电脑防火墙ping启用_如何通过windows防火墙启用和禁用ping命令
  18. 信号的频谱分析实验matlab,实验三 用FFT对信号进行频谱分析及MATLAB程序
  19. 【今日CV 计算机视觉论文速览 第147期】Tue, 23 Jul 2019
  20. html给图片和文字加链接 a标签的用法

热门文章

  1. 学生信息管理系统的设计
  2. 郭沫若最恶心的7首诗_郭沫若做了首反七步诗,被骂得狗血淋头,鲁迅的评价更是一针见血...
  3. PRTG Network Monitor设置邮箱告警通知
  4. 面试中常被问到(九)STL迭代器失效问题
  5. 两个变量实现查找坏环c语言,实验一C语言环境的使用(2次上机)-不再因为别人过得好而焦虑.doc...
  6. TCP协议与UDP协议的区别以及与TCP/IP协议的联系
  7. 线程锁,进程锁以及分布式锁丨锁的实现及原理分析丨高效的使用
  8. csgo跳跃只能改一个键位吗_csgo跳扔投掷物指令设置方法 怎么绑定鼠标跳扔投掷物...
  9. 补:PE文件遍历导出表——有人为你哭,说明你还是个东西
  10. socket python 连接 java_linux 下 python 和 java, socket通讯问题。