Minecraft(我的世界)中文论坛
标题: [1.8][WorldEdit]对Perlin噪声函数功能的研究[字数~4400]
作者: LocusAzzurro 时间: 2015-8-23 00:42
标题: [1.8][WorldEdit]对Perlin噪声函数功能的研究[字数~4400]
本帖最后由 LocusAzzurro 于 2015-8-22 19:48 编辑

大家好,这里是Az,最近研究了一下WE中较新的Perlin噪声功能,这里与大家分享一下研究的成果,也希望能有更多的人来一起讨论来发现它的更多功能。
Perlin噪声是WorldEdit 6.0 Beta 1 中加入的功能,至于效果,比如上图我身后这一坨坨的蓝色羊毛就是用这个功能生成的,这个功能可以用来模拟像是洞穴等的生成,在本帖里我们将会讲到。
目录
0.效果预览
1.Perlin噪声基本介绍与相关知识
1.1.Perlin噪声介绍
1.2.不同种类噪声
1.3.波形的基本知识
2.Perlin噪声的各个参数
2.1.倍频
2.2.维度
3.3.Persistance
3.WorldEdit中的操作与相关参数
3.1.生成使用的命令
3.2.生成使用的种子
3.3.位置对生成的影响
3.4.缩放系数
3.5.噪声频率
3.6.噪声倍频
3.7.Persistance值
3.8.灰度值区间
4.生成实例
4.1.模拟洞穴生成
4.2.模拟云彩生成
4.3.模拟矿石簇生成
4.4.模拟空岛生成
4.5.随机地面构造
4.6.随机地形生成
5.后记
5.1.相关交流
5.2.Credits
WorldEdit插件系列教程(作者 shengjing1): http://www.mcbbs.net/thread-68779-1-1.html
WorldEdit插件资源(作者 sjjklh): http://www.mcbbs.net/thread-68815-1-1.html
WorldEdit插件简短介绍:
WorldEdit是一个常用的地图编辑工具,玩家可以利用它进行许多建筑中的操作,加快施工速度,同时也提供了许多便捷的功能。
2015-08-23 2:44 一次施工完成
作者: LocusAzzurro 时间: 2015-8-23 00:44
0.效果预览
首先,我们在正式开始之前,来看一下这个功能的效果~
使用这个函数时需要使用一个选区并使用//replace 命令加上需要的参数,这个我们接下来将会讲到
下图 我们在创建选区后使用- //replace =perlin(0,x/2,y,z/2,0.05,3,0.8)<0.1 stone
复制代码

效果如下图,当然,这个函数的许多参数都可以修改以达到我们希望的效果

作者: LocusAzzurro 时间: 2015-8-23 01:01
1.Perlin噪声基本介绍与相关知识
1.1.Perlin噪声介绍
什么是Perlin噪声?
Perlin噪声指由Ken Perlin发明的自然噪声生成算法,可以生成类似自然界的随机噪声,在许多领域都用应用,与使用纯随机数生成的噪声相比更加自然和柔和。
下图是一个一维的Perlin噪声波形

下图是一个二维的Perlin噪声灰度图

而我们在WE中生成的就是一个三维的Perlin噪声(关于灰度的处理我们接下来会讲到)

1.2.不同种类噪声
之前我们讲到了随机生成的噪声,它们与Perlin噪声函数的区别是,Perlin函数使用插值函数使波形更加平滑,以更加自然(这后面有许多的计算,我们这里就不讲到了,有兴趣的童鞋可以自己了解一下)
例如下图是一个一维的Perlin噪声

而这个则是一个随机的噪声 (典型的例子也包括老电视的雪花)

虽然这两者中Perlin噪声的的频率比随机噪声低,但是还是可以很容易看出二者的不同性。
随机噪声如果用WE生成表示的话可以是使用随机几率功能生成的方块,可以看到它与之前使用Perlin噪声函数生成的效果的不同

1.3.波形的基本知识
在讲解Perlin噪声的生成方式之前,我们先看一些关于波形的基本定义【学霸可以跳过
波长(Wavelength)就是两个波谷指尖的距离,频率就是1/波长,波幅(Amplitude)就是波的高度。
比如下图的正弦波

下图为一个一维Perlin噪声,可以看到它也拥有波长(所以也有频率)和波幅

