从单纯形噪声或其他算法中获得锯齿状结果同样快
本文关键字:锯齿状 结果 噪声 单纯形 其他 算法 | 更新日期: 2023-09-27 18:16:12
我想根据游戏/技术演示的地形噪音来放置一些物体,如树木等。
我以前使用过值噪声,我相信我对柏林噪声已经足够了解了。然而,单纯形噪声很好地避开了我(目前只是略高于我的头顶)。
我有一个简单噪声的c#实现,但是,它几乎完全是从这里偷来的。它工作得很好,但我只是不太了解它,无法根据自己的目的修改它。
它相当快,但它也给出了相当平滑的结果。实际上我想要一些更锯齿状的东西,就像简单的线性插值,当我在做值噪声的时候。我在这里的问题是,由于我要为这些对象放置和使用分形布朗运动做大量的调用,算法的速度变得非常重要。
关于如何获得更多的"锯齿形"结果,如线性插值给出的值噪声使用比值噪声更快的算法是什么建议?
如果你用一个复杂的噪声函数来做一个简单的任务,比如树的位置,你使用了完全错误的数学函数类型。这是一个非常特殊的功能,非常适合制作纹理、3d形状和不规则曲线。在2d上放置贴图当然不需要不规则的曲线!除非你想把树放在不规则和弯曲的线条上!
除非你的意思是你想把树放置在一定程度的噪音区域,例如噪音大于0.98的地方,这将给你一个很好的随机区域,你可以使用它作为中心点,说明一些树将在那里。
它将更快,更容易改变,如果你只是使用任何正常的噪声函数,只需编程周围的噪声函数的放置代码。我的意思是一个可预测的伪随机噪声函数,每次使用它都是一样的。
使用整数0到10和20到30,乘以你的等级数,在同一伪随机噪声曲线上选择10个X和10个Y点。这将在你的地图上给你10个随机点,从那里做事情几乎不需要计算。
一旦你有了树的中心点,用函数中的另外10个随机点来表示那里有多少棵树,再用10个随机点来表示它们之间的距离,因为树种子周围的分布非常特殊。
另一个选择,如果你想改变曲线http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf是阅读这篇论文,看看多项式函数/任何梯度函数可以在你的代码中使用,寻找梯度函数的注释,注释掉,做X等于Y,这应该给你一个直接的插值曲线。
如果你投票给这个答案,我应该有足够的积分来评论这个论坛:]
我意识到这是一个非常古老的问题,但我觉得之前的答案是完全错误的,所以我想澄清你如何应该使用噪声函数来确定诸如树木/岩石/灌木之类的东西的位置。
基本上,如果你想在地形上全局放置物品,你将需要一些功能来告诉你这些物品可能发生在哪里。例如,你可能会说"树木需要生长在45度或更小的斜坡上,并且海拔低于2000米"。这给了你一张可能有树的地方的地图。但是现在你需要为它们选择随机的,但聚集的位置。
最好的方法是将0和1的映射乘以分形函数(即单纯形噪声函数或通过细分和位移生成的函数-参见https://fractal-landscapes.co.uk/maths)。
然后给出一个概率密度函数,其中某一点的值表示在该位置放置树的相对概率。现在存储该函数在地图上每个位置的部分和。放置一个新树:
- 选择0到求和函数最大值之间的任意数。
- 在地图上查找此范围内的位置。
- 把树放在那里。
- 冲洗并重复。
这允许您将对象放置在它们所属的位置,根据它们的自然范围等等。