【WorldEdit】对Perlin噪声函数功能的研究[教程+讨论向]





大家好,这里是Az,最近研究了一下WE中较新的Perlin噪声功能,这里与大家分享一下研究的成果,也希望能有更多的人来一起讨论来发现它的更多功能。


Perlin噪声的函数是WorldEdit6.0 Beta 1中加入的功能,至于效果么。。图上我身后这一坨坨的蓝色羊毛就是用这个功能生成的,这个功能可以用来模拟像是洞穴等的生成,在本帖里我们将会讲到。


由于内容不能一层发完,请各位注意插楼适量及善用“只看楼主”功能。
那么,让我们开始吧~

楼主 Az蓝色轨迹  发布于 2015-08-09 09:58:00 +0800 CST  
【1】效果预览


首先,我们在正式开始之前,来看一下这个功能的效果~
使用这个函数时需要使用一个选区并使用//replace 命令加上需要的参数,这个我们接下来将会讲到
下图 我们在创建选区后使用 //replace =perlin(0,x/2,y,z/2,0.05,3,0.8)<0.1 stone

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


楼主 Az蓝色轨迹  发布于 2015-08-09 10:02:00 +0800 CST  
【2】什么是Perlin噪声?


Perlin噪声指由Ken Perlin发明的自然噪声生成算法,可以生成类似自然界的随机噪声,在许多领域都用应用,与使用纯随机数生成的噪声相比更加自然和柔和。


下图是一个一维的Perlin噪声波形

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



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


楼主 Az蓝色轨迹  发布于 2015-08-09 10:09:00 +0800 CST  
【3】不同种类的噪声


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


例如下图是一个一维的Perlin噪声

而这个则是一个随机的噪声




虽然Perlin噪声的的频率比随机噪声低,但是还是可以很容易看出二者的不同性。

楼主 Az蓝色轨迹  发布于 2015-08-09 10:16:00 +0800 CST  
【4】关于噪声的一些基本定义


在讲解Perlin噪声的生成方式,我们先看一些关于噪声的基本定义【学霸可以跳过


波长(Wavelength)就是两个波谷指尖的距离,频率就是1/波长,波幅(Amplitude)就是波的高度。
比如下图的正弦波



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




在Perlin噪声中,频率与波幅会控制成出的噪声。

楼主 Az蓝色轨迹  发布于 2015-08-09 10:25:00 +0800 CST  
【5】Perlin噪声的生成与倍频


Perlin噪声是基于种子生成的,也就是说在参数不变的情况下,同样的种子一直会给出同样的结果
Perlin噪声本身是由多个噪声函数相加产生的,这里用一维的Perlin噪声举例。
可以看到下面四个噪声函数每一个对于上一个的关系都是频率增大,波幅降低。








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


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





楼主 Az蓝色轨迹  发布于 2015-08-09 10:36:00 +0800 CST  
【6】二维Perlin噪声


在看完Perlin噪声的基本特性后,我们来看一下二维Perlin噪声的样子,以便让我们更容易理解WE中(三维)它的应用


下图是一个二维的Perlin噪声,可以看到它是一个灰度图,这个的生成比较复杂,就不过多讲解了,不过需要注意的地方是二维的Perlin噪声是一个灰度图,三维也是,灰度的表示为从 0 即纯黑到 1 即纯白。



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








像一维Perlin噪声一样,将上面的几张图加到一起,便有了了下面的二维Perlin噪声。


楼主 Az蓝色轨迹  发布于 2015-08-09 10:48:00 +0800 CST  
【7】Persistence值


Persistence值是一个值得注意的参数,在Perlin函数中它控制每个倍频与前一个倍频的关系,即频率增加与波幅降低的量,总体来说,这个值越高,Perlin噪声就越粗糙,反之,这个值越低,噪声就越平滑。
以下是几个除了Persistence值以外其他值都相同的一维Perlin函数,Persistence值分别为 1/4, 1/2 与 3/4。







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


楼主 Az蓝色轨迹  发布于 2015-08-09 10:57:00 +0800 CST  
【8】WorldEdit中的Perlin噪声生成指令


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



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




接下来我们将一一讲解这些参数

楼主 Az蓝色轨迹  发布于 2015-08-09 11:06:00 +0800 CST  
【9】种子


首先是种子
下图我们使用的命令是
//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噪声完全不同,种子可以是任何数字

楼主 Az蓝色轨迹  发布于 2015-08-09 11:11:00 +0800 CST  
【10】关于噪声生成的位置


生成Perlin噪声时需要注意的是,生成噪声时生成的位置坐标也会被带入计算,所以即使是完全一样的命令,在不同的位置生成的效果也完全不一样(你可以想象每个种子都有一个对应的全地图噪声图,生成时会把你指定的部分用方块构建出来,与MC生成地形的方式相似)


下图为同一命令在两个不同位置的选区执行的结果,以两种颜色的羊毛标注了出来。



楼主 Az蓝色轨迹  发布于 2015-08-09 11:17:00 +0800 CST  
【11】缩放系数


刚才提到了噪声生成的时候是把坐标带入计算的,如果我们为某个轴加上缩放参数,就可以拉伸或挤压该轴来影响生成出的噪声形状。


