我有一个噪声函数NoiseAt(x,y),它返回一个噪声值和两个导数dx和dy。我想把这个函数转换成另一个噪声函数OtherNoiseAt(x,y),它同时返回噪声和两个导数。
它是基于以下实现的单纯形噪声:https://github.com/simongeilfus/SimplexNoise/blob/master/include/Simplex.h
例如,对于x&y值大于1时,函数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)发布于 2020-12-12 11:45:24
你的混合因素也需要是可微性的。
为了了解这一点,让我们写出h = Lerp(f, g, a)的含义:
h = af + (1-a)g这里的一切都是x和y的函数,包括a本身。以使用链规则的导数为例(为了简单的表示法,我忽略了这些东西是二维的):
h' = a'f + af' - a'g + (1-a)g'因此,要使h'无处不在,我们也需要a'的存在。但是,您并不是在所有地方都使用Lerp,而是只在转换发生的时间间隔上使用。就好像在将a传递给Lerp之前,您将它夹到了区间[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 = 1和x = 2中是不可微的,因为斜率突然变化。
有几种替代品确实到处都有衍生产品。这些通常是在间隔0 ≤ x ≤ 1上定义的,因此在计算函数之前,您必须进行一些转换或缩放。在构造这些函数时,关键是确保在x = 0和x = 1处导数为零。
例如,具有余弦形状:
0 if x < 0
a(x) = 1 - cos(x/pi)/2 if 0 ≤ x ≤ 1
1 if 1 < x或使用三次样条(另请参阅“平滑步骤”):
0 if x < 0
a(x) = 3x² - 2x³ if 0 ≤ x ≤ 1
1 if 1 < xhttps://stackoverflow.com/questions/65264327
复制相似问题