Worms tarzı araziyi nasıl oluşturabilirim?


48

Worms tarzı bir oyun üzerinde çalışıyorum ve usule göre bazı arazi oluşturmak istiyorum. Daha önce perlin gürültüsünü kullanarak çok fazla arazi üretimi yaptım ve bu oyunda kullanmaya başladım. Bununla ilgili tek sorun çok basit ve sıkıcı, bana bazı tepeler veriyor ama istediğim karmaşıklığı değil. Mağaralar ve asılı dağlar gibi özelliklere sahip olmak isterdim ve yüzen adalar gibi şeyleri umursamıyorum. Böyle bir şey, ama daha çılgın bile olur:

görüntü tanımını buraya girin

İlk önce klasik perlin gürültüsünü kullanarak araziyi oluşturmayı, sonra mağara oluşturmak için parçaları sökmeyi ve ne yapmamayı düşündüm, ancak bu bölümlerin çıkarılmasını yönlendirmede sorun yaşıyorum. Böyle bir araziyi oluşturmanın bir alternatifi var mı?


Kırmızı mağaraları temsil ediyor mu yoksa arazinin bir parçası mı?
Richard Marskell - Drackir

Arazinin bir parçası. Ben sadece bu resmi Google, başarmak istediklerime en yakın olanıydım. “Mağara” kısmı, soldaki arazinin içinde devam ederse sağdaki o küçük delik olabilir.
Xeon06

@Drackir, resmi düzenledi.
Xeon06

İlgili: gamedev.stackexchange.com/questions/6721/… (ancak üretim algoritmalarına karşı uygulamaya odaklandığı göründüğü için bir kopya değil).
Josh

@JoshPetrie gerçekten. Yıkım konusunda iyiyim. Sorun yaşadığım kuşak.
Xeon06

Yanıtlar:


51

2D Perlin gürültüsü ile başlamanızı öneririm. Bunun gibi bir şey:

perlin-gürültü

Ardından görüntüye bir eşik uygulayın, böylece burada gösterildiği gibi birkaç izole ada elde edebilirsiniz:

eşikli perlin gürültüsü

Ben 0.04 eşik seçti, eşiğin üstünde her şey mavi renkte olacaktır. Gerisi siyah kaldı. Ondan sonra, hangi “adaların” tutulacağını ve hangilerinin atılacağına karar vermenin zamanı geldi.

Olası bir yaklaşım, görüntüyü soldan sağa çeşitli yüksekliklerde çalıştırmak ve belli bir olasılık verilen kesişen "adaları" seçmek olacaktır. Örnek resimde, en düşük çizginin% 100 olma olasılığı vardır, bu yüzden geçtiği her ada seçilecek (beyaz ile doldurulmuş). İkinci satırın olasılığı% 50 ve en üst satırın olasılığı% 10'dur.

Adalarınızı böyle işaretledikten sonra, aralarındaki boşlukları morfolojik işlem uygulayarak kapatabilirsiniz ( dilate )

genişlemiş adalar

Ve olası bir manzara var.

Gürültünün "ayrıntı düzeyi" dünyanızdaki ayrıntıların ne kadar küçük olacağını belirleyecek. Bu nedenle, muhtemelen bu değerlerle deneme yapmak en iyisidir.

Ayrıca, "seçme çizgileri" nizin hangi olasılıklarla konumlandığı, sonuç çok farklı olacak. Görüntünün üstünde bir ada "seçme" olasılığı yüksek bir çizginiz varsa, bir tür mağara-peyzajı vb.


Harika detaylı ve resimli cevap için çok teşekkür ederiz! Bu tam olarak yapacağım şey.
Xeon06

Bu ayrıntı düzeyinde ve böyle bir perlin gürültüsü oluşumu hakkında herhangi bir ipucunuz var mı? Bütün gece denedim ve hiçbir yere varamıyorum.
Xeon06

@ Xeon06 Sadece flaş tarafından sağlanan Perlin gürültü fonksiyonunu kullanıyordum . Parametrelerdi 24için baseXve baseY1 oktav ve ben çıkış gri tonlama gürültü ve engelli "fraktal" seçti. Bunu hangi dilde uyguluyorsunuz?
bummzack

JavaScript uyguluyorum. Bir hafta boyunca benzer sonuçlar verecek, ancak hiçbir şey bulamayan iyi bir uygulama için interneti araştırıyorum.
Xeon06

Perlin gürültü kısmı ile ilgili başka bir soru daha yaptım gamedev.stackexchange.com/questions/20880/fast-noise-generation
Xeon06

6

Perlin gürültüsü ile başlar, dikkatlice süzülürdü. Yüzer adalarla, sorunun ekindeki resimdeki gibi bir şeyle bitirdiniz. Juste, burada tartışılanlar gibi bir sayma algoritması kullanarak yüzen adaları daha sonra kaldırır.


Oh, sanırım şimdi anlıyorum. 2B perlin gürültüsü kullanmam gerekiyor, 1D değil. Söylenen filtrelemeyi açıklayabilir misiniz?
Xeon06

2
Şu anda resim gönderemiyorum, ancak sadece threshold-la eğer (0.3> pixelValue> 0.5) KeepIt (); 'Dikkatlice' biti, 0.3 ve 0.5 doğru almakla ilgilidir. Ayrıca, üstte yüksek alfa ile başlayan, kademeli olarak en altta 0'a ulaşan doğrusal bir (veya değil) degradeye sahip olabilirsiniz, bu nedenle bir gökyüzü için yeriniz vardır ve yer çoğunlukla doludur. Umarım yardımcı olur.
Ravachol

@Ravachol Bir resmin linkini gönderirseniz, daha fazla temsilcisi olan biri sizin yerinize gönderiye ekleyebilir.
Richard Marskell - Drakkir

"if (0.3> pixelValue> 0.5)", sanırım bu sadece bir yazım hatası, ama içinde yayınladığınız çelişkili şeylerin olması kafa karıştırıcı olabilir ... Lütfen düzenleyebilir misiniz?
jcora

Bir yorumu düzenleyemiyorum. Açıkça, "if (0.3 <pixelValue <0.5)" yazısını okuyun.
Ravachol

4

Aslında bunu bummzack mükemmel cevaptan başlayarak uyguladım.

İşte sonlandırdığım adımlar:

  1. Perlin gürültüsüyle bir görüntü oluşturun
  2. Arazi istediğiniz yere taşkın doldurma
  3. Diyet + erozyon çok küçük olan oyukların çıkarılması için
  4. Arazi içindeki kalan arka plan bölgelerini kaldırın.
  5. düzgünleştirme

Ve bu bir sonuç örneğidir: üretilen arazi örneği

Ben bütün süreci hakkında detaylı makale yazdı burada ve kodunu (JavaScript) açık kaynak olan bunu kontrol Eğer kullanıma hazır bir şey istiyorum;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.