Flash đã có triển khai thực hiện nhiễu Perlin, thông qua phương thức BitmapData.perlinNoise()
. Những gì bạn có thể làm nếu bạn cần nhận được nhiễu như một vectơ số (ngược lại với bitmap có thể hiển thị) thì sử dụng phương thức BitmapData.getVector()
trả về tất cả các pixel dưới dạng vectơ có số nguyên 32 bit, trong đó bốn byte đại diện cho alpha kênh đỏ, xanh lá cây và xanh dương tương ứng.
Tôi đã tự làm việc này trong một dự án, để thành công lớn. Dưới đây là hàm tôi đã viết và sử dụng.
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;
}
}
Chức năng này về cơ bản chỉ là tạo ra một bitmap cao 1px (chiều rộng định nghĩa là độ dài của vector), khởi màu xám Perlin tiếng ồn trong bitmap đó, tùy chọn áp dụng một mờ và sau đó quy mô các giá trị theo lập luận chức năng quy mô .
Việc chia tỷ lệ được thực hiện bằng cách tính giá trị trung bình đầu tiên (chỉ sử dụng kênh màu xanh, vì tất cả các kênh sẽ giống nhau do tiếng ồn là thang độ xám.) Các giá trị sau đó được chuẩn hóa giữa -1 và 1, bằng 0 và được chia tỷ lệ theo hệ số quy mô được cung cấp.
Chức năng này có thể được sử dụng theo cách sau đây, để lấy 1000 giá trị:
_noise = new Vector.<Number>(1000, true);
PerlinNoiseUtil.initNoiseVector(_noise, 300, 10, randomDev * periodTime, 10);
Hope this helps!
Xin chào, tôi thấy đây là một câu hỏi cũ .. Tôi có thể giúp nhưng tôi không chắc chắn tôi hiểu câu hỏi hoàn toàn. Có tiếng ồn perlin trong Actionscript3: bitmapData mới (chiều rộng, chiều cao) .perlinNoise (..) – zehelvion