【问题标题】:Desiring jagged results from simplex noise or another algorithm just as fast期望来自单纯形噪声或其他算法的锯齿状结果同样快
【发布时间】:2013-05-29 21:28:50
【问题描述】:

我想根据游戏/技术演示的地形来放置一些对象,例如树木等。

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

我在 C# 中实现了单纯形噪声,但是,它几乎完全是从 here 窃取的。它工作得很好,但我对它的理解还不够好,无法根据自己的目的对其进行修改。

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

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

【问题讨论】:

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


    【解决方案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 是阅读这篇论文并查看多项式函数/任何可以在你的代码中使用的梯度函数,寻找梯度函数的 cmets,注释掉并做 X 等于 Y,这应该给你一个直线插值曲线。

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

    【讨论】:

    • 我发布这个问题时的主要问题是关于以我可以专门处理每一点的方式处理噪声函数。我将我的地形分块,因此处理一个块而不必检查其他块是很重要的。相反,我使用的与您所描述的非常相似,但是是逐块地而不是逐点地使用,因此我可以通过“混合”轻松确定一个块是否有树以及它们以半梯度方式有多密集相邻块之间的这些值。
    • 这是一个一维锯齿形锯齿形伪随机函数:half rn(float xx){ half x0=floor(xx); half x1=x0+1; half v0 = frac(sin (x0*.014686)*31718.927+x0); half v1 = frac(sin (x1*.014686)*31718.927+x1); half rs=(v0*(1-frac(xx))+v1*(frac(xx))); return rs;
    • Perlin 噪声始终允许您专门处理每个点,并且树木位置不必每帧更新超过几棵树。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 2013-01-02
      • 2016-05-30
      • 2013-08-22
      • 2012-01-14
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多