PerlinNoise

Perlin Noise

起因

隔壁班PPCA的小作业,感觉挺有意思,遂玩玩。室友说很无聊,全是调参,且渲染对电脑配置有一定要求,X1 carbon的不好之处在dht并发爆炸后越来越明显,且我忘了我把MC下在C盘哪里了,故选择不写,但可以学习一下。

柏林噪声

为所有整数点随机生成一个梯度,每个采样点的噪声值即为所有相邻角点的梯度向量与指向向量的点积之和

Perlin Noise

的确保证了采样点变化的连续性随机性

Naive: 平滑地形生成

1
2
3
4
BlockState getBlock(int x,int y,int z){
var surfaceY = 100 + noise.sample2d(x,z) * 20;
return (y < surfaceY) ? STONE:AIR;
}

加入随机性的方法:地形叠加 octaves

1
2
final int octaves = 4;
PerlinNoise noise = new PerlinNode(octaves);

Continentalness 大陆性

  • 负值(-1,0):生成更多的海洋,陆地面积减少,形成更多分散的岛屿。
  • 正值(0,1):生成更大的陆地块,海洋面积减少,世界看起来更像一个或几个巨大的大陆。

我们构建一个柏林噪声到Continentalness值的映射,由于在Naive中我们讨论了柏林噪声可以保证地形的平滑性,所以这里到Continentalness的映射可以采用线性映射来保序(如归一化)

Terrian Height

构建一个Continentalness到Terrian Height的映射

可以不断指定更多点的具体值,不断调参。

函数的返回值可以是一个函数!生成三个独立的噪声,上一层噪声值决定下一层中,噪声转为(函数/高度)的函数

三维噪声

比如一种思想:如果把噪声值作为“ 密度 ” 。当密度为负,设为空气,否则设为石头

我们得到了一个带有中空的,奶酪似的世界地形!


PerlinNoise
https://janezair.site/2025/07/19/PerlinNoise/
Author
Yihan Zhu
Posted on
July 19, 2025
Updated on
July 19, 2025
Licensed under