If you're seeing this message, it means we're having trouble loading external resources on our website.

Bağlandığınız bilgisayar bir web filtresi kullanıyorsa, *.kastatic.org ve *.kasandbox.org adreslerinin engellerini kaldırmayı unutmayın.

Ana içerik

Perlin gürültüsü

İyi bir rastgele sayı üreteci, birbiriyle ilişkis olmayan ve fark edilir bir örüntü göstermeyen sayılar üretir. Görmeye başladığımız gibi, organik, canlı gibi davranışları programlarken, biraz rastgelelik iyi bir şey olabilir. Ancak, rastgeleliğin yön veren tek ilke olması, her zaman doğallık sağlamaz. Mucidi Ken Perlin'in adını alan bir algoritma olan “Perlin gürültüsü” bu kavramı dikkate alır. Perlin 1980'lerin başlarında orijinal Tron filmi üzerinde çalışırken bu gürültü fonksiyonunu geliştirdi; bilgisayar tarafından oluşturulan etkiler için yordamsal dokular yaratmak üzere tasarlanmıştı. 1997'de Perlin çalışmalarıyla teknik başarı alanında Akademi Ödülü kazandı. Perlin gürültüsü, bulutlar, manzaralar gibi doğal özellikli çeşitli etkiler, ve mermer gibi desenli dokular oluşturmak için kullanılabilir.
Perlin gürültüsünün görüntüsü daha organiktir çünkü sözde rastgele sayılardan oluşan doğal sıralı (“düz”) bir dizi üretir. Aşağıdaki grafik, Perlin gürültüsünün zamana göre değişimini verir, burada x-ekseni zamanı gösterir; eğrinin düzlüğüne bakın.
Kodun Niteliği Görüntüsü
Şekil I.5: Gürültü
Buna karşın, aşağıdaki grafik zamana göre saf rastgele sayıları gösterir.
Kodun Niteliği Görüntüsü
Şekil I.6: Rastgele
ProcessingJS'nin yerleşik bir Perlin gürültüsü algoritması vardır: noise() fonksiyonu. Gürültü bir, iki, veya üç boyutta hesaplandığından, noise() fonksiyonu bir, iki, veya üç argüman alır. Tek boyutlu gürültüye bakarak başlayalım.

Gürültü Detayı

Gürültü referansı gürültünün birkaç ''oktavda'' hesaplandığını belirtir. noiseDetail() fonksiyonunu çağırmak, hem oktav sayısını, hem de birbirlerine göre önemini değiştirir. Bu da gürültü fonksiyonun davranışını değiştirir.
Ken Perlin'in verdiği çevrimiçi bir ders, gürültünün nasıl çalıştığını Perlin'in kendisinden öğrenmenizi sağlıyor.
Processing JS penceremizde, rastgele bir x-konumunda bir çember çizmeyi düşünün.
var x = random(0, width);
ellipse(x, 180, 16, 16);
Artık, rastgele bir x-konumu yerine, “daha düz” bir Perlin gürültüsü x-konumu istiyoruz. Yapmanız gereken tek şeyin, random()'un yerine noise() yazmak olduğunu düşünebilirsiniz, yani
var x = noise(0, width);
ellipse(x, 180, 16, 16);
Kavramsal olarak bunu yapmak istesek de,—0 ila Perlin gürültüsüne göre en arasında bulunan bir x-değeri hesaplama—bu doğru uygulama değildir. random() fonksiyonunun argümanları, bir minimum ve bir maksimum arasında bir değer aralığı belirtirken, noise() bu şekilde çalışmaz. Bunun yerine, noise() "zamanda bir anı" belirten bir argüman geçirmemizi bekler ve hep 0 ila 1 arasında bir değer verir.  Tek boyutlu Perlin gürültüsünü, zamana göre bir doğrusal değer dizisi olarak düşünebiliriz. Örneğin, örnek girdiler ve çıktı değerleri vardır:
ZamanGürültü Değeri
00,469
0,010,478
0,020,485
0,030,490
0,040,420
Şimdi, ProcessingJS'deki gürültü değerlerinden birine erişmek için, zamanda belirli bir anı noise() fonksiyonuna geçirmemiz gerekir. Örneğin:
var n = noise(0{,}03);
Üstteki tabloya göre, noise(3) zaman eşittir 0,03'te 0,490 verir. Bunu geliştirmek için, zaman için bir değişken kullanabilir ve draw()'da sürekli bir gürültü değeri isteyebiliriz.
Üstteki kod, aynı değerin ardarda yazılmasıyla sonuçlanır. Bu böyle olur, çünkü defalarca aynı anda—3— noise() fonksiyonunun sonucunu istiyoruz. Ancak, t zaman değişkenini artırırsak, farklı bir sonuç elde ederiz.
t'yi hangi hızla artırdığımız, gürültünün düzgünlüğünü de etkiler. Zamanda büyük atlamalar yaparsak, ileriye atlarız ve değerler daha rastgele olur.
Zamana göre gürültü
Şekil 1,7
Kodu birkaç zamana göre çalıştırmayı, t'yi 0,01, 0,02, 0,05, 0,1, 0,0001 artırmayı deneyin, ve farklı sonuçlar görürsünüz.

