0

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

我以前使用过价值噪声,我相信我对柏林噪声的理解已经足够好了。然而,单纯形噪声很好地避开了我(目前只是有点过头了)。

我在 C# 中实现了单工噪声,但是,它几乎完全是从这里偷来的。它工作得很好,但我对它的理解还不够好,无法为自己的目的进行修改。

它非常快,但它也给出了相当平滑的结果。我实际上想要一些锯齿状的东西,比如当我在做值噪声时会给出简单的线性插值。我的问题是,由于我要为这些对象放置和使用分形布朗运动进行大量调用,算法的速度变得非常重要。

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

4

2 回答 2

1

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

除非您的意思是要将树木放置在一定水平的噪声区域,例如噪声大于 0.98 的区域,这将为您提供很好的随机区域,您可以将其用作中心点,说明一些树木将在那里.

它会更快,更容易改变,如果你只使用任何普通的噪声函数,只需围绕噪声函数编写你的布局代码。我的意思是一个可预测的伪随机噪声函数,每次使用它时都是一样的。

使用整数 0 到 10 和 20 到 30,乘以您的级别数,在同一伪随机噪声曲线上选择 10 个 X 和 10 个 Y 点。这将在您的地图上为您提供 10 个随机点,几乎无需计算即可在其中进行操作。

一旦你有了树木所在的中心点,使用函数中的另外 10 个随机点来说明那里会有多少棵树,另外 10 个来说明它们之间的距离,因为树种子周围的分布非常特殊。

另一种选择,如果你想改变曲线http://webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf 是阅读这篇论文并查看多项式函数/任何梯度函数可以用于你的代码,寻找梯度函数的注释,注释掉并做 X 等于 Y,这应该给你一个直线插值曲线。

如果你投票赞成这个答案,我应该有足够的积分来评论这个论坛:]

于 2013-09-24T03:19:41.690 回答
0

我意识到这是一个非常古老的问题,但我觉得之前的答案是完全错误的,所以我想澄清一下你应该如何使用噪声函数来确定树木/岩石/灌木等事物的位置。

基本上,如果您想在地形上全局放置物品,您将需要一些函数来告诉您这些物品可能发生的位置。例如,您可能会说“树木需要位于 45 度或更小的斜坡上,并且低于 2000 米”。这为您提供了可能存在树木位置的地图。但是现在您需要为它们选择随机但聚集的位置。

最好的方法是将零和一的地图乘以分形函数(即单纯形噪声函数或通过细分和位移生成的函数 - 请参阅https://fractal-landscapes.co.uk/maths)。

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

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

这允许您根据对象的自然范围等将对象放置在它们所属的位置。

于 2020-08-20T20:54:23.723 回答