2012-06-12 26 views
5

我使用佩林噪聲的2D世界發電機(如何在Terraria)。我發現了一個適合我的實現。我需要產生世界的一部分,但這種認識只能在全世界產生。如何修改佩林噪聲[見線程中的示例]

實現 - http://sirisian.com/javascriptgame/tests/valuenoise2.html 我把它改寫到AS3,稍微修改(+主代碼) - http://codepad.org/crMEQ2DD

請幫忙修改代碼,這樣,就可能產生噪聲部分:

PerlinNoise.randomize(65735); 
... 
var noises:Vector.<Number> = PerlinNoise.getNoise(0, 0, 100, 100, 6, 6, 1.0, 20); 
... 
var noises:Vector.<Number> = PerlinNoise.getNoise(100 /*<--x offset*/, 0, 100, 100, 6, 6, 1.0, 20); 

我嘗試了幾個選項,但不同的噪音部分沒有停靠。

如果你有Perlin噪聲的實現,這適用於世界發電機,你可以給我。

謝謝!

+0

嗨,我看到這是一個古老的問題..我可以幫助,但我不知道我完全理解這個問題。 Actionscript3中存在perlin噪聲:新的BitmapData(寬度,高度).perlinNoise(..) – zehelvion

回答

2

Flash已經包含Perlin噪聲的實現,通過BitmapData.perlinNoise()方法。如果需要將噪聲作爲數字向量(與可呈現的位圖相對)來獲取噪聲,則可以使用BitmapData.getVector()方法,該方法將所有像素作爲32位整數的向量返回,其中四個字節表示alpha ,紅色,綠色和藍色通道。

我已經在一個項目中採用了這種非常模式,以獲得巨大成功。以下是我編寫和使用的功能。

public static function initNoiseVector(output : Vector.<Number>, baseX : Number, numOctaves : Number, scale : Number, blur : uint = 0) : void 
{ 
    var i : uint; 
    var len : uint; 
    var sum : uint; 
    var avg : uint; 
    var perlin : BitmapData; 
    var noise : Vector.<uint>; 

    len = output.length; 

    perlin = new BitmapData(len, 1); 
    perlin.perlinNoise(baseX, 1, numOctaves, 0, true, false, 7, true); 

    if (blur > 0) 
     perlin.applyFilter(perlin, perlin.rect, new Point(), new BlurFilter(blur, 1, 3)); 

    noise = perlin.getVector(perlin.rect); 

    // Calculate average 
    sum = 0; 
    for (i=0; i<len; i++) { 
     // Mask out blue channel 
     sum += noise[i]&0xff; 
    } 
    avg = sum/len; 

    for (i=0; i<len; i++) { 
     var speed : Number; 

     // Convert perlin noise color to value between -1 and 1 
     speed = ((noise[i]&0xff) - avg)/avg; 
     output[i] = speed * scale; 
    } 
} 

該函數基本上只是創建1px的高位圖(寬度定義爲矢量的長度),在該位圖發起灰度Perlin雜,可選地應用模糊,然後縮放值根據比例函數的參數。

通過首先計算平均值(僅使用藍色通道,因爲噪聲爲灰度,所有通道都相同),完成縮放。然後將值在-1和1之間進行歸一化,其中平均值爲0,並由提供的比例因子縮放。

功能然後可以在下面的方式使用,檢索1000個值:

_noise = new Vector.<Number>(1000, true); 
PerlinNoiseUtil.initNoiseVector(_noise, 300, 10, randomDev * periodTime, 10); 

希望這有助於!