Gürültüyü Çizme

Artık, gürültü değerini ne yapacağımızla ilgili soruyu yanıtlamaya hazırız. Değeri 0 ila 1 aralığına koyduktan sonra, bu aralığı istediğimiz aralıkla eşleştirmek bize kalır. Aralıktaki maksimum değerle çarpabiliriz, ama burada, bize gelecekteki bazı durumlarda yardımcı olacak, ProcessingJS’nin map() fonksiyonunu tanıtmak için iyi bir fırsat vardır. map() fonksiyonu beş argüman alır. Birincisi eşleştirmek istediğimiz değerdir, bu durumda n. Sonra, ona değerin geçerli aralığını (minimum ve maksimum), ardından da istediğimiz aralığı vermeliyiz.
Kodun Niteliği Görüntüsü
Şekil I.8
Bu durumda, gürültünün aralığının 0 ile 1 arasında olduğunu biliyoruz, ama biz eni 0 ile geçerli en arasında olan bir dikdörtgen çizmek istiyoruz.
Rastgele yürüyüşçümüze tam olarak aynı mantığı uygulayabilir, ve x- ve y- değerlerini Perlin gürültüsüne göre atayabiliriz.
Üstteki örneğin ek bir değişken çifti gerektirdiğine dikkat edin: tx ve ty. Bunun nedeni iki zaman değişkenini izleme ihtiyacıdır, biri Walker nesnesinin x-konumu ve diğer y-konumu için. Ancak, bu değişkenlerde garip bir şey vardır. tx neden 0'dan ve ty 10.000'den başlar? Bu sayılar rastgele de olsa, iki zaman değişkenimizi özellikle farklı değerlerle başlattık. Bunun nedeni, gürültü fonksiyonunun belirlenimci olmasıdır: her seferinde, belirli bir t zamanında aynı sonucu verir. Aynı t zamanında hem x, hem de y için gürültü değeri istenirse, x ve y hep eşit olur, yani Walker nesnesi sadece bir köşegen boyunca hareket eder. Bunun yerine, gürültü uzayının iki farklı parçasını kullanırız, x için 0'dan ve y için 10.000'den başlarız, böylece x ve y birbirinden bağımsız davranıyormuş gibi görünür.
Kodun Niteliği Görüntüsü
Şekil I.9
Aslında, burada gerçek bir zaman kavramı yoktur. Bu, gürültü fonksiyonunun nasıl çalıştığını anlamamız için faydalı bir metafordur, ama elimizdeki, aslında zaman değil, mekandır. Üstteki grafik, tek boyutlu uzayda, gürültü değerlerinin doğrusal bir dizisini gösterir, ve istediğimiz zaman, belirli bir x-konumunda bir değeri sorabiliriz. Örneklerde, çoğu zaman, t zamanı yerine, gürültü grafiğinde x-uzaklığını belirtmek için (şemada belirtildiği gibi) bir xoff değişkeni görürsünüz.
Bir sonraki görece, Walker'la gürültüyü biraz değişik bir şekilde kullanmayı deneyeceksiniz. İyi eğlenceler!

Bu "Doğal Simülasyonlar" dersi, Daniel Shiffman'ın"Kodun Doğası"'nın bir türevidir ve Creative Commons Yüklemesi-Ticari Olmayan 3,0 Dağıtıma Açık Lisansla kullanılmaktadır.

Tartışmaya katılmak ister misiniz?

Henüz gönderi yok.
İngilizce biliyor musunuz? Khan Academy'nin İngilizce sitesinde neler olduğunu görmek için buraya tıklayın.