2012-11-27 123 views
0

我一直在努力学习有关产生噪声的问题,并发现我理解了它的大部分,但是我对脚本有点麻烦。JavaScript噪声函数问题

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

这绝对是在创造一些东西,但是它一直塞到左边。此外,刷新页面似乎一遍又一遍地创建相同的模式。

  1. 我做错了什么,图像的“嘈杂”部分是在左边?我怎样才能让它看起来更像是多云的珀林噪音?
  2. 我真的不明白为什么它每次都不会产生新的模式。每次脚本运行时,为了接收一个随机模式,我需要更改哪些内容?

谢谢你的帮忙!

/* 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

我没有看到代码中的哪个位置正在改变算法的输入,例如随机数。你的算法是确定性的 - 也就是说,在给定相同的输入的情况下,它们总会给出一致的结果。不知道你的噪音的“smushy”部分。 – Matt

+1

同意马特。在哪里定义了持久性和八度音。如果它总是相同的,那么它总是会返回相同的结果。 – nycynik

回答

2

我已经分叉的小提琴和固定的几件事情要使其工作:http://jsfiddle.net/KkDVr/2/

的主要问题是有缺陷的伪随机数生成的“噪音”,总是为x的足够大的值返回1和y。我已经与查询与整数坐标随机值表替代它:

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

希望有所帮助,再见!