噪声设置——浅谈Minecraft地形生成(六)
噪声设置(Noise settings)用于生成地形和噪声洞穴的形状,以及生成地形时使用哪些方块,其以JSON文件的形式存储在数据包的
data/<命名空间>/worldgen/noise_settings
目录下,用于维度中的minecraft:noise
生成器。原版中的设置包括:minecraft:overworld
用于一般的主世界生成,minecraft:amplified
用于放大化主世界生成,minecraft:nether
用于常规的下界生成,minecraft:caves
用于洞穴生成,minecraft:end
用于常规的末地生成,minecraft:floating_islands
用于浮岛的生成。
在之前的内容中,我们从噪声开始,一步一步解析了噪声是如何决定Minecraft地形生成的。我们以简化版的主世界密度函数为例子,分析了主世界噪声的计算过程。事实上,除了地形以外,噪声还影响了世界生成的各个方面,它们都以密度函数的形式,配置在噪声设置中。
噪声设置的JSON格式很长,所以我们会分段进行展示和讲解。在没有特别说明的情况下,均默认图中的JSON位于根对象下。
大多数键,在Wiki上都有详尽的描述,在这里我们就不会赘述了。
这个键的描述中有一个看起来很大的公式,这个公式由两部分相加。前面的部分显然在x和z在较大值的时候比较大,因此可以用来控制玩家的出生点位置更倾向于靠近原点(0,0)。第二部分则是用来控制玩家更容易生成在哪个生物群系中。spawn_target本身是一个含有七个元素的列表,这六个元素分别对应了生物群系噪声参数的温度、湿度、大陆性、侵蚀性、怪异度、深度和偏移量。除了偏移量外,其余六个参数都有三种写法——{"min":1,"max":2}
,[1,2]
,1
。偏移量这个参数较为特殊,会在之后讲解生物群系生成的时候提到(Wiki中的描述可能有些令人费解)。
这四个参数用于世界生成的参数。前两个wiki些的非常详细,而后两个则比较模糊。最后两个参数都用于控制垂直方向和水平方向上元胞的大小。元胞是密度函数采样的单元。例如将两者分别设置为1和2,那么元胞就是一个底面边长为1,高度为2的长方体。在区块生成的过程中,按照上述的例子,在水平方向上就会被划分为16/1=16个元胞,纵向上会被划分为16/2=8个元胞。
这个选项决定了噪声,或者说密度函数,应该如何控制地形的生成。值得注意的是前两个密度函数,只有最终密度函数直接控制了地形是空气还是石头,第一个密度函数只会用于计算初始地表高度,这会在后续的应用表面规则等步骤用到,这一步的精度比最终密度函数低,从某种意义上也提高了世界生成的性能。
下面是主世界在这部分的参数设置(除去了前两个):
"noise_router": { "barrier": { "type": "minecraft:noise", "noise": "minecraft:aquifer_barrier", "xz_scale": 1, "y_scale": 0.5 }, "fluid_level_floodedness": { "type": "minecraft:noise", "noise": "minecraft:aquifer_fluid_level_floodedness", "xz_scale": 1, "y_scale": 0.67 }, "fluid_level_spread": { "type": "minecraft:noise", "noise": "minecraft:aquifer_fluid_level_spread", "xz_scale": 1, "y_scale": 0.7142857142857143 }, "lava": { "type": "minecraft:noise", "noise": "minecraft:aquifer_lava", "xz_scale": 1, "y_scale": 1 }, "temperature": { "type": "minecraft:shifted_noise", "noise": "minecraft:temperature", "xz_scale": 0.25, "y_scale": 0, "shift_x": "minecraft:shift_x", "shift_y": 0, "shift_z": "minecraft:shift_z" }, "vegetation": { "type": "minecraft:shifted_noise", "noise": "minecraft:vegetation", "xz_scale": 0.25, "y_scale": 0, "shift_x": "minecraft:shift_x", "shift_y": 0, "shift_z": "minecraft:shift_z" }, "continents": "minecraft:overworld/continents", "erosion": "minecraft:overworld/erosion", "depth": "minecraft:overworld/depth", "ridges": "minecraft:overworld/ridges" }
不少密度函数都进行了进一步的修饰,用来更好的调控地形的生成。
注意后面几个控制生物群系噪声参数的噪声,它们也参与了地形生成的过程,因此地形和生物群系实际上是高度绑定的,都受到同一组噪声的控制。
最后一个,地表规则,就是我们上一章中提到的内容了。地表规则(或者说表面规则)在噪声设置中被使用。
小结
那么,以上就是噪声设置的全部内容。到此为止,地形生成的部分我们就暂时告一段落了,利用以上的内容,我们已经可以构建出不少精彩的地形。在构建的过程中,你也可以多多参考原版地形的生成,或者参考其他地形生成数据包的json文件的编写。但是,回过头看我们在最开始的时候,创建一个新的维度的时候写的JSON文件,我们会发现,我们用了这么多章节讲述的内容,不过是其中的一个键而已。
在之后,我们就要开始为这个世界添加丰富多彩的生物群系了,而不是简单的调用预设好的生物群系类型。相信我,后面的内容会之前的一样精彩。