昨天我将经典的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 回答
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实现 .
希望有所帮助,再见!