了解 3D 柏林噪声

Understanding 3D Perlin Noise

本文关键字:噪声 柏林 3D 了解      更新时间:2023-10-16

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

我有一个顶点数组,用于构造二维平面。我在每个顶点上运行柏林噪声以获取随机噪声值,然后将其分配给该顶点的 Z 值。这产生了非常漂亮的地形;但它只是一架飞机。没有洞穴系统或任何类型的东西。这引起了我的兴趣。

我对3D Perlin Noise进行了一些研究,但我真的不明白它是如何工作的。3D 柏林噪声函数采用元素位置的 X、Y 和 Z 位置,并输出一个值。但是这个值有什么作用呢?2D 柏林噪声将值分配给第三维,那么 3D 函数是否将其分配给第四维?此值实际上如何应用于地形?

我对这个编程领域相当陌生,任何建议或知识将不胜感激。

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

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

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

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);
}

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

使用单纯的柏林噪音来生成洞穴的一个问题是,你会得到孤立的洞穴口袋,而且它们通常是彼此分开的。另一种方法是使用柏林蠕虫来生成洞穴网络。