Rastgele yükseklikler oluşturmak için gürültü işlevlerini kullanabilirsiniz . Bunların en basiti, tam olarak tanımladığınız gibi çalışan değer gürültüsüdür: bazı rasgele tamsayı yükseklikleri oluşturur ve ardından enterpolasyon yapar aralarındaki yükseklikleri . En sık kullanılan enterpolasyon yöntemi kübik S eğrisi eşlemesidir:
Diyelim ki h0
noktadaki x0
yükseklik h1
ve noktadaki yükseklik x1
. Sonra herhangi bir noktada yükseklik elde etmek için x
( x0<=x<=x1
),
t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;
Bu şekilde elde edilen yükseklikler düzgün, rastgele fakat gerçekten ilginç olmayacak. Arazinizi daha iyi hale getirmek için fraktal gürültüyü kullanabilirsiniz . Şunun gibi çalışır: h(x)
belirli bir koordinatta yükseklik döndüren bir işlev oluşturduğunuzu varsayalım (yukarıdaki yöntemi kullanarak). Bu fonksiyon orijinal interger yüksekliklerinin frekansıyla belirlenen bir frekansa sahiptir. Bir fraktal çıkarmak için, işlevleri birkaç frekansla birleştirirsiniz:
fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);
Bu örnekte, dört frekansı birleştiririm - orijinal, çift, 4 ve 8 kez orijinal, daha yüksek ağırlıklarla daha az ağırlık verilir. Teorik olarak, fraktallar sonsuza kadar gider, ancak pratikte sadece birkaç terim gereklidir. fbm
Formül fraksiyonel Brown hareketi anlamına gelir - bu fonksiyon adıdır.
Bu güçlü bir tekniktir. Frekans çarpanı ile, farklı frekansların ağırlıkları ile oynayabilir veya gürültüyü bozmak için bazı işlevler ekleyebilirsiniz. Mesela, daha "mahya" hissi h(x)
elde etmek için 1-abs(h(x))
(varsayarak -1<=h(x)<=1
) olarak değiştirilebilir
Ancak, tüm bunlar güzel olsa da, bu tekniğin ciddi bir sınırlaması var. "Dağ çizgisi" temelli bir yaklaşımla, hiçbir zaman "çıkıntı" arazisine sahip olamazsınız. Ve "Ay Çocuğu" benzeri bir oyunda olması için çok hoş bir özellik olduğunu hayal ediyorum.
Güzel çıkıntılar eklemek zor bir iştir. Aklıma gelen bir şey - bir fraktal "yükseklik çizgisi" ile başlayabilir ve onu bir dizi spline veya bezier eğrisinde "tessellate" edebilirsiniz. Ardından arazi hattı birkaç "kilit nokta" ile tanımlanacaktır. Bu önemli noktalara bir miktar titreşim uygulayın - bu, muhtemelen ilginç bazı şekiller oluşturan arazinin rastgele deformasyonuna neden olur. Bununla birlikte, arazi kendini kesişme noktaları bu yaklaşımda, özellikle de yüksek titreme miktarlarında sorun olabilir.