本站文本内容除另有声明外,转载时均必须注明出处,并遵守CC BY-NC-SA 3.0协议。(转载须知)
本站是中文Minecraft Wiki的镜像站,与Mojang Studios、Weird Gloop没有从属关系。(免责声明)
世界生成
阅读
2026-08-25更新
最新编辑:中文mcwiki机器人
阅读:
更新日期:2026-08-25
最新编辑:中文mcwiki机器人
世界生成(World/Level Generation),或缩写为worldgen/levelgen,是世界从无到有,按照指定步骤放置生物群系、地形特征、生成结构、地物和产生初始生物的过程。游戏根据不同的种子可以生成多种多样的世界,总数可达1.8×1019左右(即264)。为尽量保证在使用相同种子时生成相同的世界,世界生成拥有一系列复杂的算法用于计算指定世界指定位置应该生成什么,在有限的体积中为游戏提供了无限的可能性。
世界生成也可以是字面上的,即世界生成完毕后由于全局世界变化导致的各类生成,本文不讨论这些情况。
生成阶段
世界生成不是一步到位,而是分阶段进行计算。
当一部分区块被加载时,玩家可能不会立刻到达这部分区块,那么这部分区块就可以停留在较低的生成阶段,从而减少世界生成造成的性能负担。当玩家接近时,区块的生成阶段会逐步升高,直到生成完毕,在玩家视角下这些区块就像“立刻”被生成出来一样。对于这些玩家不可见而停留在较低生成阶段的区块,我们使用原型区块(Proto Chunk)代指它们;对于已经生成完毕,玩家可以访问的区块,我们把它们称为世界区块(Level Chunk)。玩家可以访问的区块一定已经生成完毕,即玩家可见范围一定是世界区块,但玩家不可见范围内的区块不一定是原型区块,因为它们可能在先前的加载中已经被生成完毕成为世界区块。
在Java版中,一个区块从无到有共需要经历下面这些阶段:
- 未进行生成(Empty):区块未进行任何生成。如果一个区块从未被加载过,那么在加载这个区块进入内存时它就会处于这个状态。这个状态不会持续很久,因为在加载后区块就会逐步进行生成。
- 生成结构范围(Structure Starts):区块内当前仍然没有任何方块,但会开始计算结构能否放置在此区块,并计算出结构的范围和结构内部的结构片段范围,同时决定结构起始生成点。
- 计算结构引用(Structure References):计算区块内引用的结构片段,以防止丢失结构片段或使结构生成被截断。计算后的结构数据会持久化保存在区块的数据内。
- 填充生物群系(Biomes):计算区块内所有生物群系单元,并持久化保存于区块数据中。在此阶段区块内仍然不存在任何方块。
- 填充初始噪声地形(Noise):计算区块内的密度函数用于填充初始方块,计算含水层并放置液体,并生成矿脉。在此阶段,区块内才开始有方块进行放置。
- 应用表面规则(Surface):计算表面规则,为上一阶段生成的初始地形覆盖地表方块。基岩层和深板岩也会在此阶段进行生成。
- 地形雕刻(Carvers):雕刻上一个阶段中生成的地形,将部分方块重新替换为空气。
- 生成地物(Features):此阶段又被称为世界装饰(Decoration)阶段。结构和地物按照固定顺序依次放置,高度图在此阶段完善。
- 初始化光照计算(Initialize Light):初始化光照系统,计算区块内的光源。
- 计算初始光照(Light):以上一阶段计算出的光源信息,计算区块内的光照数据。
- 生成初始实体(Spawn):进行初始动物生成。
- 区块生成完毕(Full):将原型区块转换为世界区块,并执行上面所有阶段中没有执行而延迟的方块更新。
随机化生成
世界生成不仅需要保证同一个种子生成的世界大致类似,也要保证不同种子之间具有明显的差异性。在游戏中主要采用了伪随机数和噪声提供世界生成中所需的稳定随机化数据。
伪随机数
对于不同的世界,世界的样貌不应该十分相似,而应该更加“随机化”。伪随机数生成器(PRNG)在这个过程中起到了很大的作用。
伪随机数并不是真实的随机数,而是通过一系列复杂的运算,从而得到一系列离散且近似均匀分布的值。正因为伪随机数的性质,如果我们固定了伪随机数发生器的某一个状态(也就是种子),那么它接下来生成的伪随机数都可以被预测,这正好满足了世界生成时不同世界应该不同,而使用相同种子的世界应该相同的要求。
目前,游戏内主要使用两种伪随机数发生器,分别为:
- 线性同余伪随机数发生器(LCG):由Java标准库提供。对于输入的种子,只能利用后48位进行伪随机数生成。
- Xoroshiro128++伪随机数发生器:对于输入的种子可以更加充分利用,避免相似种子对最终生成结果的影响。
噪声
如果要生成一个合理且随机的世界,我们需要找到一系列随机且平滑的函数以提供我们所需的放置数据。显然,一个周期函数并不能满足我们的要求,因为它没有太多的随机性;同样,如果数据完全被随机化(即白噪声),那么它就不够平滑,最终生成的世界会变得混乱无序。为处理上述的问题,游戏内使用了噪声进行各种生成。
游戏中最常用的噪声是柏林噪声。利用上述的伪随机数算法,填充顶点的梯度,从而使噪声与种子相关,保证了它的随机性;同时,噪声函数内具有插值函数,用于平滑输出值,保证生成的连续性。但是,单独的柏林噪声仍然不能满足全部的要求:它无法生成过高或过低的值,使得地形产生高山和深谷。为解决这个问题,游戏内使用的所有噪声都进行了分形叠加,并将两个相似的柏林噪声结合起来一起计算,为噪声输出增加差异性。
除柏林噪声外,游戏内还使用了单纯形噪声和这两种噪声结合起来的噪声。
生成生物群系
生物群系的生成贯穿了整个世界生成的流程。从生成结构范围到放置地物阶段,每个阶段都需要查询某个位置是什么生物群系,以决定应该生成什么方块或放置什么结构。
生物群系单元
在绝大多数的生物群系检查、放置与保存中,生物群系并不以一格方块为单位,而是以生物群系单元为单位。一个生物群系单元共包含4×4×4个方块,在其中的所有位置在生成时都被认为处于一个生物群系。
在进行更加细致化的操作(渲染,针对于某个位置的地形雕刻等)时,生物群系会“放大”到每一个方块上,从而形成更加平滑的生物群系边缘。放大本质上是计算一个位置与临近生物群系单元的距离,并加上位置相关的随机数,并找到最小距离的生物群系单元,以对应单元的生物群系作为此处的生物群系。
生物群系产生源
对于不同的维度,生物群系的种类和放置规则也不同。在游戏中主要存在下列四种生物群系产生源:
- 棋盘格生物群系产生源:每个生物群系呈正方形或近似正方形,并沿对角线重复排列。
- 固定生物群系产生源:所有位置都只使用同一种生物群系。
- 末地生物群系产生源:Java版中用于生成末地的生物群系产生源。
- 多重噪声生物群系产生源:使用多重噪声,并计算距离采样点最近的生物群系噪声区间。
在默认情况下,主世界和下界使用多重噪声生物群系产生源。在Java版中,末地使用末地生物群系产生源;在基岩版中,末地使用固定生成
末地一种生物群系的产生源。
末地生物群系产生源
末地包含五种生物群系:
末地、
末地小型岛屿、
末地荒地、
末地内陆和
末地高地。
末地在以世界原点(0, 0)为中心,以近似圆形的方式向外扩展1024格内的区域放置。而其他四种群系则根据侵蚀度密度函数的大小按梯度进行放置:
| 生物群系 | 侵蚀度 |
|---|---|
| <-0.21875 | |
| -0.21875~-0.0625 | |
| -0.0625~0.25 | |
| >0.25 |
多重噪声生物群系产生源
多重噪声生物群系产生源使用6个密度函数用于计算生物群系应该如何放置。这6个密度函数包括:
- 温度(Temperature):大致决定生物群系的温度,但此温度与生物群系内部使用控制雨雪等的温度不同。
- 湿度(Humidity/Vegetation):大致决定生物群系的湿度,但此湿度与生物群系内部使用控制着色等的降水值不同。
- 大陆性(Continents/Continentalness):大陆性象征着生物群系的海陆关系,值越高就越接近内陆,值越低就越接近海洋,如果值非常低则生成蘑菇岛。
- 侵蚀度(Erosion):决定了生物群系的侵蚀程度。侵蚀度越低生物群系就越陡峭崎岖,更容易产生山地和山峰生物群系;侵蚀度越高生物群系就越平坦,更容易产生平原类的生物群系。
- 奇异性(Weirdness/Ridges):决定生物群系是否为它的“变种”,例如平原的变种就是向日葵平原。如果一个生物群系没有变种,则奇异性的大小基本不会影响它的放置。
- 深度(Depth):决定生物群系放置的高度。一个水平位置根据高度不同可以有不同的生物群系,而深度可以控制生物群系应该放在什么高度上。
在Java版中,上述6个密度函数值都以可以在调试屏幕的“NoiseRouter”行找到。
每个生物群系都有一系列的放置区间,每一个放置区间都包含对于每个密度函数的区间和偏移值(Offset)。当游戏计算一个生物群系单元的生物群系时,会计算出这个单元的6个密度函数值,并找出所有密度函数和对应放置区间距离平方和与放置区间偏移值平方之和最小的生物群系,作为这个生物群系单元的生物群系。
以数学语言描述,假设一个放置区间的偏移值为[math]\displaystyle{ b }[/math],上述6个密度函数的区间按顺序缩写为[math]\displaystyle{ [m_i,n_i] }[/math](区间上下限可以相等),生物群系单元的密度函数计算值按顺序缩写为[math]\displaystyle{ v_i }[/math]。定义距离函数[math]\displaystyle{ \mathrm{distance}(m,n,v) }[/math]:如果[math]\displaystyle{ v\lt m }[/math],则[math]\displaystyle{ \mathrm{distance}(m,n,v)=m-v }[/math];如果[math]\displaystyle{ v\gt n }[/math],则[math]\displaystyle{ \mathrm{distance}(m,n,v)=v-n }[/math];否则,[math]\displaystyle{ \mathrm{distance}(m,n,v)=0 }[/math]。遍历所有生物群系的放置区间,计算[math]\displaystyle{ b^2+\sum(\textrm{distance}(m_i,n_i,v_i))^2 }[/math],找到计算值最小的放置区间,此时这个放置区间对应的生物群系就是这个生物群系单元的生物群系。
主世界生物群系
主世界生物群系放置默认使用了上述所有密度函数,但不使用偏移值,即所有放置区间的偏移值都为0。
为了将这些密度函数进行更详细的划分,游戏内对这些密度函数根据不同的值分出不同的等级。下面列出了原版游戏中各个密度函数的取值上下限和被游戏使用的等级:
- 温度范围为-2.22~2.22,被划分为5个等级,从等级0到等级4对应的区间范围分别为:-1~-0.45、-0.45~-0.15、-0.15~0.2、0.2~0.55、0.55~1。
- 湿度范围为-1.69~1.69,被划分为5个等级,从等级0到等级4对应的区间范围分别为:-1~-0.35、-0.35~-0.1、-0.1~0.1、0.1~0.3、0.3~1。
- 大陆性范围为-3.66~3.66,被划分为7个等级:蘑菇岛(小于-1.05)、深海(-1.05~-0.455)、海洋(-0.455~-0.19)、沿岸(-0.19~-0.11)、准内陆(-0.11~0.03)、内陆(0.03~0.3)和深内陆(大于0.3)。
- 侵蚀度范围为-2.42~2.42,被划分为7个等级,从等级0到等级6对应的区间范围为:-1~-0.78、-0.78~-0.375、-0.375~-0.2225、-0.2225~0.05、0.05~0.45、0.45~0.55、0.55~1。
根据奇异性,游戏内还使用了山脊性(Peaks and Valleys/Ridges Folded)用于决定生物群系的高度。如果奇异性为[math]\displaystyle{ w }[/math],则山脊性[math]\displaystyle{ p=1-\vert 3\vert w \vert-2 \vert }[/math]。山脊性也被划分为5个等级:河流(-1~-0.85)、低地带(-0.85~-0.2)、低山带(-0.2~0.2)、高山带(0.2~0.7)、山峰带(0.7~1)。由于山脊性本身不参与生物群系的放置,实际起作用的是奇异性,所以不能完全通过山脊性判断生物群系。如果奇异性超过-1~1的范围,则山脊性可能显示为低山带、低地带或河流,但实际上有更大的可能放置低山带生物群系。由于奇异性在0附近时对应山脊性是-1左右,所以生物群系的标准类型和变种通常不在河流的同一岸。
在Java版中,山脊性的精确值在“NoiseRouter”行可以找到,划分的等级可以在“Biome builder”行找到。如果一个密度函数值小于最小的区间范围则显示为最小的等级,如果大于最大的区间则显示为“?”。“Biome builder”行的等级值只在默认的主世界中有效,在其他维度和自定义维度中的显示不能代表实际的生成情况。
下列是主世界放置生物群系的放置步骤。由于生物群系放置本质上需要计算密度函数的距离,在这里的“放置步骤”只是为了简单描述的说法,实际上并不存在这些步骤。对于不在指定区间内的采样点也无法使用接下来的表格,需要精确计算才能确认生物群系。下文中所有大写字母(T、H、C、E、W、D、PV)代表对应密度函数的等级值,小写字母(t、h、c、e、w、d、pv)代表对应密度函数的精确值。
首先,计算生物群系单元的深度。深度和高度相关,每下降一个生物群系单元(4格高),深度升高1⁄32(0.03125)。根据深度的不同,可能放置下列生物群系:
| 深度d | 放置的额外条件 | 生物群系 |
|---|---|---|
| 0 | 无 | 地表生物群系 |
| 0.2~0.9 | 0.8<c<1 | |
| 0.7<h<1 | ||
| -0.19<c<0.55 e>0.45 -1.1<w<-0.85 |
||
| 1 | 无 | 地表生物群系 |
| 1.1 | e<-0.375 |
如果深度值没有准确落入这些区间,则近似取距离更近的生物群系。当深度在0.2~0.9之间时,
溶洞、
繁茂洞穴和
硫黄洞穴的放置条件可能同时满足,导致游戏内可能无法正确识别生物群系,造成最终地物放置不同,使用/locate biome时也会产生问题。[1]
在计算地下的生物群系后,根据大陆性分出海洋类生物群系和陆地生物群系。海洋类生物群系只与温度和大陆性有关:
| 温度T | 海洋 Ocean |
深海 Deep Ocean |
蘑菇岛 Mushroom fields |
|---|---|---|---|
| 0 | |||
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | |||
陆地生物群系使用山脊性、侵蚀度和大陆性继续细分,组成下列表格:
| 山脊性PV | 侵蚀度E | 沿岸 Coast |
准内陆 Near inland |
内陆 Mid inland |
深内陆 Far inland |
|---|---|---|---|---|---|
| 河流 Valley |
0~1 | 低山带生物群系(T<4) 恶地类生物群系(T=4) | |||
| 2~5 | |||||
| 6 | |||||
| 低地带 Low |
0~1 | 低山带生物群系(T<4) 恶地类生物群系(T=4) |
低山带生物群系(0<T<4) 恶地类生物群系(T=4) | ||
| 2 | 低山带生物群系 | 低山带生物群系(T<4) 恶地类生物群系(T=4) | |||
| 3 | 海滩类生物群系 | ||||
| 4 | 低山带生物群系 | ||||
| 5 | 海滩类生物群系(w<0) 低山带生物群系(w>0; T=0,1或H=4) |
低山带生物群系(w<0或T=0,1或H=4) | |||
| 6 | 海滩类生物群系 | 低山带生物群系(T=0) | |||
| 低山带 Mid |
0 | 高原类生物群系(T=3,4) | |||
| 1 | 低山带生物群系(0<T<4) 恶地类生物群系(T=4) |
高原类生物群系(T>0) | |||
| 2 | 低山带生物群系 | 低山带生物群系(T<4) 恶地类生物群系(T=4) |
高原类生物群系 | ||
| 3 | 低山带生物群系 | 低山带生物群系(T<4) 恶地类生物群系(T=4) | |||
| 4 | 海滩类生物群系(w<0) 低山带生物群系(w>0) |
低山带生物群系 | |||
| 5 | 海滩类生物群系(w<0) 低山带生物群系(w>0; T=0,1或H=4) |
低山带生物群系(w<0或T=0,1或H=4) |
风袭类生物群系 | ||
| 6 | 海滩类生物群系(w<0) 低山带生物群系(w>0) |
低山带生物群系(T=0) | |||
| 高山带 High |
0 | 低山带生物群系 | 高原类生物群系(T=3,4) |
恶地类生物群系(T=4) | |
| 1 | 低山带生物群系(0<T<4) 恶地类生物群系(T=4) |
高原类生物群系(T=3,4) | |||
| 2 | 低山带生物群系 | 高原类生物群系 | 高原类生物群系 | ||
| 3 | 低山带生物群系(T<4) 恶地类生物群系(T=4) | ||||
| 4 | 低山带生物群系 | ||||
| 5 | 低山带生物群系(w<0或T=0,1或H=4) |
风袭类生物群系 | |||
| 6 | 低山带生物群系 | ||||
| 山峰带 Peak |
0 | 恶地类生物群系(T=4) |
恶地类生物群系(T=4) | ||
| 1 | 低山带生物群系(0<T<4) 恶地类生物群系(T=4) | ||||
| 2 | 低山带生物群系 | 高原类生物群系 | 高原类生物群系 | ||
| 3 | 低山带生物群系(T<4) 恶地类生物群系(T=4) | ||||
| 4 | 低山带生物群系 | ||||
| 5 | 风袭类生物群系(w<0或T=0,1或H=4) |
风袭类生物群系 | |||
| 6 | 低山带生物群系 | ||||
表格中的海滩类生物群系、低山带生物群系、恶地类生物群系、风袭类生物群系、高原类生物群系继续按照温度和湿度划分,得到最终的生物群系。
海滩类生物群系生成在地势较低的沿岸边,具体生物群系只与温度有关。
| 温度T | 生物群系 |
|---|---|
| 0 | |
| 1~3 | |
| 4 |
恶地类生物群系通常生成于低侵蚀的内陆中,也可以生成在地势高低侵蚀的沿岸边,具体生物群系与湿度和奇异性有关。
| 湿度H | 生物群系 |
|---|---|
| 0~1 | |
| 2 | |
| 3~4 |
低山带生物群系是陆地上最广泛的生物群系,具体生物群系与温度、湿度、奇异性有关。
温度T 湿度H
|
0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | |||||
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
高原类生物群系生成于内陆地势高中等侵蚀程度的地方,具体生物群系与温度、湿度、奇异性有关。
温度T 湿度H
|
0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | |||||
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 |
风袭类生物群系生成于内陆高侵蚀度的地方,具体生物群系也与温度、湿度、奇异性有关。
温度T 湿度H
|
0~1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 0~1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
下界生物群系
下界与主世界类似使用多重噪声生物群系产生源,但它只使用了温度、湿度和偏移值,其他四项密度函数都固定为0。
下列表格是下界各个生物群系的放置点(放置区间上下限相等):
| 生物群系 | 温度 | 湿度 | 偏移 |
|---|---|---|---|
| -0.5 | 0 | 0.175 | |
| 0.4 | 0 | 0 | |
| 0 | 0 | 0 | |
| 0 | -0.5 | 0 | |
| 0 | 0.5 | 0.375 |
生成初始地形
地形生成器决定了一个位置是空气、是流体、是矿脉还是维度初始方块(或称为默认方块),为后面的生成阶段提供地形基础。
原理
初始方块放置
一个位置是否为维度初始方块,由最终密度函数(Final Density)决定。在Java版中,调试屏幕的“NoiseRouter”行中的N代表的就是最终密度函数。
最终密度函数[math]\displaystyle{ \mathrm{n}(x,y,z) }[/math]接受一个三维的方块位置,并返回一个值。如果有一个位置[math]\displaystyle{ (x,y,z) }[/math],它的最终密度函数值[math]\displaystyle{ \mathrm{n}(x,y,z) }[/math]大于0,则可以放置维度初始方块;否则,可以放置空气或流体。
含水层
含水层(Aquifers)是地形生成中用于决定最终密度值不大于0时,方块该如何放置的系统。虽然名称为“含水层”,但实际上它处理所有流体,也负责放置空气。
在执行含水层放置之前,游戏需要计算初步地表高度(Preliminary Surface Level),而这个高度和原始密度函数(Initial Density without Jaggedness)有关。在Java版中,调试屏幕的“NoiseRouter”行中的AS代表的就是原始密度函数。当游戏要计算初步地表高度时,游戏会从最高高度向下遍历,直到找到原始密度函数大于0.390625的高度,作为初步地表高度。
接下来,游戏需要计算每个位置的流体状况,它包含两个状态量:
- 流体状态(Fluid Status):当前位置可能放置的流体。
- 流体表面高度(Fluid Level):流体表面的高度,如果检查位置高于此高度则流体状态会被识别为空气。
以下列步骤计算每个位置的流体状况:
- 定义基础流体选择器:如果位置高度低于-54并且低于本维度的海平面高度,则流体状态为熔岩,流体表面高度为-54(此值被硬编码);否则,流体状态为维度默认流体,流体表面高度为维度海平面高度。
- 如果当前高度h比当前位置的初步地表高度高出20格以上,则直接使用当前位置基础流体选择器的结果作为当前位置的流体状况。
- 计算所有辅助计算位置的初步地表高度,并计算出这些位置和当前位置的最小初步地表高度s。
- 如果当前高度不低于某个辅助计算位置的初步地表高度4格以下,且辅助计算位置的初步地表高度低于维度海平面高度8格以下,则使用辅助位置初步地表高度8格以上的位置的流体状况作为当前位置的流体状况。
- 如果有多个辅助计算位置满足要求,以右图编号中最小的那个辅助计算位置作为结果。
- 计算当前位置的最终流体状态:
- 如果当前位置高度低于-54并且低于本维度的海平面高度,则流体状态为熔岩。
- 如果当前位置高度不低于-10,则流体状态为本维度的默认流体。
- 如果当前位置高度介于上述两个高度之间,则取决于熔岩噪声(Lava Noise)。熔岩噪声和方块位置不是一一对应的,而是和一个64×40×64的区域进行对应,在这个范围内熔岩噪声值都一致。如果熔岩噪声的绝对值大于0.3,则流体状态为熔岩,否则为默认流体。
- 计算当前位置的最终流体表面高度:
- 如果当前位置的侵蚀度e小于-0.225,且深度d大于0.9(默认主世界生物群系中大致位于
深暗之域的放置区间),则流体表面高度为建筑高度下限之下,即不可能在这里放置流体。 - 计算流体噪声(Fluid Level Floodedness Noise),并将结果限制在-1~1之间,在下文中写为f。
- 计算原始阈值l。如果当前位置的初始地表高度低于维度海平面高度8格以下,则为0;否则,计算最小初步地表高度s减去当前高度再加上8,将此值从0~64映射到1~0。
- 计算洪泛阈值[math]\displaystyle{ f_{limit} }[/math],即原始阈值l从1~0映射到-0.3~0.8。计算流体阈值[math]\displaystyle{ l_{limit} }[/math],即原始阈值l从1~0映射到-0.8~0.4。
- 如果流体噪声f大于洪泛阈值[math]\displaystyle{ f_{limit} }[/math],则使用当前位置基础流体选择器的流体表面高度作为当前位置的流体表面高度。
- 如果流体噪声f大于流体阈值[math]\displaystyle{ l_{limit} }[/math],则计算流体高度噪声(Fluid Level Spread Noise),简记为[math]\displaystyle{ h_f }[/math]。流体高度噪声也不与方块位置一一对应,而是和16×40×16的区域对应。以[math]\displaystyle{ 40\lfloor\frac{1}{40}h\rfloor+3\lfloor\frac{10}{3}h_f\rfloor+20 }[/math]和最小初步地表高度s的最小值作为当前位置的流体表面高度。
- 如果流体噪声f不大于这两个阈值,则流体表面高度为建筑高度下限之下,即不可能在这里放置流体。
- 如果当前位置的侵蚀度e小于-0.225,且深度d大于0.9(默认主世界生物群系中大致位于
在完成流体状况的计算后,对于每个位置,根据流体状况进行含水层的实际放置:
- 如果当前位置流体状况在当前高度的流体状态为熔岩,则放置为熔岩,且不要求后续进行方块更新。
- 将世界分割为16×12×16的区域,计算当前位置上移一格并向XZ轴分别向负方向移动5格所在的区域。以这个区域和它东、南和东南以及上下总计12个区域内,随机在每个区域内选取一个距离区域最小点9×8×9的位置,并算出距离当前位置最近的三个位置和它们与当前位置距离的平方。
- 定义相似度函数[math]\displaystyle{ \mathrm{similarity}(d_1,d_2)=1-0.04\vert d_1-d_2 \vert }[/math],其中[math]\displaystyle{ d_1,d_2 }[/math]代表两个位置与当前位置距离的平方。计算最近两个位置的相似度[math]\displaystyle{ s_1 }[/math],最近位置和第三近位置相似度[math]\displaystyle{ s_2 }[/math]和第二近位置和第三近位置相似度[math]\displaystyle{ s_3 }[/math]。
- 如果[math]\displaystyle{ s_1 }[/math]小于0,则放置为最近位置流体状况在当前高度的流体状态(有可能为空气)。如果[math]\displaystyle{ s_1 }[/math]同时大于等于-0.76,则需要后续进行方块更新。
- 如果最近的位置流体状况在当前高度的流体状态为水,且当前位置的下方的流体状态刚好为熔岩,则放置为水,并要求后续进行方块更新。
- 定义压强函数[math]\displaystyle{ \mathrm{pressure}(p_1,p_2,h,b) }[/math],其中h为当前位置高度,[math]\displaystyle{ p_1,p_2 }[/math]代表两个检查位置的流体表面高度,b是当前位置的分隔噪声(Barrier Noise),用于在含水层之间生成分隔。如果两个检查位置流体状况的流体状态不同,则压强函数返回2;如果两个检查位置的流体表面高度相同,则压强函数返回0。计算初始压强值[math]\displaystyle{ p_i=h+0.5(1-p_1-p_2) }[/math],如果初始压强值大于0,则[math]\displaystyle{ p'=0.5(p_1-p_2)-p_i }[/math],如果[math]\displaystyle{ p' }[/math]大于0,则压强值[math]\displaystyle{ p=\frac{2}{3}p' }[/math],否则[math]\displaystyle{ p=\frac{2}{5}p' }[/math];如果初始压强值不大于0,则[math]\displaystyle{ p'=0.5(p_1-p_2)+p_i+3 }[/math],如果[math]\displaystyle{ p' }[/math]大于0,则压强值[math]\displaystyle{ p=\frac{1}{3}p' }[/math],否则[math]\displaystyle{ p=\frac{1}{10}p' }[/math]。如果压强值p小于2或大于-2,最终返回的压强值为[math]\displaystyle{ 2p }[/math];如果不大于2且不小于-2,则返回的压强值为[math]\displaystyle{ 2(p+b) }[/math]。
- 如果最近的两个位置的相似度、压强值之积与当前的最终密度函数值之和大于0,则不放置任何流体和空气,而是放置维度初始方块,也不要求后续进行方块更新。
- 如果最近的两个位置的相似度、最近或第二近位置和第三近位置的相似度、压强值之积与当前的最终密度函数值之和大于0,则不放置任何流体和空气,而是放置维度初始方块,也不要求后续进行方块更新。
- 如果上列情况都不满足,放置为最近位置流体状况在当前高度的流体状态(有可能为空气),并要求后续进行方块更新。
如果含水层未被启用,那么当前位置流体状况在当前高度的流体状态就是最后放置的流体状态(有可能为空气)。
矿脉
矿脉也是在世界放置初始方块时一并放置的。它由三个密度函数控制:矿脉开关密度函数(Vein Toggle),矿脉方块密度函数(Vein Ridged)和矿脉间隔密度函数(Vein Gap)。
矿脉放置在含水层放置之后,如果含水层已经放置了空气或流体,则矿脉放置不会执行。它按照下列步骤决定一个位置是否应该成为矿脉,并决定成为矿脉的哪种部分:
- 计算矿脉开关密度函数 [math]\displaystyle{ T }[/math]。如果 [math]\displaystyle{ T }[/math] 大于0,则尝试放置铜矿脉,否则放置铁矿脉,此部分被硬编码不能修改。
- 决定放置何种矿脉后,计算此处是否可以放置矿脉。铜矿脉只能放置在0 – 50,铁矿脉只能放置在-60 – -8。如果当前高度超过了放置区间,则不会放置矿脉。
- 计算当前位置与矿脉放置区间上下限的差,并于矿脉开关密度函数再次计算是否可以放置矿脉。假设当前高度为 [math]\displaystyle{ h }[/math],矿脉最低高度为 [math]\displaystyle{ h_{\min} }[/math],最高为 [math]\displaystyle{ h_{\max} }[/math],则计算 [math]\displaystyle{ \left| T \right|+\min\left\{ 0.01\min\left\{ h_{\max}-h,~h-h_{\min} \right\} -0.2,~ 0 \right\} }[/math]。如果此值小于0.4,则矿脉也不能放置,即矿脉开关密度函数值绝对值至少为0.4时才可以放置矿脉,如果大于0.6则此条件一定满足。
- 对于铜矿脉,即为 [math]\displaystyle{ \left| T \right|+\left( -0.005 \left( \left| h-20 \right| + \left| h-30 \right| \right)+0.05 \right) }[/math];
- 对于铁矿脉,即为 [math]\displaystyle{ \left| T \right|+\left( -0.005 \left( \left| h+40 \right| + \left| h+28 \right| \right) + 0.06\right) }[/math]。
- 生成随机数,如果大于0.7就不放置矿脉方块,即随机清除30%的矿脉方块。
- 计算矿脉方块密度函数 [math]\displaystyle{ R }[/math]。如果密度函数值小于0则继续判断放置,否则不放置矿脉方块。
- 计算矿脉间隔密度函数 [math]\displaystyle{ G }[/math]。如果密度函数值不大于-0.3,则放置矿脉填充方块(铜矿脉为花岗岩,铁矿脉为凝灰岩)。
- 生成随机数,如果随机数大于等于 [math]\displaystyle{ \min \left\{ \left| T \right| -0.3,~0.3 \right\} }[/math],则放置矿脉填充方块;否则,再有2%的概率生成为粗金属块,剩余的98%生成为矿石。即矿脉中有至少70%的方块都是矿脉填充方块,最多有0.6%的方块是粗金属块。
如果一个维度没有启用矿脉,则不会进行上述矿脉放置流程,此时最终密度大于0的所有区域都会被填充为维度初始方块。
主世界初始地形
主世界启用含水层和矿脉,海平面高度为63,默认方块为石头,默认流体为水,并使用地形样条和噪声洞穴对地形进行更精细化地放置。
地形样条
地形样条主要用于计算初步地表高度,并决定之后的初始地形的高度,同时也控制了最终密度函数的计算。
地形样条只与三个密度函数相关:大陆性密度函数c、侵蚀度密度函数e、奇异性密度函数w,并且地形样条也与奇异性计算而来的山脊性pv有关。这些密度函数和上文中生物群系的密度函数相同,换言之,地形和生物群系之间有一种很复杂的联系。
地形样条不止一种,一共分为三种:地形偏移样条(Terrain Offset)、地形因子样条(Terrain Factor)和粗糙度样条(Jaggedness)。地形偏移样条本质上控制了深度密度函数,深度密度函数在Y=128的水平切片就是地形偏移样条的值;地形因子样条在垂直方向上拉伸地形;粗糙度样条是在高度上进行偏移,但会与粗糙度噪声一起计算,影响最终密度值。原始密度密度只由地形偏移样条和地形因子样条计算而来,而不计算粗糙度样条,这也是这个密度函数英文名中“without Jaggedness”的含义。
对地形样条影响最大的参数是大陆性c。在大陆性较小,即对应等级为海洋、深海或蘑菇岛时,大陆性会更显著地影响样条计算值:在海洋区间时,地形高度会稍微低于海平面;在深海区间时,地形高度会比海洋更低一些;但在蘑菇岛区间时,地形上升并超过海平面,以保证蘑菇岛不会被水淹没。
侵蚀度e会影响陆地地形的平坦程度。侵蚀度越大,地形就越趋近于平坦,高度也会随之降低;相反,侵蚀度越小,地形越崎岖,高度也会升高。
山脊性pv影响此处是否生成河谷或山峰。山脊性越高,就会生成山峰,地形高度会变得很高;如果山脊性较低,等级为河流时,那么就会生成河谷,地形高度略微低于海平面。奇异性w本身也会影响地形的生成,在高侵蚀度时较高的奇异性会使得地形更加破碎。在极端的情况下,如果奇异性远远超出-1~1的范围,使得山脊性远小于-1,那么对应位置就会产生非常低的地形高度,从而使含水层在内部放置水,甚至在极低的位置生成熔岩,产生一个极深的深水大坑。
噪声洞穴
在主世界生成初始地形时,最终密度函数会将地下的某些区域设置为空气或流体,形成噪声洞穴和在噪声洞穴内的含水层。
噪声洞穴共包含下面四个“组件”:
- 芝士洞穴(Cheeze Cave):原始的噪声图像不经过绝对值处理,在噪声值较小的位置生成洞穴,在噪声值较大的地方生成初始方块。这种洞穴的形状类似于芝士内部的圆洞,在地下形成大小不一的气泡形空洞。
- 意面洞穴(Spaghetti Cave):原始的噪声图形经过绝对值处理,原始噪声值靠近0的位置生成洞穴,远离0的位置生成初始方块。这种洞穴长而蜿蜒,在地下形成一条空气通路。
- 面条洞穴(Noodle Cave):原始的噪声图形经过绝对值处理,原始噪声值靠近0的位置生成洞穴,远离0的位置生成初始方块。生成类似于意面洞穴,但宽度很窄。部分位置的密度值被固定为64,从而使这些位置无法生成面条洞穴。
- 噪声柱(Noise Pillar):噪声柱密度函数由噪声柱频率噪声和噪声柱粗细度噪声相乘计算而来,形成一条一条的垂直柱状图像。
在实际执行放置时,最终密度计算步骤如下:
- 计算地形高度密度函数(
sloped_cheese)。这个密度函数的计算与深度密度函数、粗糙度样条和地形因子样条有关,用于计算真正的地表高度。以1.5625为分界线,密度值小于此值为“地表”,大于此值为“地下”。 - 对于地表,只需要计算噪声洞穴入口密度函数(
caves/entrances),使得洞穴可以和地表相连。 - 对于地下,计算噪声洞穴入口、芝士洞穴和面条洞穴密度函数的最小值,用于将这些洞穴连接起来,形成洞穴网络。其中芝士洞穴会受到地形高度密度函数的影响,在更高的位置生成的概率更小。在这一步再次计算噪声洞穴入口是为了能与地表部分的洞穴入口连接,防止在地表和地下分界线时洞穴被切断。再计算噪声柱密度函数,与前三种密度函数的最小值一同计算最大值,使得洞穴中出现由初始方块组成的噪声柱。
- 对于上面所有步骤的计算值,如果高度大于240,则密度函数值会被逐渐固定,到256时固定为-0.078125以防止过高的地形出现;如果高度低于-40,密度函数值也会逐渐固定,直到-64时固定为0.1171875,以减少深层洞穴的生成,并阻止洞穴穿透基岩层。
- 最后,计算面条洞穴密度函数,并与上面密度函数值取最小值,得到最终的密度函数。面条洞穴不会计算深层地下的密度升高,使得深层地下更容易生成面条洞穴,而不是芝士洞穴和意面洞穴。
主世界最终密度函数的详细细节可以在教程页面找到。
下界初始地形
下界禁用含水层和矿脉,海平面高度为32,默认方块为下界岩,默认流体为熔岩。由于没有启用含水层,下界高度低于32的空洞位置都被熔岩填充。
下界使用一个涂抹噪声密度函数作为最终密度函数,它的图像呈现区域性的块状,像被水平涂抹的画布。和主世界类似,为了阻止生成的地形超出上层基岩和下层基岩,在两个基岩层附近密度函数值也被固定到特定值:从高度Y=104到Y=128,密度函数值逐渐趋近于0.9375(不计算挤压函数);从高度Y=24到高度Y=-8,密度函数值逐渐趋近于2.5(不计算挤压函数)。由于下界的地形高度最高只有128,超出的部分即使密度函数大于0也不会放置任何方块。
末地初始地形
末地禁用含水层和矿脉,海平面高度为32,默认方块为末地石,默认流体为空气,即不放置流体。
与下界类似,末地也使用涂抹噪声密度函数,但此值会与末地侵蚀度密度函数相加,从而侵蚀消除很大范围的初始地形,并使得末地主岛和外岛之间空无一物。为保证末地地形不会太低或太高,密度函数值在高度较高和较低时也被固定到特定值:从高度Y=56到Y=312,密度函数值会逐渐固定到-23.4375(不计算挤压函数);从高度Y=32到Y=4,密度函数值逐渐固定到-0.234375(不计算挤压函数)。由于在Y=4时密度函数值就已经小于0,所以末地的最低初始方块高度不会低于4;同时,末地的地形也不会很高,因为在Y=56以上密度函数值下降速度很快,所以高处很难生成初始方块。
应用表面规则
在生成初始地形后,游戏会使用一系列规则替换原先的初始方块,这种替换规则被称为表面规则(Surface Rule)。表面规则造就了各个生物群系不同的外观,将地表替换为各个生物群系应有的地表,如替换为草方块或沙子。虽然名称为表面规则,但实际上它也负责了基岩层和深板岩层的放置。
原理
对于世界的每个位置,在进行表面规则计算时都会创建一个表面规则上下文,上下文内包含了下列数据:
- 生物群系(Biome):当前位置的生物群系。
- 表面噪声(Surface Noise):用于控制多种方块放置的通用噪声,同时也影响表面厚度。
- 表面厚度(Surface Depth):影响放置表面方块时,应该向上或下延伸多少距离。它由表面噪声s和一个位置相关的随机数r(取值范围为[math]\displaystyle{ [0,1) }[/math])计算而来,计算公式为[math]\displaystyle{ \lfloor 2.75s+0.25r+3 \rfloor }[/math]。
- 表面厚度附加噪声(Surface Secondary Noise):对于一些表面的放置,除了要计算表面厚度外,还需要对原始的表面厚度继续偏移,得到修正后的表面厚度。
- 液体高度(Water Height):在本方块上方距离最近的液体表面上方一格的高度,如果本方块上方与液体之间有空气则为32位有符号整数最小值。但在雕刻器使用表面规则时,这个值是上方距离最近的液体的高度,而非液体表面。
- 地板深度(Stone Depth Above):本方块距离上方最近空气之间的非液体方块数量,如果方块上方刚好为空气则为0。
- 天花板深度(Stone Depth Below):本方块距离下方最近空气或液体的之间的方块数量,如果方块下方刚好为空气或流体则为0。
- 最低表面高度(Min Surface Level):根据本方块水平位置,计算附近4个区块最小点的初步地形高度,插值后于表面厚度相加并减去8,得到最低表面高度。如果一个位置的高度不低于最低表面高度,那么它就判定为地表,否则判定为地下。
在应用表面规则时,游戏会从区块的最小点依次扫描Z轴位置,直到区块的最大点。对于每个水平位置,计算最高方块高度(高度图WORLD_SURFACE_WG),并对最高方块上方的位置应用风蚀恶地规则,此规则被硬编码且无法禁用,并只在风蚀恶地生物群系内生效。风蚀恶地规则需要计算恶地表面噪声(badlandsSurfaceNoise)和恶地岩柱噪声(badlandsPillarNoise)是否都大于0,否则此处不会生成岩柱。再计算恶地岩柱高度噪声(badlandsPillarRoofNoise),确定岩柱高度并将岩柱范围内的空气放置为初始方块,如果岩柱范围内有水则不进行放置。再放置岩柱后,再次计算最高方块高度,并对这个水平位置内的所有初始方块从上到下应用表面规则。在这个水平位置内所有方块都应用表面规则后,如果最高方块位置所处生物群系为冻洋或冰冻深海,则应用冻洋规则,此规则也被硬编码且无法禁用。冻洋规则会计算冰山表面噪声(icebergSurfaceNoise)和冰柱噪声(icebergPillarNoise)是否大于1.8,如果不是则不会生成冰山。计算冰山高度噪声(icebergPillarRoofNoise),并根据生物群系温度“融化”一部分方块,创建出上方为雪块,主体为浮冰,内部包含少量水的冰山地形特征。
表面规则本身是一个判断序列,如果有一个条件被先行满足,那么这个位置就会放置对应的方块,而不计算后续的规则。如果所有规则都不匹配,那么方块就不会改变,保留原先的初始方块。为简单描述,表面规则中的条件将被简述为下方几种:
- 高于y/低于y/高度y/高度b~t:当前位置高度满足对应高度需求时,条件判断成功。高于低于都包括高度相等的情况。
- 高度梯度b→t:当前位置高度低于或位于b时,条件判断成功;当前位置高于或位于t时,条件判断失败。两个高度中间过渡的高度根据当前高度距离b的远近计算条件成功概率,越低概率越大。
- 地表:当前位置高度高于或位于最低表面高度时条件判断成功。
- 生物群系:只有当前位置位于指定生物群系时才能判断成功。
- 噪声n:计算特定噪声值在Y=0切片的噪声值,并根据噪声值判断条件是否成功。
- 寒冷/温暖:当前位置的生物群系温度足以下雪时为寒冷,否则为温暖。
- 盆地:当前位置表面厚度小于0时,条件判断成功。
- 陡坡:如果一个位置东侧高度比西侧高度高4格及以上,或北侧高度比南侧高度高4格及以上,则此处判断为陡坡。在这里的高度指的是高度图
WORLD_SURFACE_WG。如果计算时两侧有一侧的方块超出了本区块,则以自身方块高度计算。 - 水面以下n格/不在水下:检查当前位置的液体高度与当前高度之上最近的地板(即当前高度之上最远的非空气或流体的方块)的高度。
- 地板:当前位置上方刚好为空气或与空气之间只存在流体时条件成功。如果指定为n格地板则判断地板深度。
- 天花板:当前位置下方刚好为空气或流体时条件成功。如果指定为n格地板则判断天花板深度。
- 最高表层高度/最低表层高度:最高表层高度为当前位置高度与表层厚度之和,最低表层高度为当前位置高度与表层厚度之差。
- 最近地表高度:距离当前高度上方最近的空气方块的高度减1。
在上方多个条件中都有可能受到表面厚度和表层厚度附加噪声影响,未特殊说明时代表不受影响,标记为“*”则受到表层厚度影响。
主世界表面规则
下表为主世界表面规则,更详细的信息可以在教程页面查看。
| 表面规则条件 | 替换方块 | ||||
|---|---|---|---|---|---|
| 高度梯度-64→-59 | |||||
| 地表 | 地板 | 高于97* | 表面噪声 -0.909~-0.5454 -0.1818~0.1818 0.5454~0.909 |
||
| 不在水下 | |||||
| 其他 | |||||
| 高度62 | 沼泽表面噪声不小于0 | ||||
| 高度60~62 | 沼泽表面噪声不小于0 | ||||
| 地板 | 高于256 | ||||
| 高于74* | 表面噪声 -0.909~-0.5454 -0.1818~0.1818 0.5454~0.909 |
||||
| 其他 | 陶瓦条带 | ||||
| 不在水下 | 天花板 | ||||
| 其他 | |||||
| 盆地 | |||||
| 最低水面以下5格* | |||||
| 其他 | 天花板 | ||||
| 其他 | |||||
| 最低表层高度不低于63 | 高度不低于63且最高表层高度低于74 | ||||
| 其他 | 陶瓦条带 | ||||
| 地板深度小于表层厚度 | 最低水面以下5格* | ||||
| 地板且不在水下[注 1] | 盆地 | 不在水下 | |||
| 寒冷 | |||||
| 其他 | |||||
| 陡坡 | |||||
| 浮冰噪声0~0.2 | |||||
| 冰噪声0~0.025 | |||||
| 不在水下 | |||||
| 陡坡 | |||||
| 细雪噪声0.35~0.6 | 不在水下 | ||||
| 不在水下 | |||||
| 陡坡 | |||||
| 不在水下 | |||||
| 细雪噪声0.35~0.6 | 不在水下 | ||||
| 不在水下 | |||||
| 方解石噪声-0.0125~0.0125 | |||||
| 其他 | |||||
| 沙砾噪声-0.5~0.05 | 天花板 | ||||
| 其他 | |||||
| 其他 | |||||
| 表面噪声大于4⁄33 | |||||
| 天花板 | |||||
| 其他 | |||||
| 天花板 | |||||
| 其他 | |||||
| 硫黄洞穴梯度3D噪声-0.4~-0.1 | |||||
| 硫黄洞穴梯度3D噪声0~0.4 | |||||
| 硫黄洞穴梯度3D噪声0.4~1.7976931348623157E308 | |||||
| 其他 | |||||
| 表面噪声不小于7⁄33 | |||||
| 表面噪声不小于-2⁄33 | |||||
| 表面噪声不小于8⁄33 | 天花板 | ||||
| 其他 | |||||
| 表面噪声不小于4⁄33 | |||||
| 表面噪声不小于-4⁄33 | 不在水下 | ||||
| 其他 | |||||
| 其他 | 天花板 | ||||
| 其他 | |||||
| 表面噪声不小于7⁄33 | |||||
| 表面噪声不小于-19⁄165 | |||||
| 不在水下 | |||||
| 不在水下 | |||||
| 其他 | |||||
| 最低水面以下5格* 且为地板 |
盆地 | ||||
| 最低水面以下5格* 且地板深度小于表层厚度 |
陡坡 | ||||
| 浮冰噪声-0.5~0.2 | |||||
| 冰噪声-0.0625~0.025 | |||||
| 不在水下 | |||||
| 陡坡 | |||||
| 细雪噪声0.45~0.58 | 不在水下 | ||||
| 不在水下 | |||||
| 细雪噪声0.45~0.58 | 不在水下 | ||||
| 其他 | |||||
| 方解石噪声-0.0125~0.0125 | |||||
| 其他 | |||||
| 沙砾噪声-0.5~0.05 | 天花板 | ||||
| 其他 | |||||
| 其他 | |||||
| 表面噪声大于4⁄33 | |||||
| 天花板 | |||||
| 其他 | |||||
| 天花板 | |||||
| 其他 | |||||
| 硫黄洞穴梯度3D噪声-0.4~-0.1 | |||||
| 硫黄洞穴梯度3D噪声0~0.4 | |||||
| 硫黄洞穴梯度3D噪声0.4~1.7976931348623157E308 | |||||
| 其他 | |||||
| 表面噪声不小于7⁄33 | |||||
| 表面噪声不小于8⁄33 | 天花板 | ||||
| 其他 | |||||
| 表面噪声不小于4⁄33 | |||||
| 表面噪声不小于-4⁄33 | |||||
| 其他 | 天花板 | ||||
| 其他 | |||||
| 其他 | |||||
| 地板深度小于表层厚度与附加噪声(最大为6)之和 | |||||
| 地板深度小于表层厚度与附加噪声(最大为30)之和 | |||||
| 地板 | |||||
| 天花板 | |||||
| 其他 | |||||
| 其他 | 天花板 | ||||
| 其他 | |||||
| 高度梯度0→8 | |||||
- ↑ 仅在应用表面规则阶段判断不在水下,雕刻器阶段调用表面规则时无论上方是否有水都将成功。
下界表面规则
| 表面规则条件 | 替换方块 | ||||
|---|---|---|---|---|---|
| 高度梯度0→5 | |||||
| 高度梯度122→127,取反 | |||||
| 高于122 | |||||
| 天花板深度小于表层厚度 | |||||
| 地板深度小于表层厚度 | 斑块噪声大于-0.012 | 最近地表高度30~34 | |||
| 下界方块状态噪声大于0 | |||||
| 其他 | |||||
| 天花板深度小于表层厚度 | 下界方块状态噪声大于0 | ||||
| 其他 | |||||
| 地板深度小于表层厚度 | 斑块噪声大于-0.012 | 最近地表高度30~34 | |||
| 下界方块状态噪声大于0 | |||||
| 其他 | |||||
| 地板 | 不高于32 | 盆地 | |||
| 下界岩噪声大于0.54 | 高于31 | 下界疣噪声大于1.17 | |||
| 其他 | |||||
| 下界岩噪声大于0.54 | 高于31 | 下界疣噪声大于1.17 | |||
| 其他 | |||||
| 地板深度小于表层厚度 | 灵魂沙层噪声大于-0.012 | 非盆地 | 最近地表高度30~34 | ||
| 其他 | |||||
| 地板 | 最近地表高度30~34 | 沙砾层噪声大于-0.012 | 高于32 | ||
| 非盆地 | |||||
| 其他 | |||||
末地表面规则
末地表面规则只有一项:将所有初始方块替换为末地石。
地形雕刻
地形雕刻在应用表面规则后执行,用于细化地形,并添加更多洞穴。
原理
在进行地形雕刻时,游戏会以当前的区块为中心,在周围17×17区块的范围内进行检查。如果某个区块是其中某个雕刻器的起始区块(Start Chunk),那么就使用对应的雕刻器从起始区块开始对本区块进行雕刻。起始区块的判定是随机的,概率可以被配置。由于游戏只会对周围17×17区块的范围检查,所以一个雕刻器一次生成能影响的区块范围也就最大也只有17×17区块。
根据雕刻行为的不同,雕刻器分为两大种:
- 洞穴雕刻器(Cave Carver):洞穴雕刻器包含两种组件,即环状内庭和洞穴隧道。洞穴雕刻器最多运行15次基本循环,基本循环内有25%的概率生成环状内庭,因此一次洞穴雕刻最多能产生15个环状内庭。如果一次基本循环内没有生成环状内庭,则只会生成一条洞穴隧道;否则,会生成1到4条洞穴隧道。洞穴隧道本身也可以自身分叉,如果洞穴隧道足够宽,则可以再创建出两条新的洞穴隧道,从而形成复杂的洞穴网络。
- 峡谷雕刻器(Canyon Carver):峡谷雕刻器会生成一条巨大的“裂缝”,形成多个椭球体雕刻地形,并在一些高度上留下平台。
在雕刻器计算出它们要雕刻的范围后,游戏会将这些信息存入雕刻标记(Caving Mask)中。对于每个被雕刻的位置,需要进行以下步骤完成雕刻:
- 检查此处是否已被雕刻(即此处具有雕刻标记)。如果是,则不再进行第二次雕刻。
- 检查此处是否可以被替换,替换规则可以被配置。如果不能被替换,则也不能进行雕刻。
- 计算雕刻后的状态:
- 如果此处高度低于雕刻器的熔岩高度,则雕刻后放置熔岩。
- 使用含水层函数,以最终密度函数为0计算此处应该放置熔岩、水还是空气。如果含水层函数返回不放置含水层或空气(即对应放置初始方块),则不进行雕刻。
- 检查此处雕刻前的方块是否为草方块或菌丝体,且放置后下方方块是否为泥土。如果是,则调用表面规则,重新计算下方泥土应该替换为什么。雕刻器使用的表面规则上下文时,地板深度和天花板深度都为1,液体高度为此处的高度,这造成了应用表面规则和雕刻器时两方的判断液体高度行为不一致。
主世界雕刻器
主世界使用三个雕刻器:
- 洞穴雕刻器,起始区块概率15%,放置位置在Y=-56到Y=180之间,替换带有
#overworld_carver_replaceables标签的方块。 - 洞穴雕刻器,起始区块概率7%,放置位置在Y=-56到Y=47之间,替换带有
#overworld_carver_replaceables标签的方块。 - 峡谷雕刻器,起始区块概率1%,放置位置在Y=10到Y=67之间,替换带有
#overworld_carver_replaceables标签的方块。
下界雕刻器
下界只使用一个雕刻器:洞穴雕刻器,起始区块概率20%,放置位置Y=0到Y=126之间,替换带有#nether_carver_replaceables标签的方块。
生成结构范围
你可以帮助我们加入更多信息。
说明:缺失基岩版信息
结构范围生成是区块生成的第一个步骤,以确认结构会生成在哪些区块内,以保证地物阶段阶段放置结构时可以正确放置。
原理
结构在生成时可能不是单独的一种结构,而是在多个结构中挑选出要生成的结构,而这个结构集合就被称为结构集(Structure Set)。
结构放置以结构集为单位。对于一个维度内可以放置的所有结构集,都有它们的放置分布。结构集有两种放置分布:
- 随机扩散放置:随机扩散放置有两个重要参数,分别为最小间隔(Seperation)和分块大小(Spacing)。游戏先以分块大小将水平坐标划分为一个个分块,每个分块内最多只能有一个结构生成点。之后剔除东和南方最小间隔圈的区块,在最后剩下的区块内才可以生成结构。分块和间隔使得结构生成点永远不会在某些坐标区间生成。以分块大小27,最小间隔为4举例,令当前区块的X坐标和Z坐标对分块大小27分别取余得到x和z,如果x或z大于等于分块大小与最小间隔之差23,那么这个区块永远都不可能作为结构生成点区块。
- 同心圆环放置:同心圆环放置有三个重要参数,分别为圆环距离乘数(Distance),下文写为d、生成总数量(Count)和扩散度(Spread),下文写为s。游戏先将世界以同心圆环分块,圆环宽度为[math]\displaystyle{ 2.5d }[/math]个区块,圆环之间间隔[math]\displaystyle{ 3.5d }[/math]个区块,第一个圆环与世界原点间隔[math]\displaystyle{ 2.75d }[/math]区块。每个圆环都有生成结构数量上限,第一圈数量上限[math]\displaystyle{ c_1=s }[/math],之后的第n圈数量上限[math]\displaystyle{ c_n=c_{n-1}+\left\lfloor\frac{2c_{n-1}}{n}\right\rfloor }[/math],最外圈数量上限为生成总数量减去所有内圈生成数量。对于每一个圆环,挑选一个随机的起始角度,并按照起始角度和数量上限将结构生成点均匀地放置在这个圆环上(即两个相邻结构的相差角度一致,与世界原点的距离可以随机,但需要在圆环内)。如果结构集有偏好生成群系(Preferred Biomes),则尝试将结构平移。
决定放置位置后,根据频率(Frequency)减少部分放置位置以防止生成过密。如果结构集有剔除区域(Exclusion Zone),还需要计算它与最近的指定结构的距离,以防止两个结构过近。
在区块在生成结构范围阶段时,区块会计算这个维度内可能生成的所有结构集,并计算本区块是否是结构集的生成区块。如果是某一个结构集的生成区块,则随机挑选结构集中的一个结构,计算本区块内它可以放置的位置(满足生物群系要求、满足高度要求),如果找不到对应位置则挑选下一个结构,直到所有结构都不满足时此处就不会生成结构。如果结构集内至少有一个可以放置的结构,则创建选中结构的结构起始点(Structure Start),并计算出结构内的所有结构片段(Structure Piece),之后通过结构片段计算出结构包围盒(Structure Bounding Box),以供之后的生成使用。
在区块在计算结构引用阶段时,每个区块都以自身为中心,在17×17区块范围内收集所有生成结构,并计算这些结构的包围盒是否与本区块相交。如果相交,则将对应区块的位置存储起来,以用于后续的生成,并通过这种方式阻止复制多份数据造成存档体积增加。由于区块计算结构引用时只会检查周围17×17区块,使得结构本身水平方向跨度不能超过17个区块,结构生成点和最远结构片段不能超出8个区块,否则就会被截断。
主世界可放置结构
下方中给出了主世界中所有可能生成的结构集和包含的结构和权重,并给出了它们的分布。结构要求的生物群系未标出,可以在各个结构条目找到它们要求的生物群系。如果结构集内包含永远不可能在此维度放置的结构,则以删除线标记。
下列结构集使用随机扩散放置:
| 结构集 | 分块大小 | 最小间隔 | 频率 | 额外限制条件 | 结构 | 权重 |
|---|---|---|---|---|---|---|
| ancient_cities | 24 | 8 | 100% | 无 | 1 | |
| buried_treasures | 1 | 0 | 1% | 无 | 1 | |
| desert_pyramids | 32 | 8 | 100% | 无 | 1 | |
| igloos | 32 | 8 | 100% | 无 | 1 | |
| jungle_temples | 32 | 8 | 100% | 无 | 1 | |
| mineshafts | 1 | 0 | 0.4% | 无 | 1 | |
| 1 | ||||||
| ocean_monuments | 32 | 5 | 100% | 无 | 1 | |
| ocean_ruins | 20 | 8 | 100% | 无 | 1 | |
| 1 | ||||||
| pillager_outposts | 32 | 8 | 20% | 与结构集villages必须间隔10个区块及以上 | 1 | |
| ruined_portals | 40 | 15 | 100% | 无 | 1 | |
| 1 | ||||||
| 1 | ||||||
| 1 | ||||||
| 1 | ||||||
| 1 | ||||||
| shipwrecks | 24 | 4 | 100% | 无 | 1 | |
| 1 | ||||||
| swamp_huts | 32 | 8 | 100% | 无 | 1 | |
| trial_chambers | 34 | 12 | 100% | 无 | 1 | |
| trail_ruins | 34 | 8 | 100% | 无 | 1 | |
| villages | 34 | 8 | 100% | 无 | 1 | |
| 1 | ||||||
| 1 | ||||||
| 1 | ||||||
| 1 | ||||||
| woodland_mansions | 80 | 20 | 100% | 无 | 1 |
下列结构集使用同心圆环放置:
| 结构集 | 圆环距离乘数 | 生成总数量 | 扩散度 | 偏好生成群系 | 额外限制条件 | 结构 | 权重 |
|---|---|---|---|---|---|---|---|
| strongholds | 32 | 128 | 3 | #minecraft:stronghold_biased_to |
无 | 1 |
下界可放置结构
下界的结构都使用随机扩散放置。
| 结构集 | 分块大小 | 最小间隔 | 频率 | 额外限制条件 | 结构 | 权重 |
|---|---|---|---|---|---|---|
| nether_complexes | 27 | 4 | 100% | 无 | 2 | |
| 3 | ||||||
| nether_fossils | 2 | 1 | 100% | 无 | 1 | |
| ruined_portals | 40 | 15 | 100% | 无 | ||
| 1 |
末地可放置结构
末地的结构都使用随机扩散放置。
| 结构集 | 分块大小 | 最小间隔 | 频率 | 额外限制条件 | 结构 | 权重 |
|---|---|---|---|---|---|---|
| end_cities | 20 | 11 | 100% | 无 | 1 |
地物与结构放置
你可以帮助我们加入更多信息。
说明:缺失基岩版信息
当区块生成放置地物阶段时,游戏会将之前计算的结构片段和当前计算的地物一同放置到区块之内。这是区块生成中方块最后可能修改的阶段,再后面的转换为世界区块时才可能发生其他方块修改。
生成顺序与阶段
为尽量避免各种地物和结构片段放置时产生冲突,生成地物阶段也被细分为11个阶段:
- 原始生成(Raw Generation):生成原始的地形地物,用于接下来的其他地物放置。这个阶段放置的只有末地浮岛。
- 湖(Lakes):放置湖类型的地物。目前只会放置熔岩湖,放置水湖的功能已经被含水层替代,所以目前不存在水湖。
- 本地修改(Local Modifications):修改部分地貌(包括冰山、生苔的巨石、大型滴水石锥、玄武岩柱)和放置紫晶洞。
- 地下结构(Underground Structures):生成在地下的结构和地物(化石、刷怪房)。
- 地表结构(Surface Structures):生成在地表的结构和地物(沙漠水井、三角洲、末地折跃门、蓝冰、冰刺)。
- 要塞(Strongholds):没有作用的一个阶段,要塞不在这个阶段放置。
- 地下矿物(Underground Ores):生成地下的各种矿石和圆盘。
- 地下装饰(Underground Decoration):生成地下的非矿石团簇,下界的矿石团簇也在这个阶段放置。除团簇外还会放置其他地下的地物,包括幽匿斑块。
- 涌泉(Fluid Springs):生成各种涌泉。
- 植被装饰(Vegetal Decoration):生成所有植被类地物,如树木、竹子、随机斑块等。
- 顶层修改(Top Layer Modification):在所有其他地物生成之后对区块的顶层进行修改。这个阶段只会放置冰冻顶层。
下表中列出了各个结构的生成阶段:
| 阶段 | 结构 |
|---|---|
| 地下结构 Underground Structures |
|
| 地表结构 Surface Structures |
|
| 地下装饰 Underground Decoration |
|
在同一个生成地物阶段中,结构片段放置永远比地物放置优先。同一个阶段内的结构片段和地物放置顺序由定义顺序决定。
结构片段放置
当区块进行到一个生成地物阶段时,游戏会检查这个区块有没有和这个生成地物阶段的某个结构内的结构片段相交,并筛选出这些片段进行放置。
在结构片段放置时,游戏只能在这个区块内放置方块,也就是只允许修改当前区块。如果结构片段的一部分不在此区块,则被截断,剩下的部分由其他区块进行放置。
结构片段本身会保留数据,在未生成或没有生成完毕时这些信息可以保证结构片段后续能正确放置。
地物放置
地物类似于结构片段放置,但它可以放置的范围与结构片段不同。以当前正在生成地物的区块为中心,周围3×3范围的区块都是这个区块内所有地物可以修改的范围,使得地物可以跨区块生成。
地物的跨区块生成使得区块生成的效果不稳定:即使使用相同的种子,在同一个位置生成的方块有可能不同!假设具有两个区块A与B,且地物a生成于A区块,地物b生成于B区块,两个地物生成点相近,且都跨越AB区块生成。假定地物a生成的方块不能作为地物b的生成点,反之亦然,那么区块AB对于地物ab的生成情况可能有两种:
- 如果区块A先进入生成地物阶段,生成地物a。区块B后进入生成地物阶段,在尝试生成地物b时检查到当前生成点不可以生成地物b,于是不放置地物b。此时生成情况为:只生成地物a。
- 如果区块B先进入生成地物阶段,生成地物b。区块A后进入生成地物阶段,在尝试生成地物a时检查到当前生成点不可以生成地物a,于是不放置地物a。此时生成情况为:只生成地物b。
- 更极端的情况下,区块AB可能同时生成地物,因为世界生成器使用背景并发线程池进行生成。此时地物ab可能会同时生成,但互相放置的方块会因为执行顺序不同而混杂在一起。
在前两种情况中,玩家的位置可以影响区块生成顺序,即玩家本身的行走路径就可以改变地物的放置。在后一种情况下,玩家是无法控制这些地物的生成的,因为无法控制它们真正的执行顺序。
光照
在生成地物完毕后,世界生成器就不会再修改方块,此时就可以计算光照,点亮区块。
光照分为两个阶段:
- 初始化光照阶段:不进行光照的传播计算,而是先将区块内的光源添加到光照引擎中,为接下来的光照传播进行准备。此阶段主要是防止跨区块光源传播错误,在区块边缘形成截断的光照。
- 计算初始光照:使用上一个阶段的光源信息,计算光照传播,将天空光和方块光填充到区块内。由于光照等级最高为15,所以光照无法跨过两个区块影响本区块,而计算光照阶段时周围的区块至少达到初始化光照阶段,所以光照可以保证正确。
生成初始实体
在光照结束后,区块就可以生成初始实体,这些实体都属于动物类别。
游戏会计算出这个区块最小点的最高方块高度,以它为生成点生成动物。检查这个生成点的生物群系,如果在雪原和冰刺之地中则只有7%的概率可以生成动物,其他的生物群系中概率为10%。根据生成点的生物群系,游戏会随机挑选一个在动物类别内的生物作为本区块的初始实体,如果动物类别内不存在生物则不进行生成。计算这个生物需要最多生成多少个,并迭代执行生成。每次生成最多进行4次生成游走(如果超出区块范围则生成游走直到回到区块内,且每次生成游走完毕后都自动设置高度为最高方块位置),如果这4次内无法找到可以生成的位置,则这一次不会生成。生成的生物仍然要遵照基本的生成规律,检查自身是否会被方块碰撞,如果会碰撞则不会生成。
生成初始实体不会计算生物上限,即使当前世界的动物上限已经达到或超过,在区块进行生成时这些生物仍然会被生成。
有部分实体在世界生成时也一并生成,但它们并不是生成初始实体阶段生成的,而是跟随结构片段一同放置。
参考
导航
| 世界预设 | |||||||
|---|---|---|---|---|---|---|---|
| 世界类型 | |||||||
| 世界 | |||||||
| 维度 | |||||||
| 天空 | |||||||
| 天气 | |||||||
| 地理 | |||||||
| 人造结构 | |||||||
| 物质 | |||||||
| 声音 | |||||||
| 异常 | |||||||
| 已移除 |
| ||||||
| 基本概念 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 数据包 |
| ||||||||||||
| 资源包 | |||||||||||||
| 相关条目 | |||||||||||||
| 官方工具 | |||||||||||||
| 相关教程 | |||||||||||||
| 参考实例 |
| ||||||||||||

沪公网安备 31011002002714 号