地物规则/分布类型

来自Minecraft基岩版开发Wiki

游戏内预设了6种分布类型用于将地物分布在一定范围内,通过填写对应的接口字符串在地物规则或部分地物中使用它们。例如:

"x": {
  "distribution": "uniform",
  "extent": [ 0, 16 ]
}

下表列出了可用的接口字符串:

ID 字符串 描述
1 uniform 均匀分布类型,可将目标地物在指定的半开区间(左闭右开)范围内均匀地随机放置。
2 gaussian 高斯分布类型,可将目标地物以高斯分布的形式随机放置在指定半开区间(左闭右开)范围内。
3 inverse_gaussian 逆高斯分布类型,可将目标地物以逆高斯分布的形式随机放置在指定半开区间(左闭右开)范围内。
4 fixed_grid 固定网格分布类型,可将目标地物以指定步长和初始偏移量的网格形式在指定闭区间范围内均匀放置。
5 jittered_grid 抖动网格分布类型,可将目标地物以指定步长和初始偏移量的网格形式在指定闭区间范围内随机放置。
6 triangle 三角分布类型,可将目标地物以三角分布的形式在指定的区间范围内放置。

网格分布[编辑]

网格分布分为固定网格分布和抖动网格分布,它们都有两个参数来决定网格的步长和初始偏移量,分别是  step_size grid_offset 。步长的默认值为1,初始偏移量的默认值为0。

网格分布的语法结构如下:

  •  x/y/z:x/y/z轴坐标参数对象。
    • *distribution:随机分布类型
    • *extent:分布范围。
    •  step_size:网格步长。默认值为1,以方块为单位。
    •  grid_offset:网格初始偏移量。默认值为0,以方块为单位。

如果有两个及以上的坐标轴使用了网格分布,则当某一坐标轴上迭代到指定的范围边缘(最大范围)时,游戏将会跳到下一行从最小范围处继续迭代。进行迭代的坐标轴的优先级由  coordinate_eval_order 决定,默认值为xzy。也就是说,(前提三个坐标轴都使用了网格分布)默认情况下游戏会先在x轴上以指定步长进行迭代,假设迭代次数无限大,则当迭代到最大范围时,游戏将在z轴上移动指定步长,并回到x轴的最小范围处继续迭代(会计入之前已经消耗的步长,其他坐标轴也同理),以此类推;当z轴上到达最大范围处时,游戏将在y轴上移动指定步长,并回到z轴的最小范围处继续迭代,以此类推。下面给出了一个示例:

"iterations": 8,
"x": {
  "distribution": "fixed_grid",
  "extent": [ -2, 2 ],
  "step_size": 3,
  "grid_offset": 1
},
"z": {
  "distribution": "fixed_grid",
  "extent": [ -2, 2 ],
  "step_size": 1
},
"y": 0

该示例以地物原点为中心,在xz坐标平面创建了一个5×5的网格。由于x坐标轴设置了1格初始偏移,所以游戏会跳过(0,0),从(1,0)处开始第一次迭代,然后数3格,并在第3格处进行第二次迭代,也就是(4,0)。此时x轴上已经到达最大范围处了(坐标(4,0)是x轴方向上的第5格),由于没有设置坐标判断顺序,游戏将依照默认的x→z→y的优先级来进行下一步判断,所以游戏会在z轴上移动1格(因为没有设置步长所以默认为1),x轴回到最小范围处继续迭代,即在(2,1)处迭代一次。在进行下一次迭代时,游戏在x轴上数了2格但已到达最大范围,所以会在z轴上移动1格并继续把x轴上剩余的1格数完,即在(0,2)处迭代一次……以此类推,直到8次迭代完成。下面给处了更为直观的演示:

1
2
3
4
5
6
7
8
往右为x轴正方向,往下为z轴正方向。金块表示地物原点;钻石块表示每次迭代放置地物的位置,上面用数字注明了是第几次迭代;绿色羊毛表示初始偏移的量;箭头表示迭代方向。