Usule uygun olarak yaratılmış 'vahşi doğa' dünyaları


76

Eminim hepiniz Cüce Kale gibi oyunları biliyorsunuz - masif, usule uygun olarak yaratılmış doğada ve topraklarda. Böyle bir şey bu çok yararlı makaleden alınmıştır.

Ancak, bunu daha büyük bir ölçekte nasıl uygulayabileceğimi merak ediyordum; Minecraft ölçeği akla geliyor (bu, Dünya yüzeyinin 8 katı büyüklüğünde bir şey değil mi?). Sözde-sonsuz, bence en iyi terim olur.

: D

Makale, fraktal perlin gürültüsünden bahsediyor. Bu konuda uzman değilim, ama genel bir fikre kapılıyorum (yarı tutarlı olan, sadece rastgele piksel değerleri değil, rastgele oluşturulmuş bir tür gürültü).

X bölgesini X ile sadece boyut olarak tanımlayabilir, bazı bölge yükleme tipi şeyler ekleyebilir ve bir bölge oluşturan bir bit gürültüye sahip olabilirim. Ancak bu, yalnızca çok büyük miktarda adalar ile sonuçlanacaktır.

Diğer uçta, süper kütleli bir perlin gürültüsü tabakası oluşturabileceğimi sanmıyorum. Ve sanırım sadece büyük bir ada olurdu.

Perlin gürültüsünün ya da bazı gürültülerin bir şekilde cevap olacağından eminim. Demek istediğim, harita gerçekten güzel görünüyor. Ve ascii çinileri ile değiştirebilir ve çok güzel görünen bir şey elde edebilirsiniz.


9
"sadece büyük miktarlarda adalar ile sonuçlanır" - Ya da sadece toprakları / suyu değiştirirseniz içinde göllerin olduğu toprakları oluşturur.

3
Öyle olsa bile, oldukça standart bir şekilde, çok miktarda göl elde edersiniz.
Komünist Ördek

