首页 文章

线性插值如何在经典的Perlin噪声中工作?

提问于
浏览
2

昨天我将经典的Perlin噪音(src:http://mrl.nyu.edu/~perlin/doc/oscar.html#noise)移植到JavaScript . 奇怪的是,产生的噪音与我的预期有很大的不同 . 经典的Perlin噪音使用线性插值/ lerp,但噪音是平滑而不是边缘 . 它看起来更像余弦插值 . 看来Perlin以不同的方式使用lerp函数 .

这是 original code 移植到JavaScript(带画布图片):http://jsfiddle.net/fDTbv/

这是有趣的部分:

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);

你和v总是改变 . 为什么?不应该是u和v代表sx之前和之后的点,因此不会改变?

changed the code 到"what I expected"看起来如何:http://jsfiddle.net/8Xv8G/

而有趣的部分:

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函数的方式如此不同?

1 回答

  • 3

    Here你可以从原始的Perlin 's talk that explains the whole 2D noise computation process very clearly. The perlin' s噪声函数中找到一个Java小程序是连续的,因为在每个点(1D),它是两个"smoothed"线性梯度的线性插值 . "smoothing"来自s_curve函数,它只是hermite函数,实际上是余弦插值的近似值 . 但是,我会留给您的applet和演示文稿的其余部分以获得更好的解释 .

    也许你也可以找到this project of mine有趣:它是一个javascript应用程序,在html5画布上呈现Perlin和Simplex 2D噪音 . 查看源代码以获取这些和其他噪声函数的完整JavaScript实现 .

    希望有所帮助,再见!

相关问题