百科问答小站 logo
百科问答小站 font logo



Minecraft 的地形生成算法是什么? 第1页

  

user avatar   zhao-yan-bing-97 网友的相关建议: 
      

我来试着简要说一下地形生成吧。其实我一段时间也没怎么关心过地形生成,但是最近我在翻译一个开发文档的时候,那个开发文档提到了一些关于Minecraft地形生成的细节,所以我就被迫了解了一些关于Minecraft地形生成的知识。目前这里只介绍主世界正常情况下的生成,下界和末界或者超平坦什么的再说(可能我会回来填坑呢)。

由于本回答所有内容都是本人照着反编译后的Minecraft源代码手动总结而成,所以难免会有疏漏,欢迎指出。同时,未经本人允许,禁止转载本答案。

这里依照的Minecraft源代码是不包括Forge、Bukkit等任何模组或插件魔改过的纯原版1.10.2服务端代码。当然因为Mojang的代码水平着实不敢恭维,所以说这里我尽可能隐去令人迷惑的代码细节。

Minecraft的地形生成分为两个阶段:GenerationPopulation(这两个词我也不知道怎么翻译合适,就不翻译了)。我们先从Generation阶段开始。

Generation阶段主要用于生成基本地形、以及一些大型的建筑等,Generation阶段生成的单位是一个长宽为16,高为256的单个区块,区块也可以说是Minecraft中比方块更大一级的组织单位了。

一、获取生物群系

Minecraft会首先获取当前区块下所有的生物群系。对于生物群系的获取,Minecraft代码是使用一种类似于Decorator模式的方式提供生物群系的信息的。换句话说,它就像流水线一样,每个环节都对当前生物群系进行一次处理。这条流水线大概是这样子:

加入河流←平整化←放大化←放大化←添加海岸←放大化←添加更多岛屿←放大化←生成向日葵草原←生成山地生物群系←生成边缘生物群系←放大化←放大化←生成更丰富的生物群系←生成深海←生成蘑菇岛←添加更多岛屿←放大化←放大化←生成稀有生物群系←生成高山←生成沙漠←添加更多岛屿←生成高山森林←去除过多的深海←添加更多岛屿←添加更多岛屿←添加更多岛屿←放大化←添加更多岛屿←有锯齿地放大化←在海洋上生成最基本的平原岛←_←

附一:更丰富的生物群系指沼泽、热带草原、针叶林等不是很常见也不是很罕见的生物群系,及丛林、平顶山、红木森林等较为罕见的生物群系

附二:边缘生物群系指丛林边缘、高山+(Extreme Hills+)等只出现在生物群系边缘的生物群系

附三:山地生物群系是热带高原、沙漠山丘等依照其附近的生物群系而对应的山地版本的生物群系

附四:稀有生物群系是依照其附近的生物群系而对应的稀有版本的生物群系,大部分后面带有一个字母M,也有一些如冰刺之地等生物群系不带有字母M,但它们毫无疑问是稀有的

Minecraft在寻找一个区块内的生物群系时,就会按照上面的箭头的顺序从最基本的海洋到丰富的生物群系。当然,生物群系和高度无关。

二、生成密度图与基础地形

三维密度图的生成算法基本上基于柏林噪声:

Perlin noise - Wikipedia

生成的密度图同时会根据刚刚生成的生物群系按照权重决定高度的放大倍数,进而决定高度。

在生成密度图后,Minecraft会把该区块上的对应的密度图中密度大于零的地方都替换成石头,剩余的部分如果在海平面(默认为63)以下那么就会生成水,否则生成空气。目前这个世界上除了空气是只有水和石头的。

三、覆盖生物群系特有方块

每个生物群系都有对应的特有方块覆盖于表面。Minecraft会根据不同的生物群系选择使用不同的方块(如平原为草方块加石头,沙漠为沙子加沙石等)覆盖于地形表面,同时在高度为0-5处生成基岩。

四、生成特殊地形

这里的特殊地形指的是影响很多区块的大地形,其生成顺序为:

洞穴→峡谷→矿井→村庄→要塞→沙漠神殿→丛林神庙→沼泽小屋→雪屋→海底遗迹→_→

