希望锯齿状结果来自单纯形噪声或其他算法同样快速

时间:2013-05-29 21:28:50

标签: c# performance perlin-noise simplex-noise

我想根据游戏/技术演示的地形噪声对树木之类的物体进行一些放置。

我之前使用过超值噪音,我相信我对Perlin的噪音非常了解。然而,单纯的噪音让我很好地逃脱了(目前只是在我头上一点点)。

我在C#中使用单纯形噪声,然而,它几乎完全被here偷走了。它工作得很漂亮,但我不能很好地理解它以便为我自己的目的进行修改。

速度非常快,但也能提供相当平滑的效果。我实际上想要一些更加锯齿状的东西,就像我在做价值噪音时简单的线性插值一样。我的问题在于,由于我要对这些对象放置进行调用并使用分形布朗运动,因此算法的速度变得非常重要。

关于如何获得更多“锯齿状”结果(如线性插值)的任何建议都会使用比值噪声更快的算法来提供值噪声?

2 个答案:

答案 0 :(得分:1)

如果您使用复杂的噪声函数来执行像树的放置这样的简单任务,那么您完全使用错误类型的数学函数。这是一个非常具体的功能,非常适合制作纹理和3d形状和不规则曲线。在2d放置treas肯定不需要不规则的曲线!除非你想把树木放在不规则和弯曲的线条上!

除非你的意思是你想在一定水平的噪音区域放置树木,例如噪音大于0.98的地方,这会给你很好的随机区域,你可以用它作为一个中心点说一些树木将在那里。

如果你只是使用任何正常的噪音功能,它会更快更容易变化,只需在噪音功能周围编程你的位置代码。我的意思是一个可预测的伪随机噪声函数,每次使用它都是一样的。

使用整数0到10和20到30,乘以你的等级数,在同一个伪随机噪声曲线上选择10 X和10 Y点。这将在你的地图上为你提供10个随机点,几乎不需要计算。

一旦你有了树的中心点,就可以使用函数中的另外10个随机点来说明那里有多少棵树,另外10个树就说它们将会有多远,因为树种周围的分布相当例外的。

另一个选项,如果你想改变曲线http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf,请阅读本文并查看多项式函数/代码中可以使用的任何梯度函数,查看渐变函数的注释,评论out和X等于Y,这应该给你一条直线插值曲线。

如果你对这个答案进行投票,我应该有足够的分数来评论这个论坛:]

答案 1 :(得分:0)

我意识到这是一个非常老的问题,但是我认为先前的答案是完全错误的,因此我想澄清一下应该如何使用噪声函数来确定树之类的物体的位置/岩石/灌木丛。

基本上,如果要跨地形全局放置项目,则需要一些函数来告诉您可能发生这些事件的位置。例如,您可能会说“树木必须在45度以下的坡度上并且在2000米以下”。这为您提供了可能的树木放置图。但是现在您需要为它们选择随机但聚集的位置。

执行此操作的最佳方法是将零和一的映射乘以分形函数(即,单纯形噪声函数或通过细分和置换生成的一个-参见https://fractal-landscapes.co.uk/maths)。

这将为您提供一个概率密度函数,其中某个点的值表示在该位置放置树的相对概率。现在,您可以为地图上的每个位置存储该函数的部分和。放置一棵新树:

  1. 选择0到求和函数的最大值之间的随机数。
  2. 进行二进制搜索以找到地图上该范围内的位置。
  3. 将树放在那里。
  4. 冲洗并重复。

这使您可以根据对象的自然范围等来放置对象所属的位置。