我正在尝试使用 Perlin 噪声生成地形。我了解如何使用笛卡尔坐标生成它,但不能完全理解它在球体上的工作方式。我知道您可以将 2D 曲面投影到球体上,但失真不会弄乱噪声分布吗?我能想到的在球体表面生成均匀噪声的最佳方法是将球体上的点映射到 3D 笛卡尔坐标并使用 3D 噪声函数。(基本上,产生一个噪音立方体并“刮掉”角落使其变圆,就像它一样。)我错过了更好的方法吗?
2 回答
我相信该方法实际上是使用 3 维噪声场(3D 空间中的每个点都有一个标量噪声值)而不是 2 维场(2D 平面上的每个点都有一个噪声值)。
使用 2D 噪声函数生成高度图时,您会根据噪声值偏移 z 值。
使用 3D 场时,您在球体表面上的点处对噪波进行采样,然后使用噪波值将每个点从或朝向球体中心径向偏移。
3D 噪波的产生显然更难也更慢,但您不必处理将曲面包裹在球体周围的复杂情况,而且由于噪波函数是连续的,因此没有接缝。
这显然可以应用于任何任意形状。
这里真正的难题是如何改变 Perlin 噪声基函数(称为八度音阶?),它们是使用频率和幅度定义的,以便它们在球体而不是 n 维平面上。
因此,我们需要在球体上定义一组基函数(给定方向、频率和幅度)。方向是一个具有零值的点。对于球体上的任何点,您可以测量到方向矢量的角距离。您将角距离除以频率,然后计算该角度的正弦值。最后,您按幅度进行缩放。
如果您希望基函数在二维上有所不同,您可以做一些更有趣的事情,但是您需要第二个方向参数来定向投影。您还需要计算两个角距离。不过,这可能有点矫枉过正。如果你有一堆基函数,上面算法的循环模式可能会完全相互模糊,所以我会先尝试简单的解决方案。
使用这些 Perlin 噪声基函数,您现在可以将球体上的 Perlin 噪声评估为这些噪声的总和。您是否决定对球体进行细分并评估顶点角取决于您。这就是我要做的。