在Perlin噪声中,频率与波幅会控制成出的噪声函数结果。
作者: LocusAzzurro 时间: 2015-8-23 01:19
本帖最后由 LocusAzzurro 于 2015-8-22 18:21 编辑
2.Perlin噪声的各个参数
2.1.种子与倍频
Perlin噪声是基于种子生成的,种子经过一系列计算得出一个唯一的结果,也就是说在参数不变的情况下,使用同样的种子进行生成一直会给出同样的结果
Perlin噪声本身是由多个噪声函数相加产生的,这里用一维的Perlin噪声举例。
可以看到下面四个噪声函数每一个对于上一个的关系都是频率增大,波幅降低。




如果把上面的四个噪声函数加在一起就形成了下面的Perlin噪声,我们说这个Perlin函数是4倍频,因为它是由四次叠加(遵循每次叠加增加频率降低波幅的规律)完成的,倍频的数量决定了Perlin噪声的精细程度。

比如下面的四个Perlin噪声,均使用同样的种子,分别是1倍频,2倍频,4倍频与8倍频,可以看到倍频数越高,Perlin噪声就越精细,同时整体形状不会有很大的改变。




2.2.不同维度的Perlin噪声
在看完Perlin噪声的基本特性后,我们来看一下二维Perlin噪声的样子,以便让我们更容易理解WE中(三维)它的应用
下图是一个二维的Perlin噪声,可以看到它是一个灰度图,它的生成算法比较复杂,就不过多讲解了,不过无论如何它的算法是基于一维曲线的计算方式的,我们也可以在二者中发现相似性,不过需要注意的地方是二维的Perlin噪声是一个灰度图,三维也是,灰度的表示为从 0 即纯黑到 1 即纯白。

在二维上,频率不同的噪声表现为图像的复杂度(可以说是每个像素块的大小),下面的几张噪声图的频率由低到高(图片经过了着色处理,原始噪声应为灰度图),同时波幅降低(可以理解为从黑到白的转换更加平滑)。
这几张图同时也是一个Perlin噪声的组成部分(即每个倍频)。






像一维Perlin噪声一样,将上面的几张图加到一起(可以理解为对每个点的灰度值进行相加),便有了了下面的二维Perlin噪声。

3.3.Persistance值
(注:目前没有找到准确的这个词学术名称,暂时不作翻译,如果有人知道请指出)
Persistence值是一个值得注意的参数,在Perlin函数中它控制每个倍频与前一个倍频的关系,即频率增加与波幅降低的量,总体来说,这个值越高,Perlin噪声就越粗糙,反之,这个值越低,噪声就越平滑。
以下是几个除了Persistence值以外其他值都相同的一维Perlin函数,Persistence值分别为 1/4, 1/2 与 3/4。



下图是一个表格,可以看出不同的Persistence值对每个倍频的频率和波幅以及最后结果的影响。

作者: LocusAzzurro 时间: 2015-8-23 01:58
3.WorldEdit中的操作与相关参数
3.1.生成使用的命令
在讲解完关于Perlin噪声的基本知识后,我们来看一下它在WE中的应用。
还是使用之前的例子,我们使用的命令是
- //replace =perlin(0,x/2,y,z/2,0.05,3,0.8)<0.1 stone
复制代码 效果是在选区内填充指定方块形成的Perlin噪声点
让我们逐个来看它的参数
//replace 主命令,是替换方块的命令
=perlin() 函数表达式,表示这是Perlin噪声函数,括号内为参数
0 种子,用以进行随机生成计算,刚才提到了,相同的种子在参数不变的情况下会一直给出同样的结果
x/2 X轴的缩放系数
y Y轴的缩放系数
z/2 Z轴的缩放系数
0.05 第一倍频的频率
3 倍频数
0.8 Persistence值
<0.1 灰度值范围
stone 需要使用的方块(这里是石头)

输入命令后,就成功按参数生成了Perlin噪声

接下来我们将一一讲解这些参数
3.2.生成使用的种子
首先是种子
下图我们使用的命令是
- //replace =perlin(1256,x,y,z,0.05,2,0.5)<0.1 35:14
复制代码
种子是 1256