3
@Kylotan: Mincraftın boyutu sonsuzdur (aslında pek sayılmaz, ama gerçekten çok büyük ... toplam hacim = uzun. Bu nedenle, tüm dünyayı bir çekimde yaratmaz, tüm haritayı da hafızada tutmaz. Daha önce ziyaret edilmediyse asenkron olarak 16x128x16 blok bölgeleri oluşturur, aksi takdirde diskten yükler.
zfedoran

2
@ Komünist Ördek: Evet, bu doğrudur, minecraft gibi bir oyun blok başına yaklaşık 2 ila 4 bayt veri kullanarak kurtulabilir, ancak artık görünmez bir durumda sadece bir baytın kaydedilmesi gerekir (bir bayt bloğun türünü açıklar) diğer byte'lar aydınlatmayı ve daha sonra yeniden hesaplanabilecek diğer verileri tarif eder). Burada ilginçleştiği yerde, saklanan büyüklüğü yalnızca birkaç byte kadar düşürmek için RLE'yi kullanabilirsiniz, çünkü bloklar belirttiğiniz gibi biraz uyumludur.
zfedoran

4
'Gerçekten büyük' ​​sonsuz ile aynı değildir ve iki terimi birbiriyle değiştiremezsiniz. Haritayı keşfedildiği gibi büyüttüğünüzde, talep üzerine büyüyen sınırlı bir boyuttur - sınırsız olmaktan oldukça farklı bir teklif. Gerektiği gibi her bir büyüme biti üretilebilir. Minecraft'taki arazi verileri önemsiz sıkıştırmaya çok uygundur, çünkü veriler arasında yüksek derecede tutarlılık vardır. (örn. belirtildiği gibi RLE.)
Kylotan

Yanıtlar:


35

Sanırım şu an ne sorduğunu daha iyi anlıyorum.

Gürültü rastgele değildir - rastgele görünümlüdür ancak tamamen matematiksel bir formüle dayanır ve tekrarlanabilir. Tüm bilgiler formülde kodlanmıştır. Bu, potansiyel olarak sınırsız bir alanı kapsayan bir formüle sahip olabileceğiniz ve yalnızca ihtiyacınız olan alanın koordinatlarında formülü kullanabileceğiniz anlamına gelir. Bitişik bir alana ihtiyaç duyduğunuzda, yeni koordinatlardaki formülü yeniden kullanmanız gerekir ve formül sürekli değerler verdiğinden, alanlar sorunsuz bir şekilde birleşir.

İşte basitleştirilmiş bir örnek, yükseklik üretimi için perlin gürültüsü yerine sinüs kullanmak ve dünyayı hayal etmek X ekseninde sınırsız, ancak Y ve Z eksenlerinde sadece 1 birim yüksekliğinde.

Formül: height(x,y) = sin(x/20)

Oyun başlar ve yakındaki alan için yükseklikler oluştururuz, yani. (0,0) ila (9,0):

[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]

Sağa doğru yükselen bir tepemiz var. Diyelim ki sonuna kadar yürüyelim ve şimdi (10,0 - 19,0) arasında bir değer üretmemiz gerekiyor:

[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]

Tepenin nasıl sabit bir şekilde yükselmeye devam ettiğini ve (10,0) 'daki değerin (9,0)' daki değerden güzel bir şekilde geçtiğini görün. Bunun nedeni sinüs fonksiyonunun sürekli olmasıdır, yani temelde 2 bitişik sayıyı beslerseniz, 2 bitişik sonuç elde edersiniz - belli bir bitişik tanım için. Böylece, dünyanızın koordinatlarını, dünyanızı tanımlayan işlevin parametreleri olarak kullanırsanız, bir kerede ne kadar çok veya az oluşturursanız olun, birbirine uyan sürekli bir manzara elde edersiniz. Yeni parçalar oluşturduğunuzda, yükseklikler önceden belirlenmiş olduğundan, mevcut parçalardan otomatik olarak akacaktır.

Eğer dünya değişmeyecekse, hiçbir şey saklamanıza gerek kalmaz, çünkü formülde belirtilen herhangi bir noktada tam olarak yüksekliğin ne olduğunu hesaplayabilirsiniz. Açıkçası Minecraft gibi bir şeyle, dünya tamamen deforme olabiliyor, bu yüzden yarattığınız gibi her bir parçayı kurtarıyorsunuz. Bitişik topaklar arasında yüksek derecede tutarlılık olduğu göz önüne alındığında (yani, 1 blok çim ise, yanındaki bloğun da çim olamayacağından daha muhtemeldir) verileri verimli bir şekilde sıkıştırabilirsiniz - çalışma uzunluğu kodlaması işe yarayabilir peki, fakat o zaman neredeyse herhangi bir standart sıkıştırma algoritması olur.

En belirgin değer olarak yükseklik hakkında konuştuğum halde, istediğiniz sistemi oluşturmak için aynı sistemi kullanabilirsiniz. Sürekli özelliklere sahip ve girdilerin dünya koordinatlarınız olduğu ve yer işaretlerinin, maden birikintilerinin, yumurtlama noktalarının ne olduğuna karar verebileceğiniz bir matematiksel işlev kullanın. (Açıkçası bir formüldeki değerler başka birini etkileyebilir - havaya bir kömür yatağı yerleştirmenin bir anlamı yoktur, bu nedenle dünya yükseklik haritasını oluşturur ve daha sonra yalnızca toprak altında yeterince blok olan bloklar için kömür olasılıklarını hesaplarsınız.)


Kesinlikle bir şeyleri temizlemeye yardımcı oldun, teşekkürler. :) Ama gürültü fonksiyonu gibi bir şey sürekli olmazdı. Ve AFAICS, eğer sürekli olsaydı 'rasgele' bir dünya elde edemezdim. Yoksa burada bir şey mi özlüyorum?
Komünist Ördek

Çifte yorum için üzgünüm, ancak yukarıdakilerin bundan ayrı olduğunu düşünüyorum. 'Perlin gürültüsü için dünya koordinatlarını kullan' derken, bu 'büyük' ​​gürültü tabakasını oluşturmakla aynı etkiyi yaratabilir mi? Bugün alım konusunda biraz yavaş hissediyorum.
Komünist Ördek

Şey, gürültü oluşumunuz kesinlikle sürekli olabilir ve genellikle öyledir, çünkü onu düzleştirirsiniz. Sınırları aşmak için sınır boyunca biraz okuma yapmanız gerekebilir, ancak prensip aynı kalır. Söz konusu gürültünün sahte rastgele verilere ihtiyacı varsa, o zaman bunu bilinen miktarlardan elde edersiniz - yani. dünyanızın bir koordinatı. Çıktılar daha sonra tahmin edilebilirdir.
Kylotan

2
Rastgele gelince, her dünya hesaplamalarda kullanılan kendi tohum değerine sahip olabilir. Örneğin. Yukarıdaki örneğime göre, günah (x) yerine günah (x + tohum). Her farklı tohum farklı bir dünya üretecek. Ve devasa kağıda göre ... Ne alakası olduğuna emin değilim. Ne kadar veya ne kadar az ürettiğiniz veya ne zaman yaptığınız önemli değil. Dünyanın ilk hali matematiksel formülle tanımlanır ve bu durumu ihtiyaç duyduğunuz anda ve zamanda bulmak için kullanırsınız.
Kylotan

