如何在球面上产生Perlin噪声?

时间:2011-07-02 04:14:05

标签: algorithm language-agnostic perlin-noise

我正在尝试使用Perlin噪音生成地形。我理解如何使用笛卡尔坐标生成它,但不能完全围绕它如何在球体上工作。我知道你可以将2D表面投影到球体上,但是这种扭曲不会破坏噪声分布吗?我可以想出用于在球体表面上产生均匀噪声的最佳想法是将球体上的点映射到3D笛卡尔坐标并使用3D噪声函数。 (基本上,要生成一个立方体的噪音并“刮掉”角落,使它成为圆形,就像它一样。)有没有更好的方法我错过了?

2 个答案:

答案 0 :(得分:6)

我认为这种方法实际上是使用3维噪声场(3D空间中的每个点都有标量噪声值),而不是2维场(2D平面上的每个点都有噪声值)。 / p>

使用2D噪声函数生成高度图时,根据噪声值偏移z值。

使用3D场时,您可以对球体表面上的点进行噪声采样,然后使用噪声值将每个点径向偏离或朝向球体中心偏移。

3D噪音越难以产生,但是你不必处理在球体周围缠绕表面的复杂情况,并且因为噪音功能是连续的,所以没有接缝。

这显然可以应用于任何形状。

答案 1 :(得分:4)

这里真正的难题是如何改变Perlin噪声基函数(称为八度音程?),它们是使用频率和幅度定义的,因此它们是在球体上而不是在n维平面上。

因此,我们需要在球体上定义一组基函数(给定方向,频率和幅度)。方向是一个点,例如零值。对于球体上的任何点,您可以测量与方向矢量的角距离。您将角距离除以频率,并计算该角度的sin。最后,按幅度进行缩放。

如果您希望基本功能在二维方面有所不同,您可以做一些有点发展的事情,但是您需要第二个方向参数来定向投影。您还需要计算两个角距离。但这可能有点矫枉过正了。如果你有一堆基函数,上面算法的圆形模式可能会完全相互模糊,所以我会首先尝试简单的解决方案。

使用这些Perlin噪声基础函数,您现在可以将球体上的Perlin噪声评估为一堆这样的总和。您是否决定对球体进行细分并评估顶点角落取决于您。那就是我要做的。

相关问题