而下图使用的种子是 1257
命令即为
- //replace =perlin(1257,x,y,z,0.05,2,0.5)<0.1 35:14
复制代码
可以看到种子不同,生成的Perlin噪声完全不同,种子可以是任何整数
3.3.位置对生成的影响
生成Perlin噪声时需要注意的是,生成噪声时生成的位置坐标也会被带入计算,所以即使是完全一样的命令,在不同的位置生成的效果也完全不一样(你可以想象每个种子都有一个对应的全地图噪声图,生成时会把你指定的部分用方块构建出来,与MC生成地形的方式相似)
下图为同一命令在两个不同位置的选区执行的结果,以两种颜色的羊毛标注了出来。


3.4.缩放系数
刚才提到了噪声生成的时候是把坐标带入计算的,如果我们为某个轴加上缩放参数,就可以拉伸或挤压该轴来影响生成出的噪声形状。
下图使用的命令是
- //replace =perlin(500,x,y,z,0.05,1,0.5)<0.1 35:14
复制代码 x,y,z 部分便是三个轴的缩放系数了,这里的三个参数都没有受到缩放,所以噪声是按原比例生成的

下图使用的命令是
- //replace =perlin(500,x,y/1.1,z,0.05,1,0.5)<0.1 35:14
复制代码 其他部分没有改变,但缩放参数部分是 x,y/1.1,z 这代表Y轴受到了1.1倍的拉伸,从生成的噪声来看亦可以看出拉伸的效果
(实际是计算的时候使用实际的坐标而使用缩放计算过的,所以位置也会稍微改变)

下图使用的缩放参数是 x,y/1.2,z 可以看出Y轴上有了更明显的拉伸

3.5.噪声频率
前面我们说到了频率会影响噪声的复杂度,在三维中也是如此,随着频率的增加,生成的形状也会更复杂
下图使用的命令是
- //replace =perlin(100,x,y,z,0.05,1,0.5)<0.3 35:14
复制代码 可以看到频率是0.05,频率的上下限为0与1,不过过高的值会让噪声看起来与随机噪声并无两样,为了更直观看到频率对结果的影响,这里我们设定了1倍频,即没有多次的叠加。
下图的频率为 0.05

现在我们在不修改其他参数的情况下逐渐加高频率
下图的频率为 0.06

下图频率为 0.07

下图频率为 0.08

下图频率为 0.09

下图频率为 0.1

下图频率为 0.2
可以看到生成的噪声已经十分松散了

3.6.噪声倍频
刚才我们提到倍频数会影响噪声的精细度,更高的倍频数意味着更多次的叠加,在WE中也是如此
下图使用的命令是
- //replace =perlin(200,x,y,z,0.05,1,0.5)<0.2 35:14
复制代码 可以看到这里的倍频数是1

现在我们在不修改其他参数的情况下增加倍频数
下图为2倍频

下图为3倍频

下图为4倍频

可以看到噪声的整体形状没有很大变化,但精细度随着倍频数增加而提高
3.7.Persistance值
我们提到Persistence值控制了每个倍频之间的频率与波幅差距,这个值越高,噪声就越粗糙,反之越平滑,在WE中也是如此。
下图使用的命令是
- //replace =perlin(300,x,y,z,0.05,3,0.5)<0.2 35:14
复制代码 Persistence值为 0.5 (可以大致理解为每一个倍频的频率是上一个的两倍,波幅是上一个的一半)

现在我们在不改变其他值的情况下将它改为 0.25,可以看到生成的噪声十分平滑

反之如果我们把他改为0.75,生成出来的效果就十分粗糙,对整体形状也有一定的改变

