了解3D Perlin噪声

时间:2019-06-10 02:39:33

标签: c++ unreal-engine4 perlin-noise

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

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

我对3D Perlin Noise进行了一些研究,但我真的不了解它是如何工作的。 3D Perlin噪点功能会获取元素位置的X,Y和Z位置,并输出一个值。但是这个值有什么用呢? 2D Perlin Noise将值分配给了三维,那么3D功能是否将其分配给了第四维?该值实际上如何应用于地形?

我对编程领域还是一个新手,任何建议或知识都将不胜感激。

1 个答案:

答案 0 :(得分:0)

3D perlin噪声中的值本身并不意味着任何东西。就像2D perlin噪声值不会“做任何事情”一样,您仅选择将其解释为高度值。

在地下使用3D Perlin噪声的一种方法可能是,超过某个阈值的任何值(例如0.8)都将被视为“空”。

这是在体素系统(伪代码)中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);
}

使用这样的东西的一个缺点是表面会有许多“坑”和洞穴。您可以更改threshold,使其在yPerlin接近flatPerlin时变得更高,从而通常仅在您破坏表面后才能发现表面的孔洞数量减少和凹陷。

仅使用Perlin噪声生成洞穴会产生一个问题,即您会得到孤立的洞穴,而且它们常常彼此分离。另一种选择是使用perlin worms生成一个洞穴网络。