地形创造

地形创造数据包可以按方块创造一个自定义的地形。它根据每个方块的坐标来计算Perlin噪声和Worley噪声。将这两种结合,并加上一些后处理步骤,就可以创造一个包含不同生物群系(包括河流、平原、平顶山等)的完整的世界。

这个数据包没有实用价值。下面动图实际生成时间为30分钟。如果有一天你闲的没事做,可以下载数据包,放到一个void预设的超平坦里,随便传送到一个坐标,启动生成,就可以坐着看戏了。





如何使用

给一个实体或玩家添加一个map_generator的tag,就会自动在这个实体周围开始生成地形。它每tick生成20个方块,每个方块消耗1400条命令。光照更新可能带来很大的卡顿。

同样你可以在perlin:preset中修改一些参数,比如每个生物群系的基础高度,来生成你自定义的地形。


它是如何工作的
伪随机数生成器

参见perlin:random/number。这个数据包使用了线性同余生成器来生成随机数。数据包内为了使数据不超过int最大数据的限制进行了一些修改,因此该生成器只能生成0-8192之间的数字。

实际上,我一开始准备用游戏内的伪随机数生成器。但是由于bugMC-174435的存在导致loot table seed对/loot命令无效,就此作罢。


计算哈希码

参见perlin:random/xy。由三个数字计算哈希码有很多方法。Minecraft使用了乘并异或的方法。但在游戏内计算异或将消耗大量命令,因此这里使用了乘法来计算。


Perlin噪声

2D Perlin噪声的游戏内实现。和标准的算法不同的是,本算法只在12个随机向量中选择。噪声预览图见下。参见perlin:initperlin:noise


Worley噪声

2D Worley噪声的游戏内实现。用了一个简单的办法查找不同块之间的边界。噪声预览图见下。参见perlin:noise_wm这里


波浪滤镜

Worley噪声生成的边界为直线,属实没劲。因此添加了一个波浪滤镜让它看起来更加的浪。参见perlin:wave


将噪声和滤镜结合

使用Worley噪声确定生物群系,再让边界成为河流。使用平滑函数使边界更加平滑(perlin:fade)。最后把Perlin噪声叠加在上方。最终结果是,给perlin:terrain输入一个坐标,它就会返回一个高度和所对应的的生物群系。


按区块生成地形

每个区块生成一个游标,根据游标位置调用函数生成区块。参见perlin:new_map/


鸣谢