Sonsuz arazi için işlemsel nehir veya yol üretimi


28

Yolları söylemeliyim, daha Ortaçağ'a benzer sandığım yollar değil. Ayrıca, gerçekçilik aramıyorum. Aradığım cevap gerçekçilikten ziyade tarif ettiğim kalıba sığacak.

Kıvrımlı bir şekilde usule dayalı yollar / nehirler üretmenin bir yöntemini arıyorum, ancak bunu sonsuz bir arazi tipi sistemi için yapmak istiyorum. Perlin gürültüsünün nasıl kabarcıklar ürettiği gibi, rastgele uzunluktaki çizgi bölümleri (muhtemelen sonsuz uzunluk) oluşturmak istiyorum.

Burada bulunan önerilen cevap gibi stratejilerin farkındayım , ancak çalışmak için belirli bir başlangıç ​​ve bitiş noktasına dayanıyor, belirli bir başlangıç ​​ve bitiş noktama sahip değilim. İsteğe bağlı koordinatları kullanarak basitçe bir fonksiyon çağırabilmeyi ve belirli koordinatların nehrin / yolun bir parçası olup olmadığını göstermesini istiyorum.

Arazinin önceden oluşturulmasını istemiyorum. Bu bir yükseklik haritası içerir (yağış simülasyonları veya benzeri için kullanılanlar gibi). Ayrıca bir başlangıç ​​/ bitiş noktası gerektirmek istemem.

Böyle bir algoritma var mı veya birisinin açıklamaya çalıştığım şeyi başarması için bilmesi gereken bir gürültü algoritması var mı?

Şimdiye kadar geldiğim en yakını çok sırtlı fraktallar, eğer adı doğru kullanıyorsam. Sadece değer gürültüsünün mutlak değerini alıyorum (-1 ile +1 arasında ölçeklendiğini varsayarak) ve bir eşik ayarlıyorum. Bununla ilgili temel sorunum, çizgiler çok sık çakışıyor, çoğunlukla dairesel, bazen düzgün ama istenmeyen büyük göller oluşturmak için birleşiyor ve çoğu zaman çizgilerin kalınlığı çok fazla değişiyor.

İşte şimdiye kadar 2D'de sahip olduğum şeyin bir resmi, ancak daha fazla ayrıntı göstermek için çok yüksek bir frekansta:

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


nehirler "akış" olduğundan, yalnızca başlangıç ​​noktasını belirlemek için gürültü kullanarak nehirleri belirlemek kolay olabilir, bundan sonra yolu belirlemek için ham yükseklik haritası verilerinizi kullanın.
Savaş

yollar biraz daha zor olabilirdi, kullanım yerine göre yollar inşa etmeyi düşündüm, eğer bir oyuncu / tüm oyuncular düzenli olarak bir arazide yürüdüyse, yol olacaktı.
Savaş

1
@ user19142 Tamam, sonra bir kopyası değil. Bu soru / cevapta bir miktar kullanım da bulabilirsiniz: gamedev.stackexchange.com/questions/53400/… Ve önceki bağlantıları tekrar "ilgili" gamedev.stackexchange.com/questions/45403/… gamedev olarak ekleyeceğim. stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
Michaelhouse

4
Gürültüyle üretilirse yolların inandırıcı olmayacağını düşünüyorum. Yollar, fizik ve zaman yerine istihbarat tarafından yaratılır. Zaman zaman birbirlerine benzeyebiliyor olsalar da, her ikisi için de aynı algoritmayı kullanamayacağınız kadar farklılar.
MichaelHouse

1
Bu projedeki yollar, belirli yükseklikleri takip eden kontür çizgileriydi, bu nedenle onları yerel olarak oluşturabilirsiniz. Orada çalıştı ama yükseklik haritaları değil Perlin gürültü üretti.
amitp

Yanıtlar:


11

Sadece benim (bu kadar) önceden hesaplama yapmadan istediğin şeyi ve sonsuz bir dünya olasılığını arşivleme fikrim.

Algoritmanın ilk bölümü Voronoi-Diagramms kullanımıdır . Dünyanızı ızgaralara ayırıyorsunuz, her bir ızgara biçiminde bir adrese sahip (xgrid, ygrid). Yol oluşturmanız gereken her hücre için, xgrid ve ygrid değişkenlerini, CellSeed sayısını döndüren bir karma işlevine koyarsınız . Voronoi Diyagramı için noktaların koordinatlarını üreten rastgele bir sayı üreteci için tohum olarak CellSeed kullanın .

Şimdi diyagramın kenarlarını ve çoklu kenarların çarpıştığı düğümleri aramanız gerekir. Bilgileri daha kolay erişmek için bir grafiğe de kaydedebilirsiniz.

Bu adımdan sonra geçerli olan ağ üzerinden yolları arayabilirsiniz.

Geçerli yollar için artık yolları oluşturabilirsiniz (keskin kenarları vardır).

Not : Ayrıca, tüm komşuluk hücreleri için Voronio diyagramının koordinatlarını da oluşturmanız gerekir, böylece hücrenin kenarlarında kenarlıklarınız olmaz.

Keskin kenarlar istemiyorsanız, her bağlantının orta noktasını hesaplayabilir ve yönü, grafikteki iki kenar arasındaki bir bezel enterpolasyonu için teğet olarak kullanabilirsiniz.

Voronoi-Diagramm kullanımı hakkında

Şehrin yol yapıları gibi arşivlenmesi için sözde rasgele işlevdeki noktalar bir ızgara üzerinde hizalanabilir, böylece yollar dikdörtgen şeklindedir.

