使用3D Perlin Noise生成时如何去除浮动地形?


10

我目前正在使用3D Perlin Noise与Marching Cubes结合生成随机地形。

我的问题似乎在于缩放噪声函数以在我的地形中获得合理的高度。如果仅使用一个八度音程,则显然会插入与噪声有关的所有点,从而获得相当平滑的数据。但是,要获得悬垂/凹面/锯齿状的地形,我必须使用振幅变化的多个八度音和/或将结果值缩放到我想要的“最大”高度。

我可能会丢失一些东西,但是通过使用具有3D Perlin噪声的行进立方体,我经常得到一些浮动的地形。

关于如何纠正此问题或是否有其他噪声函数可以用来获得我所描述的结果的任何想法?我想要丘陵/山谷/山脉/湖泊/等。无需将浮动位与其他映射区分开。我相信,这与Minecraft的地形在生成时偶尔会漂浮在天空中的情况类似。

感谢您的协助,神话

Answers:


9

完全摆脱浮动地形的唯一方法可能就是测试连接性。根据您的地图大小,这可能是一个选择。您可以通过选择基准点(例如世界的最底端)来实现。然后确保所有体素为:

  1. 连接到基地。
  2. 已连接至已连接至基础的体素。

可能从已知的连接点(例如世界的底部)开始,然后对连接的体素进行广度优先遍历会很好。确保在移动时将体素标记为已连接。您可以按块进行此操作。

另外,有一些较便宜的方法可以最小化但不能完全消除浮动地形。

  • 渐变偏向:您可以使用渐变偏向实体体素的放置。在“地平面”上方后,梯度函数会急剧下降。本文讨论了使用渐变的方法,并提供了其他一些巧妙的技巧。

  • 高度图噪波:您可以生成噪声作为高度图。这将删除悬垂和洞穴,但是您可以使用附加的减噪层来模拟悬垂和洞穴。

  • 噪音更少:在地形噪音中使用较少的八度音程,并产生减法噪音以产生悬垂和凹陷。


如果地形只是从此处悬垂,则只能通过相邻的块进行连接。
罗伦·佩希特尔

@Loren:那完全没问题。只要引擎允许您按全索引寻址块,它就可以正常工作。
Phil

@LorenPechtel我确实说过您可以按块进行操作,但是当您位于块的边缘时,您需要检查相邻的块。在生成新地形并且未生成相邻块时,这可能会成为一个问题。当您遇到具有潜在浮动地形的情况时,可以生成相邻块,也可以使用噪声算法解析体素,直到找到“基岩”或与当前块的已知连接为止。
MichaelHouse

0

回答可能为时已晚,但是我现在开始使用Perlin Noise来生成体素地形生成对象,并且我找到了一种无需这些浮动块即可创建地形的方法。我认为这可能对您有帮助。因此,要创建地形,首先要生成一个高度图,而不是从该高度图读取像素。现在是最有趣的部分,我读取了该高度图上每个像素的“亮度”(实际上是灰度)值,这给了我该地图特定部分的高度,然后创建地形,我假设该高度图是我的地形是从上方观看的,因此,如果该高度图上的像素(映射到我的地形“ maxHeight”后)的灰度值为30,这意味着在我的地形的特定点上,我将仅在y轴上生成30个体素,这使我的地形没有浮动部分。如果您想要洞穴等,可以在原始对象(表面以下)上应用其他噪波来创建这些洞穴。希望这对您有用。


1
我相信这类似于我上面回答中的第二个要点吗?
MichaelHouse
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.