Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 线性插值如何在经典柏林噪声中工作?_Javascript_Noise_Perlin Noise_Linear Interpolation - Fatal编程技术网

Javascript 线性插值如何在经典柏林噪声中工作?

Javascript 线性插值如何在经典柏林噪声中工作?,javascript,noise,perlin-noise,linear-interpolation,Javascript,Noise,Perlin Noise,Linear Interpolation,昨天,我将经典的柏林噪声(src:)移植到JavaScript中。奇怪的是,产生的噪音看起来与我预期的大不相同。经典的柏林噪波使用线性插值/lerp,但噪波是平滑的,而不是边缘的。它看起来更像是余弦插值。 Perlin似乎以不同的方式使用了lerp函数 以下是移植到JavaScript的原始代码(带有画布图片): 这是有趣的部分: t = vec[0] + N; bx0 = Math.floor(t) & BM; bx1 = (bx0+1) & BM; rx0 = t - Ma

昨天,我将经典的柏林噪声(src:)移植到JavaScript中。奇怪的是,产生的噪音看起来与我预期的大不相同。经典的柏林噪波使用线性插值/lerp,但噪波是平滑的,而不是边缘的。它看起来更像是余弦插值。 Perlin似乎以不同的方式使用了lerp函数

以下是移植到JavaScript的原始代码(带有画布图片):

这是有趣的部分:

t = vec[0] + N;
bx0 = Math.floor(t) & BM;
bx1 = (bx0+1) & BM;
rx0 = t - Math.floor(t);
rx1 = rx0 - 1.;

sx = s_curve(rx0);

u = rx0 * g1[ p[ bx0 ] ];
v = rx1 * g1[ p[ bx1 ] ];

return lerp(sx, u, v);
bx0 = Math.floor(x) & BM;
bx1 = (bx0+1) & BM;

u = g1[ p[ bx0 ] ];
v = g1[ p[ bx1 ] ];

return lerp(x - Math.floor(x), u, v);
u和v总是变化的。为什么?u和v不应该代表sx之前和之后的点,因此不会改变吗

将代码更改为“我期望的”外观:

有趣的是:

t = vec[0] + N;
bx0 = Math.floor(t) & BM;
bx1 = (bx0+1) & BM;
rx0 = t - Math.floor(t);
rx1 = rx0 - 1.;

sx = s_curve(rx0);

u = rx0 * g1[ p[ bx0 ] ];
v = rx1 * g1[ p[ bx1 ] ];

return lerp(sx, u, v);
bx0 = Math.floor(x) & BM;
bx1 = (bx0+1) & BM;

u = g1[ p[ bx0 ] ];
v = g1[ p[ bx1 ] ];

return lerp(x - Math.floor(x), u, v);
我的问题: 为什么Perlin使用lerp函数的方式如此不同?

您可以从最初的Perlin谈话中找到一个Java小程序,它非常清楚地解释了整个2D噪声计算过程。柏林噪声函数是连续的,因为在每个点(1D中),它是两个“平滑”线性梯度的线性插值。“平滑”来自s_曲线函数,它只是hermite函数,实际上是余弦插值的近似值。不过,我将留给小程序和演示文稿的其余部分来进行更好的解释

也许你也会发现有趣的事情:它是一个javascript应用程序,在html5画布上呈现柏林和单纯形2D噪音。查看这些函数和其他噪波函数的完整javascript实现的源代码


希望有帮助,再见

我不明白你的问题。你有两个JS脚本,一个有效,为什么不使用那一个呢。柏林噪音应该是连续的,并且具有一致的功能规模。更多的“锯齿”噪声是通过增加更高频率噪声的额外迭代而产生的。这更像是一个理解问题,而不是一个编程问题。代码工作得很好,但我不明白,如果生成的噪声显然不是线性插值的,为什么柏林会使用类似线性插值的东西。这不是没有必要吗?