首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能将二维噪声函数与合理的导数一起转换到另一个噪声函数?

是否有可能将二维噪声函数与合理的导数一起转换到另一个噪声函数?
EN

Stack Overflow用户
提问于 2020-12-12 11:22:43
回答 1查看 40关注 0票数 1

我有一个噪声函数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时完成混合。

我已经试过把噪声和导数都去掉了,但是产生的导数是无效的。

即。

代码语言:javascript
复制
Lerp(NoiseAt(x, y), OtherNoiseAt(x, y), blending_factor)

(当x&y值均小于1时,blending_factor为0,x&y值均大于2时,blending_factor为1)

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

换句话说,这一职能的主体是什么:

代码语言:javascript
复制
Blend(noise1, dx1, dy1, noise2, dx2, dy2, factor)
EN

回答 1

Stack Overflow用户

发布于 2020-12-12 11:45:24

你的混合因素也需要是可微性的。

为了了解这一点,让我们写出h = Lerp(f, g, a)的含义:

代码语言:javascript
复制
h = af + (1-a)g

这里的一切都是xy的函数,包括a本身。以使用链规则的导数为例(为了简单的表示法,我忽略了这些东西是二维的):

代码语言:javascript
复制
h' = a'f + af' - a'g + (1-a)g'

因此,要使h'无处不在,我们也需要a'的存在。但是,您并不是在所有地方都使用Lerp,而是只在转换发生的时间间隔上使用。就好像在将a传递给Lerp之前,您将它夹到了区间[0, 1]上。从您的帖子中,我了解到a看起来是这样的:

代码语言:javascript
复制
          0 if x < 1 and y < 1
a(x, y) = ? "in between"
          1 if x > 2 and y > 2

这还不够明确,所以让我们看一看一维的情况:

代码语言:javascript
复制
       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处导数为零。

例如,具有余弦形状:

代码语言:javascript
复制
       0               if x < 0
a(x) = 1 - cos(x/pi)/2 if     0 ≤ x ≤ 1
       1               if             1 < x

或使用三次样条(另请参阅“平滑步骤”):

代码语言:javascript
复制
       0         if x < 0
a(x) = 3x² - 2x³ if     0 ≤ x ≤ 1
       1         if             1 < x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65264327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档