粉刷世界——浅谈Minecraft地形生成(七)
在Minecraft的世界中,除了奇特多样的地形外,还有丰富的生物群系覆盖着这片大地,让石头山变为壮丽的雪峰,洼地变为沼泽。如果没有生物群系,整个世界将会非常的单调。在之前的内容中,我们一直使用的原版的生物群系生成方式,或者就干脆指定一个单一的生物群系。在接下来的内容中,我们就将会学会如何自己来控制生物群系的生成。
生物群系参数
在生成世界的时候,主要有五个主要参数控制生物群系的生成——即温度、湿度、大陆性、侵蚀度、怪异度。后三个参数除了控制生物群系以外,还会控制地形的生成,例如大陆性越高,距离海洋越远;侵蚀性越高,地形越平坦;怪异度越高,地形就越奇特。前两个参数仅仅用于控制生物群系的生成。
这五个参数分别对应了五个噪声图,因此,在世界上的不同位置,这五个参数的值也不同。在游戏中,你可以按下F3键打开调试屏幕:
上图中的NoiseRouter就是世界生成的噪声参数,其中就可以找到这五个参数的信息。T表示温度,V表示湿度,C表示大陆性,E表示侵蚀度,W表示怪异性。后面的数字就是表示这个位置这五个参数的值是什么。
生物群系会生成在相应参数的位置,比如温度高的地方会生成沙漠,温度低的地方就是雪山或者雪松林之类的。
生物群系列表
在生成了五张噪声图以后,Minecraft就会开始根据这些噪声图粉刷这个世界。在维度JSON文件中(没错哦还是维度JSON)的生成设置里面,有一个列表,表示了要生成哪些生物群系,以及要如何生成一个生物群系。它大概在这个位置(biome_souorce):
注意啦,要填写generator
的type
为noise
才能用噪声生成地形哦。
如果我们把biome_source
的type
填写为multi_noise
,就表示我们要使用噪声图来控制生物群系的生成。而此时有两个字段可以填写:若填写preset
,就是使用原版的生物群系预设了,包括下界和主世界;而若填写biomes
列表,就表示我们要亲手控制生物群系是怎么生成的。
这个列表的元素是长这个样子的:
{ "biome": "minecraft:mushroom_fields", "parameters": { "temperature": [-1,1], "humidity": [-1,1], "continentalness": [-1.2,-1.05], "erosion": [-1,1], "weirdness": [-1,1], "depth": 0, "offset": 0 } }
biome
是一个字符串,就是要生成那个生物群系。在这个例子中,就是蘑菇岛啦。这里可以填写你自定义的生物群系(自定义生物群系后面会讲啦)。而parameters
里面就是我们刚刚说的参数信息啦,可以是一个值也可以是一个区间。
在不同的点上,会选择列表中与这一点的参数最接近的那个生物群系。什么意思呢?假设一个点的温度是0.1,生物群系A的温度是0.2,生物群系B的温度是0.5,那么就显然0.2-0.1的绝对值更小,就会选择A作为这个点的生物群系。在考虑所有的参数的时候,计算是通过取差的平方和然后开根号进行的(就像计算两个点之间的直线距离一样!)。但是参数可以是一个区间,如果是区间的时候应该怎么计算呢?那就是距离区间边界的距离了。比如0.1距离区间[0.2, 0.4]的距离是0.1,而距离区间[-0.3, -0.2]的距离则是0.3。
现在,我们可以看到其中总共有——欸?七个参数?我们刚刚说的不是五个吗,最后两个参数是什么意思呢?
深度很容易理解,在世界Y值越低的地方,这个值就越低。这样的话,我们只要控制Y值低的地方生成洞穴生物群系,就能保证洞穴群系会生成在地下世界了。
而偏移是什么呢?在世界的任何位置,这个值都是0。所以,在选择某个点的生物群系的时候,偏移越大的生物群系和这个点的“距离”就越远,就越不占优势。比如有两个生物群系A和B,假设它们其他参数相同,但是生物群系A的偏移值为0.2,而生物群系B的偏移值为0.3,那么在生成的时候,就会优先选择生物群系A。但是如果其他参数不同,综合考虑所有的七个参数以后,生物群系B与当前点的“距离”仍然有可能小于生物群系A。
因此,总共有七个参数一起控制世界中生物群系的生成。那么按照惯例,现在我们应该看一看主世界的生物群系生成了。但是当我们打开主世界的json后,会立刻傻眼(如果你用misode的生成器打开它的话,你的浏览器应该会卡顿一下),因为json实在是太——多——了——,超过二十万行!显然这么长的json,绝对不会是手写的了。那么主世界究竟是怎么生成的呢?
生物群系表
以下图片均引用自视频:https://youtu.be/CSa5O6knuwI。视频被翻译至:https://www.bilibili.com/video/BV13u411j7KX/
事实上,有几张表格用来控制生物群系的生成。例如下面的表格,会在山脊性比较高的时候使用(左侧是山脊性,蓝色高亮部分表示选中了山脊性比较高的区域):
这个表格的横竖分别是大陆性和侵蚀性。首先,我们将连续的值划分为不同的区间,比如大陆性就被划分为表格中从右到左的远海内陆,内陆,近海内陆,沿海地区等等,而侵蚀性则被划分为了七个层次。现在我们有一个点的大陆性和侵蚀性的值,就可以判断它在表格中的哪个位置,比如我们这个点的大陆性对应的是Near inland,而侵蚀性对应的2,那么就会选中Middle biome。接下来我们会使用另一张表格进行进一步的选取:
这张表格以温度和湿度作为参数。和上面一样,我们将温度和湿度划分为不同的区间,然后进行选取。
之后,我们还会继续考虑奇异度、深度和偏移等,从而具体地确定要选择哪个生物群系。这种方法的好处在于,我们不用同时考虑七个参数而烧坏脑子,而是将参数两两考虑,将生物群系进行分类,然后进行层层选取,最后选取到我们需要的生物群系。事实上,你可以不用按照上面的顺序划分表格,这只是原版的一种参考啦。你可以用任何你喜欢的方式来划分表格。
在划分完毕后,所有的生物群系都会在七个参数上对应一个具体的值或者区间,你可能需要使用一些工具来帮助你计算出所有的生物群系的这七个参数,然后转换为JSON格式。
小结
本章节中,我们了解到了如何控制生物群系在世界中的生成方式,了解到了生物群系中的所有参数。现在,回过头去看第六章,或许你会对噪声设置中的参数有更好的了解。接下来,我们就要讲解如何自定义一个全新的生物群系了~