Daha çok ilçe gibi yollar için, noktaların daha düzensiz olması gerekir.

wikipedia'dan diyagram

Voronoi-Diagramms için noktaların konumlarını oluşturmak için Sözde Rastgele işlevi hakkında

Bu, normal rastgele bir işlev veya noktaların daha düzgün dağılmayan dağılımı için ayarlanmış bir Hammersley olabilir .


Herhangi bir karma işlevi örneği var mı? Aynı hedefe sahibim (yollar için voronoi'yi kullanan sonsuz dünya), ancak bunun nasıl yapılması gerektiğine yer veremiyorum. Bulduğum her voronoi kütüphanesi, amacı hemen yenen bir sınırlama kutusunun koordinatlarını bekliyor.
BotskoNet

Hayır, karma işlevi sadece hücreye bir starteed atamak içindir. X * prime1 + y * prime2 + z * prime3 kadar önemsiz bir şey olabilir. Asalların birbirine eşit olmadığı ve ideal olarak büyük olduğu durumlarda, burada 64bit tamsayı / imzasız olarak hesaplamanız gerekir. Eğer lib sınırlayıcı bir kutu kullanıyorsa sorun değil, çünkü her hücre için sadece hücredeki tüm noktaları ve komşu hücrelerin tüm noktalarını (8 mahalle hücresidir) sınırlamanız gerekir.
Quonux,

Eğer lib tek bir hassasiyet kullanıyorsa veya tek bir öncelik kullanıyorsanız, hassas konularla tek bir hassasiyetle karşılaşacaksınız. Eğer lib sadece tek bir hassasiyet kullanıyorsa ve aşağıdaki gibi yapmazsanız sorunu atlamak için: Pozisyonları tek bir hassasiyete dönüştürmeden önce merkez hücrenin global pozisyonunu onlardan çıkarın, sonra bunu lib'in içine kaydırın, sonra geri sonuçlanır.
Quonux

Aslında bu algoritmayı hiç uygulamamıştım, ancak karma işlevi gerçekten önemsiz biri olabilir.
Quonux,

8

Yol (ve şehir) yapımı için bulduğum en iyi makale şuydu:

Y Parish ve P Müller Tarafından Kentlerin Prosedürel Modellemesi

Bu L Sistemini kullanır ve ABD ve AB yol düzenlerini oluşturabilir. Bir şehrin tamamı için yol yapmak istemiyorsanız, sadece ana yolları oluşturabilirsiniz. Girişte yükseklik haritası, su haritası ve nüfus yoğunluğu haritası alabilir.


+1, çünkü gazeteyi beğendim. Gerçekten, araziyi dinamik bir şekilde üretirken, yolları / yolları / nehirleri oluşturmaya çalışmak istediğim ile uyuşmuyordu.
Efsaneler

6

http://vterrain.org/Culture/Roads//tr "3D Yolların Oluşturulması" bölümünde yol yapımı hakkında bazı bilgiler bulunmaktadır .

Sorun yollarda onlar olmasıdır işaretlerini bağlamak (genellikle her ne kadar arazileri takip A'dan B'ye düz gitmek yerine).

Şahsen, araziyi oluşturabilir, nehirleri yerleştirebilirim (erozyon kullanarak, http://vterrain.org/Water/ "hidrojeoloji" bölümüne bakınız ), sonra şehirleri anlamlı olduğu yerlere yerleştiriniz (örneğin bir nehrin veya diğer yerlerin yanına). su kaynağı veya suyun su kemerleri veya su kuleleri ve boruları kullanılarak taşınabileceği bir yerde) ve nihayet şehirler arasında yollar oluşturacak.

Prosedürel bir dünyada kullanımı daha kolay hale getirmek için, o yerde üretildiğinde yolların gitmesi en muhtemel olan arazide ara noktalar oluşturabilir, ardından o yerde gerçekten bir yol oluşturulmuşsa ara noktaları birleştirebilirsiniz.


4

İlk olarak, nehirler ve yollar çok farklı. Yollar izolinleri izlemeye meyillidir (aynı / benzer yükseklik) - nedeni, yükselmeyen veya fazla düşmeyen yollarda seyahat etmenin daha kolay olmasıdır. Öte yandan, nehirler, izolin / izoklinlere dik (yokuş aşağı) hareket eder. Nehirler havzalarda oluşur (belirli bir vadiye aşağıya doğru akan dağların toplanması) ve ağaç benzeri yapılar oluşturma eğilimindedir. Ek olarak, yollar genellikle mantıksal köprüler oluşturmak için nehirlere dik olarak gider. En iyi fikir, önce nehirler üretmek, sonra da mantıklı yollar oluşturmaktır (yani şehirler arasındaki yollar). Maalesef daha fazla ayrıntıya girmek için zamanım yok ama umarım bu sizi doğru yolda tutacaktır.

Belli gözüküyor olabilir, ancak Google haritalarına çeşitli arazi ve yol türlerini inceleyin; Nasıl görünmeleri gerektiği hakkında daha iyi bir fikir edineceksiniz.


1
Algoritmanın çalışması için ihtiyaç duyduğum kadar yakın hiçbir yerde gerçekçiliğe ilgi duymadığımı anlamak için soruyu tekrar değiştirdim. Yine de cevapları, çoğunlukla kullanılan terimlerin bazıları için olsa da, takdir ediyorum. Arzum olandan daha çok gerekli olan (yükseklik haritası gibi) üretilebilen sonsuz rastgele uzunluktaki dalgalanmalar gibi düşünmeye çalışın.
Efsaneler
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.