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);
希望這有助於!
嗨,我看到這是一個古老的問題..我可以幫助,但我不知道我完全理解這個問題。 Actionscript3中存在perlin噪聲:新的BitmapData(寬度,高度).perlinNoise(..) – zehelvion