地形基础类型

rtg/world/gen/terrain/ 下共 415 个 .java 文件,构成:

分组 数量 说明
根目录共享地形 23 Terrain* 且不含 TerrainBase
根目录 TerrainBase 1 所有地形类的根基类
根目录 FunctionalTerrainBase 1 带 HeightEffect 的地形基类
根目录地形修饰器 15 *Effect 文件,其中 HeightEffect.java 是抽象基类
根目录 HeightVariation 1 同样 extends HeightEffect,但文件名不以 Effect 结尾
群系包专属地形 374 与 374 个群系严格 1:1

23 + 1 + 1 + 15 + 1 + 374 = 415。

(find world/gen/terrain -name '*.java' | wc -l = 415;根目录 41 + 25 个包目录 374。)

「374 个专属地形与 374 个群系 1:1」是逐类比对得出的:把 world/gen/terrain/<pack>/ 下的类按包计数,与 群系包 各页的群系数相加, 两者相等。地形包目录没有额外的 Terrain<Pack>Base 共享类,所以计数是干净的。

根目录共享地形(23)

Terrain* 前缀,全部 extends TerrainBase 或 extends FunctionalTerrainBase:

类 对应地貌
TerrainBeach 海滩
TerrainCanyon 峡谷
TerrainDuneValley 沙丘谷地
TerrainDunes 沙丘
TerrainFlatLakes 平坦湖泊
TerrainForest 森林
TerrainGrasslandFlats 草原平地
TerrainGrasslandHills 草原丘陵
TerrainGrasslandMountains 草原山地
TerrainHighland 高地
TerrainLonelyMountain 孤山
TerrainMarsh 沼泽
TerrainMesa 方山(台地)
TerrainMountain 山地
TerrainMountainRiver 山地河流
TerrainMountainSpikes 山地尖峰
TerrainOcean 海洋
TerrainOceanCanyon 海洋峡谷
TerrainPlains 平原
TerrainPolar 极地
TerrainRollingHills 起伏丘陵
TerrainSwampMountain 沼泽山地
TerrainVolcano 火山

另有 VariableRuggednessEffect 一类,见下节。

地形修饰器(16 个 HeightEffect 子类)

*Effect 类不是地貌本身,而是对已经算出的高度做加减 / 混合的后处理单元。 基类 HeightEffect(HeightEffect.java)是抽象类,只有一个抽象方法 added(OpenSimplexNoise, CellNoise, float, float),外加一个 plus(HeightEffect) 工厂(内部类 SummedHeightEffects 把两个修饰器相加)。 16 个子类全部 extends HeightEffect:

类 作用
HeightVariation 高度变化(唯一不以 Effect 结尾的修饰器)
JitterEffect 抖动
BumpyHillsEffect 颠簸丘陵
HillsEverywhereEffect 全域丘陵
HillockEffect 小丘
BlendedHillEffect 混合丘陵
PlateauEffect 抬升为高原
RaiseEffect 抬升
SpikeEffect 尖刺
AdjustableSpikeEffect 可调尖刺
ScatteredMountainsEffect 散布山峰
MountainsWithPassesEffect 带垭口的山脉
LonelyMountainEffect 孤山
GroundEffect 地表修正
VariableRuggednessEffect 可变崎岖度控制

其中 15 个的文件名以 Effect 结尾(find terrain -maxdepth 1 -name '*Effect*.java' = 15,含 HeightEffect.java 本身),HeightVariation 是第 16 个。

核心:TerrainBase

rtg.world.gen.terrain.TerrainBase,全部地形类的根。两个常量:

常量 值 含义
minimumOceanFloor 30.01f 海床允许的最低 Y 坐标(注释:The lowest Y coord an ocean floor is allowed to be)
minimumDuneHeight 21f 沙丘高度配置项的强度因子下限

FunctionalTerrainBase extends TerrainBase,只加一个字段 protected HeightEffect height, 并把 generateNoise 实现成 riverized(height.added(simplex, cell, x, y) + base, river)—— 即「高度修饰器结果 + 地形基底高度,再做河道压平」。大部分具体地形走这条路径。

TerrainBase 另有一批 static 函数供各包复用。它为几乎每一个具体地形都提供了 同名 terrain* 静态实现(不是抽象方法,是可复用的现成算法):

  • 通用数学工具:blendedHillHeight(2 个重载)/ borderAdjusted / above / stretched / unsignedPower / hills / groundNoise(2 个重载) / getTerrainBase(2 个重载)/ riverized
  • 逐地形的 terrain* 实现(27 个):terrainBeach、terrainBryce、terrainCanyon、 terrainDuneValley、terrainDunes、terrainFlatLakes、terrainForest、 terrainGrasslandFlats、terrainGrasslandHills、terrainGrasslandMountains、 terrainHighland、terrainLonelyMountain、terrainMarsh、terrainMesa、 terrainMountainRiver、terrainMountainSpikes、terrainOcean、terrainOceanCanyon、 terrainPlains、terrainPlateau、terrainPolar(2 个重载)、 terrainRollingHills(2 个重载)、terrainSwampMountain、terrainVolcano

唯一的实例方法是 generateNoise(...)(TerrainBase.java:89)。

噪声来源

高度计算只依赖两个噪声对象,由 generateNoise 的签名传入:

参数 类型 实现
simplex rtg.util.OpenSimplexNoise RTG 自带的 OpenSimplex 实现(rtg/util/OpenSimplexNoise.java)
cell rtg.util.CellNoise 细胞噪声,用于圆盘/斑块类地貌

rtg/util/ 下另有 SimplexOctave / SimplexCellularNoise / SimplexCellularOctave / CellOctave 等多层包装,以及 SnowHeightCalculator / CliffCalculator / BoulderUtil 等专用计算器。

相关条目