噪声设置——浅谈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文件,我们会发现,我们用了这么多章节讲述的内容,不过是其中的一个键而已。

没错哦就是它

在之后,我们就要开始为这个世界添加丰富多彩的生物群系了,而不是简单的调用预设好的生物群系类型。相信我,后面的内容会之前的一样精彩。

类似文章

发表回复