顶
地形是通过16维Perlin噪声倍频函数生成的。每个噪声生成器需要输入一个浮点值和一个插值。它是这样工作的:
Java 将1个整数向下取整到0,并挑选最接近表示值来处理溢出。
如果这个整数大于原来输入的数字,那么将这个数字减1,然后向下取整。
将原始数字与该数字相减,获得一个余数,并在插入到 [0,1] 区间内的合适区域。
它在 [−231, 231] 之前不会造成任何问题。问题是,许多倍频函数的涵盖范围比一个方块还要小,每个方块最多只能够有 171.103 个噪点。要注意的是,231≈171.103×12,550,824.053,一旦超过这个值,这个整数将永远是 231−1,因此在一个轴上每次都会生成相同的噪声值。这个是造成边境之地和边境之地的隧道地形长期不变的原因。
正数的余数通常从一个相当小的值开始,但在通常情况下比1要大得多,并以每个方块 171.103 的速度递增。负数的余数从−232开始。然后通过((6x−15)x+10)x3 五次样条曲线拟合函数进行调整。甚至在每个方块的正数那一段,调整后的值已经在 1011 附近,并且负数将总会从 −1049 附近开始!对于边境之角,就是边境之地的值相乘的结果。当插值(外推法)尝试变成与这些数字一样大时,它同样会产生巨大的输出。这个输出让所有的其它地形变矮,并将会赋予地形规则的形状,而不是通过这个噪声函数生成有效的地形。
在输入被除以 224 时并求余时,该问题被修复。无论如何,当噪点每重复 28 单位时,不会产生任何的副作用。但是它并不能防止溢出。通过移除这些指令,边境之地的地形可以被转化为当前游戏版本的地形。[11]
有几种因素使这种情况更复杂:
噪声只抽取4个样本,并往其中线性插值。这就是为什么当 12,550,824 时会被漏洞影响,它从 12,550,821 延伸了3个方块。
每个噪声生成器会随机在 [0, 256] 的一个偏移位置中添加它的输入。这通常会将世界边界移动到 12,550,824 以下,边境之地从 12,550,821 开始,一些少数的种子会在 12,550,825 开始。非常罕见的是,如果世界边界罕见的在 12,550,824 以内,那么边境之地的第一对方块看起来差不多和正常的方块一样。边境之地的南部和北部是各自独立的。在负数的那一端,边境之地通常在坐标方块 -12,550,825 开始,而正数则在 -12,550,824 开始。
实际上有2组噪声生成器,它们都互相混在一起并互相依赖对方,这相当于负责生成2组的隧道或平原。偶尔的,如果一个噪声生成器由于它使用了一个不同的偏移位置,在另一个生成边境之地前开始生成边境之地,那么将会产生不协调的边界。
当另一个倍频函数溢出时,第2组边境之地开始在 ±25,101,648 附近生成。在那里将没有任何视觉上的变化,因为原始的边境之地会让那里的一切东西缩小。