JavaScript噪声函数问题

时间:2012-11-27 17:42:03

标签: javascript html5 canvas noise

我一直在努力学习如何产生噪音并发现我对其中的大部分内容都有所了解,但我对脚本有点麻烦。

我使用this page作为编写this script in JavaScript的指南,其最终目的是在画布上创建一些噪音。

它肯定会创造一些东西,但它一直隐藏在左边。此外,刷新页面似乎一遍又一遍地创建相同的模式。

  1. 我做错了左边的图像的“嘈杂”部分?我怎样才能让它看起来更像浑浊的柏林噪音?
  2. 我真的不明白为什么每次都不会产生新的模式。每次运行脚本时,为了接收随机模式,我需要更改什么?
  3. 感谢您的帮助!

    /* NOISE—Tie it all together
    */
    function perlin2d(x,y){
        var total = 0;
    
        var p = persistence;
        var n = octaves - 1;
    
        for(var i = 0; i <= n; i++) {
            var frequency = Math.pow(2, i);
            var amplitude = Math.pow(p, i);
    
            total = total + interpolatenoise(x * frequency, y * frequency) * amplitude;
        }
        return total;
    }
    

1 个答案:

答案 0 :(得分:4)

我已经分道扬琴并修了几件事来使其发挥作用:http://jsfiddle.net/KkDVr/2/

主要问题是有缺陷的伪随机生成器“噪声”,对于足够大的x和y值,它总是返回1。我用一个用整数坐标查询的随机值表替换它:

var values = [];
for(var i = 0; i < height; i++) {
    values[i] = [];
    for(var j = 0; j < width; j++) {
        values[i][j] = Math.random() * 2 - 1;
    }
}
function noise(x, y) {
    x = parseInt(Math.min(width - 1, Math.max(0, x)));
    y = parseInt(Math.min(height - 1, Math.max(0, y)));
    return values[x][y];
}

但是,您所遵循的教程中提供的实现使用了非常优化的简化算法。我建议您在http://scratchapixel.com/lessons/3d-advanced-lessons/noise-part-1获得优秀的真实世界噪音教程。

最后,也许你可能会对我的一个项目感兴趣:http://lencinhaus.github.com/canvas-noise。 它是一个javascript应用程序,在html5画布上呈现perlin噪音,并允许在视觉上调整几乎任何参数。我已将Ken Perlin的原始噪声算法实现移植到javascript中,因此这可能对您有用。您可以在此处找到源代码:https://github.com/lencinhaus/canvas-noise/tree/gh-pages

希望有所帮助,再见!