当然,如果这些特殊地形试图生成时发现区块还未加载,那么会忽略未加载的区块的地形生成,换句话说,如果一个洞穴占据五十个区块,那么它会进行五十次生成,每次用于一个区块。

五、生成初步亮度图

根据地形生成太阳光对应的亮度图,一些特殊位置会因为透明方块(如水等)产生影响。

到此整个Generation阶段已经完成了,也就是说,整个Minecraft世界中的地形已经基本确定了。下面我们来看Population阶段。

Population阶段主要用于生成一些点缀,如森林中的树、沙漠中的仙人掌等。和Generation阶段不同,Population阶段的作用范围在长宽各为32的四个区块。因为一些树可能过大,超出了一个区块的范围,所以把范围控制在四个区块是有利的。

一、添加实体和方块实体

实体大多指Minecraft中的生物,而方块实体(又称TileEntity)是指Minecraft中的一些带有容器等具有复杂逻辑的方块(如熔炉、箱子等,工作台不是,因为工作台只是一个右键打开用于合成的GUI的方块)。为了保证该区块启用前正常运行,刚刚生成的实体和方块实体应加入世界。

二、生成水池、岩浆池和地牢

Minecraft会随机在世界上生成水池和岩浆池,默认情况下,生成岩浆池的概率是生成水池的十分之一不到。在这一时期,Minecraft同时还会在世界上生成地牢,每个地牢中都有一个刷怪笼。

三、生成矿物

现在到了生成矿物的阶段,Minecraft会在世界中按高度决定矿物的生成量和生成位置,如默认情况下,钻石矿每区块只在高度为0-16的地方生成一次,同时大小通常在八个方块左右。当然,有一些“矿物”并不是矿物方块,不过它们也在这时生成。在这一阶段生成的方块有:泥土、沙砾、花岗岩、闪长岩、安山岩、煤矿、铁矿、金矿、红石矿、钻石矿、青金石矿。注意绿宝石矿不是这一时期生成的。

四、生成地面点缀

这部分的地面点缀往往有一些生物群系的特色,不过很多点缀是多生物群系通用的。这一阶段生成的方块包括:水边的沙子、水边的粘土、水边的沙砾、地面上的树、地面上的大蘑菇、地面上的花、地面上高出的草、沙漠中的枯木、沼泽中的浮萍、世界中的红棕蘑菇、水边的甘蔗、地面上的南瓜、沙漠中的仙人掌、水或者岩浆组成的涌泉。

五、生成生物群系特有点缀

这部分的点缀往往是一些生物群系特有的生成,该阶段生成的结构有:沙漠水井、化石、绿宝石矿、丛林西瓜、高度为二的草丛和花朵、冰刺、生苔的巨石。

六、生物生成

在世界上生成基础的生物生成,如牛羊鸡猪等。

七、冰雪覆盖

在寒冷的生物群系的适当表面覆盖一层雪,或者把第一层水面替换成冰。

至此,整个Population阶段也已完成。生成的区块便会显示在世界上。

当然随着Minecraft 1.11及后续版本的到来,一些新的世界生成也会出现,不过对于Minecraft的基本地形生成,这些内容在不同的Minecraft版本间也差不多。




  

相关话题

  这个求最值的问题有啥妙解嘛? 
  为什么各个位数之和是3的倍数的数能被三整除?其他的数为什么不行? 
  有哪些分析的恒等式有很深刻的数学背景? 
  如何看待《华裔教授发现二次方程「极简」解法:丢掉公式,全球教科书可能都要改了》? 
  点集拓扑为什么要这样定义?具有几何意义吗? 
  家人们,帮我看看这个极限? 
  如何通俗地讲解「仿射变换」这个概念? 
  研究数学花钱多吗? 
  关乎1+1等于2,我们的科学是否建立在正确的立场? 
  数系从有理数扩充为实数的跨越有无产生一些问题? 

前一个讨论
原子和细胞两者哪一个被大自然设计得更精巧?
下一个讨论
信息学竞赛算是边缘竞赛吗?





© 2024-05-15 - tinynew.org. All Rights Reserved.
© 2024-05-15 - tinynew.org. 保留所有权利