了解 3D 柏林噪声

Understanding 3D Perlin Noise

我最近一直在使用二维柏林噪声研究程序生成的地形。我正在使用 Unreal Engine 4 个蓝图作为原型制作的方式,但很快就会转移到 C++。

我有一个构成二维平面的顶点数组。我运行 Perlin Noise 在每个顶点上得到一个随机的噪声值,然后把它赋值给那个顶点的Z值。这产生了非常漂亮的地形;但它只是一架飞机。没有洞穴系统或任何类型的东西。这激起了我的兴趣。

我研究了一些关于 3D Perlin Noise 的知识,但我真的不明白它是如何工作的。 3D Perlin Noise 函数采用元素位置的 X、Y 和 Z 位置,并输出一个值。但是这个值有什么作用呢? 2D Perlin Noise把值赋给了第三维,那么3D函数是不是把它赋给了第四维呢?这个值实际上是如何应用于地形的?

我对这个编程领域还很陌生,如果有任何建议或知识,我将不胜感激。

3D 柏林噪声中的值本身并不具有任何内在意义。正如 2D 柏林噪声值没有 "do" 任何东西一样,您只能选择将其解释为高度值。

在地下使用 3D 柏林噪声的一种方法是,任何超过某个阈值(例如 0.8)的值都将被视为 "empty"。

这是体素系统中 2d perlin + 3d perlin 随机地形的一种实现(伪代码)

bool IsVoxelEmpty(int x, int y, int z) 
{
    float flatPerlin = Get2DPerlin(x, z);
    float terrainHeight = perlinToHeight(flatPerlin)

    float thickPerlin = Get3DPerlin(x, y, z);
    float threshold = 0.8f;

    return (y > terrainHeight) || (thickPerlin > threshold);
}

使用这样的东西的一个缺点是会有许多 "craters" 和洞穴向地表开放。您可以更改 threshold,使其在 yPerlin 接近 flatPerlin 时变得更高,这样表面上的孔洞数量就会减少,通常只有在您突破表面后才能发现洞穴。

仅使用 perlin 噪声生成洞穴的一个问题是您会得到孤立的洞穴,而且它们通常彼此分开。另一种方法是使用 perlin worms 生成洞穴网络。