我该如何在球面上生成Perlin噪声?

30

我正在尝试使用Perlin噪声生成地形。我知道如何使用笛卡尔坐标系生成它,但是不太理解如何在球体上工作。我知道可以将二维表面投影到球体上,但是扭曲会破坏噪声分布吗?我能想到的最好的方法是将球体上的点映射到三维笛卡尔坐标并使用三维噪声函数来生成表面均匀噪声。(基本上,生成一个噪声立方体并“削减”角落以使其变圆)是否有更好的方法我没有想到?


顺便说一下,我本来想在数学领域问这个问题,但是Perlin噪声的主题似乎更适合在StackOverflow上讨论,但也许我错了。 - dlras2
这是一个非常有趣的问题,我对Perlin噪声不是很熟悉,但我有一些重要的数学背景,这将在转换中有所帮助,我会仔细研究一下。 - Zéychin
@Zéychin - 如果您想了解Perlin噪声的基础知识,我找到的最好的解释在这里:http://freespace.virgin.net/hugo.elias/models/m_perlin.htm - dlras2
需要记住的最重要的部分是,每个噪声区域都与相邻的区域相互作用,因此,畸变或不连续的多边形在噪声中会很容易被看到。 - dlras2
1
事实上,从我链接的页面上可以看到:“您还可以定义3D纹理。您可以将其视为一个坚实的材料块,您可以从中‘雕刻’出一个对象。这使您能够生成可以应用于任何形状对象而不会发生扭曲的纹理。”但是我想知道是否有更好的方法来处理球体。 - dlras2
2个回答

15

我认为正确的方法是使用三维噪声场(三维空间中每个点都有一个标量噪声值),而不是二维噪声场(二维平面上每个点都有一个噪声值)。

当使用二维噪声函数生成高度图时,您根据噪声值偏移z值。

当使用三维噪声场时,您在球体表面上的点上采样噪声,然后使用噪声值将每个点径向远离或靠近球体的中心进行偏移。

很明显,3D噪声要更难且速度较慢,但您无需处理将表面围绕球体纹理的复杂性,并且由于噪声函数是连续的,因此不存在接缝。

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


我不知道你是否有相关的示例?我试图创建一个代表电影《阿凡达》中“潘多拉漂浮岛”的游戏地形 …尽管努力,但我似乎无法解决这个问题!到目前为止,我最好的解决方案是使用噪声生成2个高度图,然后将它们基本拼接在一起(其中一个反转)…这是非常糟糕的解决方案…但仍然很想看到如何实现这一点!!! - War

4
真正的难题在于如何改变Perlin噪声基础函数(称为八度?),这些函数是使用频率和振幅定义的,使它们覆盖一个球形而不是n维平面。
因此,我们需要有一组基础函数(给定方向、频率和振幅),在球面上进行定义。方向是一个点,例如零值。对于球面上的任何点,您要测量到方向向量的角距离。将角距离除以频率,并计算该角度的sin值。最后,你按振幅缩放。
如果您希望两个维度中的基础函数变化不同,则可以做一些更加花哨的事情,但是您需要第二个方向参数来定位投影。您还需要计算两个角距离。但这可能会过度杀伤。如果您有一堆基础函数,则算法的圆形模式可能会完全模糊彼此,因此我建议先尝试简单解决方案。
使用这些Perlin噪声基础函数,您现在可以将其求和作为球上Perlin噪声的评估。无论您是否决定细分球体并评估顶点角落,都取决于您。那就是我会做的事情。

如果我理解正确的话,这将在每个多边形上产生完全不同的噪声分布,导致非常明显的边缘,而不是连续的分布。 - dlras2
为什么会这样呢?边缘上的顶点(它们是相邻多边形的成员)在两个多边形中都具有相同的随机生成强度。我是不是漏掉了什么? - Neil G
1
我觉得我对你的理解更深入了,需要考虑一下这个问题。我认为这会增加复杂性,因为多边形不是规则的。 - dlras2
@Cyclotis:你说得对,不需要细分。等一下,我正在修复我的解决方案。 - Neil G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接