32

Yıllar önce yazdığım bu öğretici, istediğiniz gibi bir şey verebilir:

alt metin

Son adımda ada değişikliğini yaparsanız, haritanın kenarlarına ulaşamayan tek bir kara toprağına yönelir.


7
Harika görselleştirmeler!
zfedoran

3
Bu dersi, doğal olayların simülasyonu üzerine Master tezimi yaparken kullandığımı hatırlıyorum. 3B dünyamın üzerindeki gökyüzü kubbesini oluşturmak için "tepe" örneğini kullandım. Arazi oluşturma kavramına mükemmel giriş.
C.McAtackney

1
Çılgın, bu harika! Hiç kimsenin gerçekten kullandığını bilmiyordum.
munificent

1
AMAN TANRIM !!! Bunu da önceki bir projede kullandım ... şimdiye kadar karşılaştığım araziyi oluşturmanın en basit yolu !!!
Savaş

15

Büyük bir ada oluşturmak için hepsini bir kerede oluşturmanıza gerek yoktur. Ziyaret ettiğiniz bölgeleri asenkron olarak kurardım.

Adayı, makalenin tanımladığı şekilde oluşturmak için bir maske kullanmak yerine, yapabileceğiniz bir şey, aradığınız görünümü elde etmek için perlin gürültü oktav dalga boylarıyla oynamaktır. Genellikle, ilk oktav, arazinin genel şeklini tanımlar. Tüm oktavlar, basitçe daha ince tanecik detayı sağlar. Bu nedenle, kara kütlelerinin ne kadar büyük olacağını kontrol etmek için ilk oktavın dalga boyuyla oynayın. Kara kütlelerinin merkezde olmasını istiyorsanız, merkezden uzaklaştıkça yükseklik haritasını artan miktarda azaltabilir ve sonra gürültüyü normalleştirebilirsiniz. Örneğin, adanızı oluşturmak için bu ikisini birleştirmeyi hayal edin:

ilk oktav ayrıntılar

Bu makale yardımcı olmalı: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

Sınırsız 3B dünyalar ve gürültü giriş ve çıkışı ile oynayarak arazinin görünümünü değiştirmek için kullanabileceğiniz çeşitli püf noktaları hakkında bilgi edinmek istiyorsanız, bu makaleye bir göz atın: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html

Grafik boru hattı ve gölgelendirici programlamasına aşina değilseniz, biraz zor olabilir.


Ulaşmak istediğim etki, Minecraft haritasının 2d aşağıdakine benzer bir şey (oyun değil)… eğer daha az oktav kullandıysam, hala büyük bir perlin gürültüsü tabakası oluşturmam gerekmiyor mu? Ya da bir şekilde çok, çok küçük bir miktar üretebilir miyim?
Komünist Ördek

Perlin gürültüsünün nasıl çalıştığı hakkında hala biraz kafanız karışmış olabilir. Perlin gürültüsü için x ve y koordinat ofsetlerini göndererek, tek tek 16x16 blok topakları oluşturabilirsiniz. PerlinNoise_2D (float x, float y) fonksiyonunun x ve y koordinatlarında nasıl gerçekleştiğine dikkat edin. Başka bir deyişle, bazı (x, y) konumları için gürültü oluşturur. Ayrıca, daha az oktav oluşturmak, oktavların dalga boyunu değiştirmekle aynı değildir. Daha az oktav = = Daha az ince tanecik detayı. Daha uzun dalga boyu => daha fazla yakınlaştırıldı.
zfedoran

Ayrıca, zoom / daha uzun dalga boylarını nasıl kullanacağınızı gösteren kodlu bir makale: dreamincode.net/forums/topic/66480-perlin-noise
zfedoran


7

Perlin gürültüsü ve arkadaşlar iyi bir başlangıç ​​noktasıdır, ancak muhtemelen bir adım daha ileri gitmek istersiniz. Popüler gürültü temelli jeneratörlerin çoğu size oldukça ilginç bir sonuç verecektir. Araziyi gerçekçi kılmak için, erozyon etkilerini taklit eden algoritmalara bakmak istersiniz. Dışarıdaki en gelişmiş oyun dünyası simülatörlerinden biri - Cüce Kale - dünya kurma adımlarından biri olarak erozyon simülasyonu yapıyor.

Gördüğüm hoş serin çözümlerden biri çizmek için kaynakların çok şey var bu yüzden internette mevcut diğerleri vardır Oyun Programlama Gems 7. "Gelişmiş Parçacık Biriktirme" makalesinde açıklanan (örneğin 1 veya 2 ) .

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.