了解 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 生成洞穴网络。
我最近一直在使用二维柏林噪声研究程序生成的地形。我正在使用 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 生成洞穴网络。