在介绍地形生成前,我觉得有必要介绍一下minecraft中和地形相关的基本概念
坐标
坐标以数字方式表示玩家在Minecraft 世界中的位置。它们基于网格,其中三条线或轴在原点处相交。玩家最初在原点的几百块内出生。
从而形成右手坐标系(thumb≡x,index≡y,middle≡z)
MineCase的源码中有BlockWorldPos,BlockChunkPos和ChunkWorldPos等表示坐标类(MineCase\src\MineCase.Core\Position.cs),分别表示Block在World中的坐标,Block在Chunk中的坐标和Chunk在World中的坐标。
minecraft数据基本存储结构
Minecraft的地图是由一个一个block组成,16x16x16个block组成一个section,16个section垂直排列组成一个chunk,chunk的大小是16x16x256。已经生成的chunk数据存储在文件中,未生成的不会被存储。
MineCase中由ChunkColumnStorage和ChunkColumnCompactStorage来存储Chunk的数据(MineCase\src\MineCase.Core\World\ChunkColumnStorage.cs)。
它们都实现了IChunkColumnStorage接口,但前者是未压缩的数据,后者是压缩过的数据,在地形生成的过程中用的是前者,因为要修改大量方块,前者的访问速度会更快,在Chunk生成后使用的是后者,传输的时候就不需要再次压缩,节约时间。
block数据
每个block数据主要包括block id和meta数据,当然在传输过程中还会有skylight和blocklight数据。
blockid用来区分区分不同种类的方块,metavalue用来区分每类方块具体数值,例如燃烧着的熔炉和普通熔炉。例如方块的朝向。
在MineCase源码中,BlockState表示方块的种类(MineCase.Core\Block\BlockState.cs),
BlockStates用于创建方块种类(MineCase.Core\Block\BlockStates.cs),
Block用于描述不同种类Block的不同行为(MineCase.Core\Block\Block.cs)。
chunk数据
每个chunk的数据包含了16x16x256的block,它也是地图传输与存储的基本单位。用户登入服务器后,服务器会将user所在点周围chunk传给客户端。
生成阶段 地形的生成主要分为两个阶段,generate和populate。 generate主要进行基本地形生成,生物群落特有方块覆盖,以及基础的skylight计算。 populate主要负责建筑生成,植物生成,动物生成等地形附加结构。例如矿道,神庙,湖泊等。
generate阶段