minecraft吧 关注:2,542,577贴子:31,797,604

minecraft地形生成过程解析

取消只看楼主收藏回复

通过mcp代码了解minecraft地形生成


IP属地:江苏来自iPhone客户端1楼2017-09-18 10:01回复

    由于最近在参与minecraft分布式服务端minecase的编写,接触到了一部分minecraft地形生成有关的一部分机制。源码面前,了无秘密。虽说minecraft的地形是mc最最有趣,富于变化的部分,但是在理清楚源码的基础上,mc地形的生成过程还是比较容易理解的。接下来,我会从源码入手,解析mc的地形生成过。另外,平时事情比较多,更新可能比较缓慢。见谅。


    IP属地:江苏来自iPhone客户端2楼2017-09-18 10:02
    收起回复
      另外前排推荐一下我正在参与的minecraft分布式服务器,采用.net core编写,使用Orleans框架,如果大家感兴趣,欢迎大家参与或者给我们star


      IP属地:江苏来自iPhone客户端4楼2017-09-18 10:17
      收起回复
        Concept 基本概念
        地形生成的代码主要在net/Minecraft/world文件夹下,地形的生成主要分为两个阶段,generate和populate。generate主要进行基本地形生成,生物群落特有方块覆盖,以及skylight计算。populate主要负责建筑生成,植物生成,动物生成等地形附加结构。


        IP属地:江苏来自iPhone客户端9楼2017-09-18 10:40
        回复
          minecraft数据基本存储结构
          minecraft的地图数据存储的基本元素称为block,16x16x16个block组成一个section,16个section垂直排列组成一个chunk,chunk也就是我们常说的区块,区块的大小是16x16x256。chunk数据以nbt格式存储在文件中(nbt以后有空讲)


          IP属地:江苏来自iPhone客户端12楼2017-09-18 11:17
          收起回复
            block数据
            每个block数据主要包括block id和meta数据,当然在传输过程中还会有skylight数据。
            blockid用来区分区分不同种类的方块,metavalue用来区分每一大类方块具体数值,例如燃烧着的熔炉和普通熔炉。例如方块的朝向。


            IP属地:江苏来自iPhone客户端14楼2017-09-18 11:25
            回复
              chunk数据
              每个chunk的数据包含了16x16x256的block,它也是地图传输与存储的基本单位。用户登入服务器后,服务器会将user所在点周围chunk传给客户端。


              IP属地:江苏来自iPhone客户端16楼2017-09-18 11:41
              回复
                minecraft坐标系统
                对于minecraft中坐标,玩家们应该都很熟悉,xyz中y轴是高度,x,z轴与地面水平。
                接下来我来介绍一下mc中几个常用的坐标
                1.Entity在世界中的坐标,共三个分量,xyz,类型float
                2.Block在世界中的坐标,共三个分量,xyz,类型int
                3.Block在chunk中的坐标,三个分量,xyz,类型int
                4.Chunk在世界中坐标,共两个分量,xz,类型int


                IP属地:江苏来自iPhone客户端19楼2017-09-18 12:51
                回复
                  坐标转换
                  Block世界坐标转chunk内坐标


                  IP属地:江苏来自iPhone客户端21楼2017-09-18 13:20
                  回复
                    Block世界坐标转chunk坐标


                    IP属地:江苏来自iPhone客户端23楼2017-09-18 14:03
                    收起回复
                      Chunk坐标转block在世界中坐标


                      IP属地:江苏来自iPhone客户端26楼2017-09-18 19:01
                      回复
                        Entity在世界中坐标转block在世界中坐标


                        IP属地:江苏来自iPhone客户端27楼2017-09-18 19:02
                        回复
                          以上的图片只是大概用代码描述了各个不同坐标间的关系(非mc源码)


                          IP属地:江苏来自iPhone客户端28楼2017-09-18 19:03
                          回复
                            ChunkGenerator 地形生成器
                            mc的地形生成器内主要有两个方法,一个是generate,一个是populate,分别对应着生成过程中的两个阶段,在IChunkGenerator中可以很清楚得看到


                            IP属地:江苏来自iPhone客户端29楼2017-09-18 19:25
                            回复
                              所有的ChunkGenerator都会实现此接口


                              IP属地:江苏来自iPhone客户端30楼2017-09-18 19:46
                              收起回复