下图使用的命令是
//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轴上有了更明显的拉伸


楼主 Az蓝色轨迹  发布于 2015-08-09 11:27:00 +0800 CST  
【12】噪声频率


前面我们说到了频率会影响噪声的复杂度,在三维中也是如此,随着频率的增加,生成的形状也会更复杂
下图使用的命令是
//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
可以看到生成的噪声已经十分松散了


楼主 Az蓝色轨迹  发布于 2015-08-09 11:37:00 +0800 CST  
【13】倍频数


刚才我们提到倍频数会影响噪声的精细度,更高的倍频数意味着更多次的叠加,在WE中也是如此


下图使用的命令是
//replace =perlin(200,x,y,z,0.05,1,0.5)<0.2 35:14


可以看到这里的倍频数是1

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

下图为3倍频

下图为4倍频




可以看到噪声的整体形状没有很大变化,但精细度随着倍频数增加而提高

楼主 Az蓝色轨迹  发布于 2015-08-09 11:42:00 +0800 CST  
【14】Persistence值


我们提到Persistence值控制了每个倍频之前的频率与波幅差距,这个值越高,噪声就越粗糙,反之越平滑,在WE中也是如此。
下图使用的命令是
//replace =perlin(300,x,y,z,0.05,3,0.5)<0.2 35:14
Persistence值为 0.5 (可以大致理解为每一个倍频的频率是上一个的两倍,波幅是上一个的一半)

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

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


楼主 Az蓝色轨迹  发布于 2015-08-09 11:48:00 +0800 CST  
【15】灰度值区间


刚才我们提到了,二维的Perlin噪声是灰度图,三维也是如此,每个点都有一个灰度值,但在MC中每个方块的位置只能有“有方块”和“没有方块”两种状态,即0或者1,不存在50%灰度类似于“半个方块”的设定(说半砖的马上给我出去(╯`□′)╯(┻━┻) ,这时就需要设定灰度值区间,来确定哪些灰度值的位置需要被填充方块。
下图的生成命令为
//replace =perlin(400,x,y,z,0.05,2,0.5)<0.135:14
可以看到这个<0.1,它的意义为“小于10%灰度值(或亮度)的方块位置”,这样所有满足这个条件的方块位置都会被填上方块 (灰度值为从0到1,即从纯黑到各阶灰色到纯白)
如果逐渐增大这个数字的即代表逐渐增大允许的区间范围,结果就是生成出来的方块会更多,但由于Perlin噪声的特性整体的形状改变不大
<也可以改为>,如>0.9代表“大于90%灰度值(或亮度)的方块位置” ,这时逐渐减小这个数字就变成了增大生成方块的范围。


下图的灰度值范围为 <0.1

现在我们在不改变其他参数的情况下将它改成 <0.2 ,可以看到方块堆的体积变大了

现在是 <0.3

下图是 <0.4


楼主 Az蓝色轨迹  发布于 2015-08-09 12:02:00 +0800 CST  
【16】一些实例


以上就是Perlin噪声函数的各个参数,如果有不明白的部分欢迎提问,有错误也请指出~


讲了那么多Perlin噪声的用法,你们可能会问了,这玩意能干啥啊?
我这里总结了一些我找到的用法,各位也可以继续研究发掘这个功能的潜力。
每个例子的生成指令在图片上,还有许多需要完善的地方。


【模拟洞穴生成】

下图是将上图的石头替换成了玻璃以看到生成的情况



【模拟矿脉生成】



【模拟云朵生成】
虽然有时候会生成出一些奇怪形状的不过大体来说形状还是可以接受的



【模拟空岛生成】
可以生成出类幻想风的空岛(类似于以太那种吧),比较圆的那种

下图是上图经过自然化处理的结果


楼主 Az蓝色轨迹  发布于 2015-08-09 12:10:00 +0800 CST  
【后记】


我发现这个功能也是偶然看到了WE Bukkit Dev页面更新的一条命令,并没有详细的解释,后来我就自己试验了一下,还去找了开发者进行了交(si)流(bi),之后也查了关于噪声相关的资料,然后结合两个又做了一些实验完成了这篇研究~ 也希望能有更多的人继续完善这方面的知识~
下面福利【愉快的交(si)流(bi)过程】






就是这样 =w=

楼主 Az蓝色轨迹  发布于 2015-08-09 12:14:00 +0800 CST  
【Credits】
本篇帖子部分图片与资料来自:
freespace.virgin.net
libnoise.sourceforge.net
www.cnblogs.com
Wikipedia
百度百科

楼主 Az蓝色轨迹  发布于 2015-08-09 12:16:00 +0800 CST  
【申精】
申精理由:关于WorldEdit新功能Perlin噪声的研究与探讨(应该是首发吧?是吧?是吧?),可以作为未来更深层研究的资源。

楼主 Az蓝色轨迹  发布于 2015-08-09 12:20:00 +0800 CST  

楼主:Az蓝色轨迹

字数:4866

发表时间:2015-08-09 17:58:00 +0800 CST

更新时间:2016-03-15 11:40:19 +0800 CST

评论数:273条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看