2012-06-12 29 views
5

Tôi đang sử dụng Perlin Noise cho máy phát điện thế giới trong 2D (làm thế nào ở Terraria). Tôi đã tìm thấy một thực hiện phù hợp với tôi. Tôi cần phải tạo ra các phần của thế giới, nhưng việc thực hiện này chỉ có thể tạo ra một khi cả thế giới.Làm thế nào sửa đổi Perlin Noise [xem ví dụ trong chủ đề]

Thực hiện - http://sirisian.com/javascriptgame/tests/valuenoise2.html tôi viết lại nó để AS3, hơi sửa đổi (mã chính +) - http://codepad.org/crMEQ2DD

Xin giúp thay đổi mã để nó là có thể tạo ra một phần tiếng ồn:

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); 

Tôi đã thử một số tùy chọn, nhưng các phần tiếng ồn khác nhau không được cập nhật.

Và nếu bạn có triển khai Perlin Noise, phù hợp với máy phát điện thế giới, bạn có thể đưa nó cho tôi.

Cảm ơn!

+0

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

Trả lời

2

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!

Các vấn đề liên quan