3.8.灰度值区间
刚才我们提到了,二维的Perlin噪声是灰度图,三维也是如此,每个点都有一个灰度值,但在MC中每个方块的位置只能有“有方块”和“没有方块”两种状态,即0或者1,不存在50%灰度类似于“半个方块”的设定(说半砖的马上给我出去(╯`□′)╯(┻━┻) ,这时就需要设定灰度值区间,来确定哪些灰度值的位置需要被填充方块。
下图的生成命令为
- //replace =perlin(400,x,y,z,0.05,2,0.5)<0.1 35:14
复制代码

可以看到这个<0.1,它的意义为“小于10%灰度值(或亮度)的方块位置”,这样所有满足这个条件的方块位置都会被填上方块 (灰度值为从0到1,即从纯黑到各阶灰色到纯白)
逐渐增大这个数字的值即代表逐渐增大允许的区间范围,结果就是生成出来的方块会更多,但由于Perlin噪声的特性整体的形状改变不大
< 也可以改为 > ,如 >0.9 代表“大于90%灰度值(或亮度)的方块位置” ,这时逐渐减小这个数字就变成了增大生成方块的范围。
现在我们在不改变其他参数的情况下将它改成 <0.2 ,可以看到方块堆的体积变大了

现在是 <0.3

下图是 <0.4

作者: LocusAzzurro 时间: 2015-8-23 02:15
本帖最后由 LocusAzzurro 于 2015-8-29 04:35 编辑
4.生成实例
以上就是Perlin噪声函数的各个参数,如果有不明白的部分欢迎提问,有错误也请指出~
讲了那么多Perlin噪声的用法,你们可能会问了,这玩意能干啥啊?
我这里总结了一些我找到的用法,各位也可以继续研究发掘这个功能的潜力。
每个例子的生成指令在图片上,还有许多需要完善的地方。
4.1.模拟洞穴生成

指令参考
- //replace =perlin(200,x,y,z,0.07,1,0.4)>0.3 stone
复制代码 下图是将上图的石头替换成了玻璃以看到生成的情况

4.2.模拟云彩生成

指令参考
- //replace =perlin(9812,x/2,y/1.5,z/2,0.08,2,0.2)<0.2 wool
复制代码 虽然有时候会生成出一些奇怪形状的不过大体来说形状还是可以接受的
4.3.模拟矿石簇生成

指令参考
- //replace =perlin(200,x/0.3,y/0.3,z/0.3,0.07,1,0.6)>0.99 coalore
复制代码
4.4.模拟空岛生成

指令参考
- //replace =perlin(2434,x/2,y,z/2,0.07,1,0.2)<0.2 stone
复制代码
可以生成出类幻想风的空岛(类似于以太那种吧),比较圆的那种
下图是上图经过自然化处理的结果

4.5.随机地面构造

这是利用3D Perlin噪声的单层切面(即生成区域仅一格高)进行地面材质模拟的结果(图中草地上的沙砾簇)
4.6.随机地形生成
这是一个将Perlin噪声生成与其他操作结合的例子,首先我们生成沙子组成的Perlin噪声点,沙子受到重力影响落地
指令参考
- //replace =perlin(23353,x/3,y/0.5,z/3,0.1,2,0.8)<0.25 sand
复制代码 沙子落地后效果如下

接下来对生成出的沙子进行平滑处理(//smooth),下图为处理后的效果

接着将沙子替换成需要的方块,这里使用了石头,效果如下,可以看出模拟出了一个自然的地形起伏

作者: LocusAzzurro 时间: 2015-8-23 02:23
本帖最后由 LocusAzzurro 于 2015-8-22 19:46 编辑
5.后记
5.1.研究相关
我发现这个功能也是偶然看到了WE Bukkit Dev页面更新的一条命令,并没有详细的解释,后来我就自己试验了一下,还去找了开发者进行了交(si)流(bi),之后也查了关于噪声相关的资料,然后结合两个又做了一些实验完成了这篇研究~ 也希望能有更多的人继续完善这方面的知识~
交流的过程当做福利大家看一下吧~





5.2.Credits
本篇帖子部分图片与资料来自:
freespace.virgin.net [关于Perlin噪声的资料与一维波形]
libnoise.sourceforge.net [关于Perlin噪声的资料与一维及二维波形]
www.cnblogs.com [关于Perlin噪声的资料与一维及二维波形]
Wikipedia-Perlin Noise词条 [关于Perlin噪声的相关资料]
百度百科-Perlin 噪声词条 [关于Perlin噪声的相关资料]
本帖首发于贴吧,原作者Az蓝色轨迹(本人)
感谢各位的观看与支持~
作者: 筒子 时间: 2015-8-23 08:33
申精的话,@一下大区版主吧
作者: Lion_W 时间: 2015-8-23 15:57
高端WE,那不是我们的世界
作者: 147822221 时间: 2015-8-23 19:39
斯。。。。斯国一。。。。
作者: jiongjionger 时间: 2015-8-23 19:55
非常不错的进阶内容
作者: 神马行空 时间: 2015-8-23 20:00
这么多内容 我有密集恐惧症
作者: ke3209 时间: 2015-8-23 23:30
我又来支持了!
然而我并不能想出更好的使用方法了……
话说WE除此之外还更新了什么我都不知道{:10_522:}
作者: j7528802 时间: 2015-8-24 07:35
新的构造地形大法吗?不知道用起来卡不卡
作者: jesse 时间: 2015-8-24 08:59
!柏林噪声!这是要变成MatlabEdit啊
作者: maxjkwang 时间: 2015-8-24 09:30
啊啊啊,好深奥啊,完全看不懂
作者: Thunderce 时间: 2015-8-24 14:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 14:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 14:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 14:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 14:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 14:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: Thunderce 时间: 2015-8-24 15:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 陌上大大 时间: 2015-8-24 15:57
谢谢指导~!!!!!!
作者: qq1758557423 时间: 2015-8-24 20:40
别人的世界{:10_522:}
作者: andylizi 时间: 2015-8-24 20:43
本帖最后由 andylizi 于 2015-8-24 20:45 编辑
。。。论数学与mc之间的关系。。
欺负我小学5年级,前半部分完全看不懂
作者: 1845797316 时间: 2015-8-24 23:43
席八,学霸来装逼了
作者: GrowlR 时间: 2015-8-25 13:56
完全没看懂啊
作者: 泰米瑞斯 时间: 2015-8-25 14:00
我的天、、就题目我就看不懂了、、
作者: 261171193 时间: 2015-8-25 15:30
这个是创世神?
作者: Lonon 时间: 2015-8-25 18:15
太难看懂,不回了!
作者: Blove 时间: 2015-8-25 21:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: lishanghua 时间: 2015-8-26 08:22
冒昧的问一句楼主先生你多大。。。。
表示我才初一、、
作者: WM2030 时间: 2015-8-26 21:33
MC正在走向学霸的世界!
作者: WM2030 时间: 2015-8-26 21:36
MC正在走向学霸的世界!
作者: LocusAzzurro 时间: 2015-8-27 11:12
啊。。我18 _(:зゝ∠)_
作者: LocusAzzurro 时间: 2015-8-27 11:13
对啊=-= WE的功能其实很多的
作者: 48856209 时间: 2015-8-27 12:57
不错啊 通俗易懂 比例生成什么的都弱爆了~
作者: Danger_S.M 时间: 2015-8-27 19:25
对人很有帮助
作者: 1061948186 时间: 2015-8-28 18:45
火后留名,不明觉厉
作者: Wilderness Rgr 时间: 2015-8-29 09:41
坑爹的自定义地形+矿石生成终于解决了{:10_512:}赞
作者: LocusAzzurro 时间: 2015-8-29 11:43
其实 Perlin噪声除了这里在许多方面都有很大的应用~
作者: andylizi 时间: 2015-8-29 13:39
这玩意太高大上了QAQ我在试着反编译它的源码,看看能不能弄出个空岛地形生成器(或洞穴地形之类的)
作者: nikoniko_ni 时间: 2015-8-29 14:04
Minecraft生成地图就是用这个原理生成的吗?
作者: 骑驴上高速—— 时间: 2015-8-31 08:04
看完才发现是1.8的(╯‵□′)╯︵┻━┻
作者: 江米条 时间: 2015-8-31 11:41
quq太好了,看来我的空岛有救了,我现在就去升级
作者: LocusAzzurro 时间: 2015-9-14 23:27
原理上来说基本是基于这种算法 不过实际的应用方式肯定有所不同
作者: sofa 时间: 2015-10-1 10:45
看起来好高端的样子,中间那些什么函数图完全看不懂啊= =还是顶一个
作者: 10123482 时间: 2015-11-13 15:15
we的神仙
作者: 10123482 时间: 2015-11-15 13:51
数学模型啊,太高级了
作者: 孤独秋叶 时间: 2016-2-20 18:50
噪声越接近柔和方块呈现的责是那种蜿蜒的形状,可以用于制作飞行PVP战斗区。
persistence值高就会使perlin粗糙,原来是这样...
拿去玩玩做实验,说真的这个WE的三维功能可以做到很多奇特的方块组合而成的形状,如果用的好那将会是神一般的空岛铺垫了。
版主是否能继续做一些研究这类的教程,我很感兴趣。
作者: xjzh123 时间: 2019-8-29 13:39
突然想到如果用特定的参数把这个所谓的“全地形噪声图”生成出来,不就是一张光怪陆离的地图了吗