【问题标题】:Is is possible to transition a 2D noise function to another along with a sensible derivative?是否可以将 2D 噪声函数与合理的导数一起转换为另一个函数?
【发布时间】:2021-03-23 15:14:36
【问题描述】:

我有一个噪声函数 NoiseAt(x,y),它返回一个噪声值和两个导数 dx 和 dy。 我想将此函数转换为另一个噪声函数 OtherNoiseAt(x, y),它也返回噪声和两个导数。

这是基于此处找到的实现的单纯形噪声: https://github.com/simongeilfus/SimplexNoise/blob/master/include/Simplex.h

例如,对于大于 1 的 x 和 y 值,函数 NoiseAt 应该混合到函数 OtherNoiseAt 中,并在 x 和 y 值大于 2 时完成混合。

我已经尝试过处理噪声和导数,但生成的导数无效。

即。

Lerp(NoiseAt(x, y), OtherNoiseAt(x, y), blending_factor)

(其中当 x 和 y 值都小于 1 时 blending_factor 为 0,而当 x 和 y 值都大于 2 时 blending_factor 为 1)

是否有一种混合方法可以在整个混合过程中保持合理的衍生物?

换句话说,这个函数的主体是什么:

Blend(noise1, dx1, dy1, noise2, dx2, dy2, factor)

【问题讨论】:

    标签: function interpolation noise derivative blending


    【解决方案1】:

    您的混合因子也需要是可区分的。

    要看到这一点,让我们写出h = Lerp(f, g, a) 的含义:

    h = af + (1-a)g
    

    这里的一切都是xy的函数,包括a本身。使用链式法则求导(为了符号的简单,我忽略了这些东西是二维的事实):

    h' = a'f + af' - a'g + (1-a)g'
    

    所以h' 存在于任何地方,我们需要a' 也存在。但是,您并没有在任何地方使用Lerp,而只是在转换发生的时间间隔内使用。就好像您在将a 传递给Lerp 之前将a 限制在区间[0, 1] 上。从您的帖子中,我了解到a 看起来像这样:

              0 if x < 1 and y < 1
    a(x, y) = ? "in between"
              1 if x > 2 and y > 2
    

    这是相当不明确的,所以让我们看一个一维的情况:

           0     if x < 1
    a(x) = x - 1 if     1 ≤ x ≤ 2
           1     if             2 < x
    

    这是一个连续函数,但它在 x = 1x = 2 处不可微分,因为斜率突然变化。

    有几种替代方案在任何地方都有衍生产品。这些通常在间隔0 ≤ x ≤ 1 上定义,因此您必须在评估函数之前进行一些平移和缩放。构造这些的关键是确保在x = 0x = 1 处的导数为零。

    例如,余弦形状:

           0               if x < 0
    a(x) = 1 - cos(x/pi)/2 if     0 ≤ x ≤ 1
           1               if             1 < x
    

    或者使用三次样条(另见"smoothstep"):

           0         if x < 0
    a(x) = 3x² - 2x³ if     0 ≤ x ≤ 1
           1         if             1 < x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多