Fraktal tabanlı yordamsal şehir düzeni için iyi bir algoritma nedir?


19

Arka fon

Oldukça büyük ölçekli bir başlangıç ​​şehri tasarlayacağım bir minecraft sunucusu işletiyorum. Kural işaretleri ve mafya kafesleri gibi bir dizi şeyim var, oradaki binalara koymak istiyorum. Şehrin kendisi çok büyük olacak ve tercihen 1000 x 1000 blok büyüklüğüne yayılacaktır.

Binaların kendileri, 3 blokun tüm katları gibi, belirli bir taban küpüne dayanan küp veya dikdörtgen ayak izlerine sahip olacak. Binalar arasındaki sokaklar ve mesafe, sokağın önemine bağlı olarak tercihen 5-11 blok genişliğinde olacaktır.

Şehir planına başladığımda, binaların ne kadar büyük olmasını ve kaç tane olacağını tam olarak bileceğim.

Sorun

Sorun kentin düzenini tasarlamak. Açıkçası böyle bir ölçekte bir şeyle ve ben bir şehir planlayıcısı arka planından ziyade bir programlama arka planından geliyorum, başımı problemin etrafına sarmaya başlamak oldukça zor.

Sorun özellikle şehrin olabildiğince doğal görünmesini istemem. Tabii ki bu basit bir ızgara deseni üzerine inşa etmek oldukça kolay olurdu, ancak bir ızgaradan veya ızgaraya benzeyen herhangi bir şeyden mümkün olduğunca kaçınmak istiyorum.

Soru

Kod kullanarak tasarım yapmama yardımcı olmak için hangi algoritmaları izleyebilirim? Minecraft arazi yapımında zaten fraktallar kullandığından ve bir şehir doğal olarak fraktal bir şekilde büyüyor gibi göründüğü için bir şekilde fraktallar kullansaydım en doğal görüneceğini düşünüyordum.

Bazı yönlerden tetris çalma algoritmasına benzediğini düşünüyorum, bu yüzden eğer bu yönde var olan çözümler varsa, o da yardımcı olacaktır. Kullanmak istediğim şekilleri tanımlayabileceğim bir şey hayal ediyorum ve yazılım, binaların eşit dağılımı için en "en uygun" çözümü bulana kadar tekrar ediyor. Bu sorunu python kullanarak, tercihen pygame kullanarak görsel bir şekilde çözmeme yardımcı olacak bir şey var mı?

Doğal olarak bunun genel olarak oyun tasarımında şehir üretimi için de ilginç etkileri var, bu yüzden en iyi çözümün ne olduğunu görmek için çok heyecanlıyım.

Açıkça belirtmek gerekirse, binalar tasarlanacak ve inşa edilecek bu noktada sadece düzeni arıyorum.


3
Minecraft fraktal kullanıyor mu? Ben sadece sürekli gürültü fonksiyonları (Perlin veya Simplex, inanıyorum) kullandığı izlenimi altındaydı.
Martin Sojka

@Martin Sojka Perlin gürültüsü aslında bir fraktal, bu yüzden orada.
Nevermind

1
@Nevermind: Bir fraktalın tanımlayıcı özelliği kendi kendine benzerliktir : Bir kısmını seçer ve orijinalin boyutuna ölçeklendirirseniz, "benzer" olacaktır (aynı yapıya sahip olacaktır). Özellikle, bir fraktal sinyalin frekans spektrumu ölçeğe değişmez. Bunu Perlin gürültüsü ile yaparsanız, elde edeceğiniz tek şey bir Perlin gürültüsünün büyütülmüş alanıdır; frekans spektrumu da değişecektir.
Martin Sojka

@Nevermind Perlin gürültüsü aslında bir fraktal değildir, ancak Brown hareketi (Perlin gürültüsünü kullanabilen bir tekniktir) bir fraktaldır ve genellikle Perlin gürültüsü olarak adlandırılır.
Elva

Evet, üzgünüm, Perlin gürültüsünü ve pembe gürültüyü karıştırdıklarında insanları hep düzeltirim, ama burada aynı hatayı kendim yapıyorum. Benim tek savunmam Minecraft'ın aslında pembe (brownian hareket) gürültüsünü de kullandığı IIRC.
Nevermind

Yanıtlar:


20

Son zamanlarda prosedürel bir şehir düzeni için bir algoritma uyguladım. Hala devam eden bir çalışma, ama bana umut vaat ediyor. Bir göz at:

prosedürel şehir örneği

Bu düzeni oluşturmak için kullanılan algoritma L-Systems'a dayanmaktadır . ElementHarita üzerindeki yerini işaretleyen bir dikdörtgen ve Growdiğer Elementsiçinde dikdörtgen oluşturur ve / veya harita üzerinde bazı nesneleri yumurtlayan bir yöntemi olan bir temel sınıf var . Sonra bu temel sınıfından miras fiili unsurlar vardır: City, Street, Buildingvb

Nesil bir dizi "tohum" nesnesiyle başlar (benim durumumda, Cityharitaya rastgele yerleştirilmiş tek bir öğe). Daha sonra sistem Grow, tüm elemanlar devre dışı kalana ( Growgeri dönene false) veya çok sayıda yineleme geçinceye kadar çağrı yaparak tüm elemanlar üzerinde tekrarlar.

Resimdeki şehir sadece birkaç basit kural kullanılarak inşa edilmiştir:

  • CityStreetalanı bir yere bölen bir element haline gelir .
  • Tümü Street0-3 ara sokak büyüyor, alanı daha da bölüyor.
  • Ayrıca, Streetsürekli olarak rastgele boyutta bir Buildingtarafa uymaya çalışır .

Sonuç çok ilginç değil, ama kötü de değil. Sistem kolayca genişletilebilir ve neler olduğunu anlamak için yeterince basittir (-8


Sadeliği seviyorum. Şehirler sanırım aslında organik, çünkü zihninin gördüğü gibi mükemmellik yaratmaya çalışan organik bir varlık tarafından kontrol ediliyorlar - L-Systems'ı muhtemelen bu sürecin en iyi yaklaşımı yapıyor.
Jonathan Dickinson

Bunu sevdim. =) Şimdi oyun alanında uygulamak ...
Ken

8

Orada bu GDC konuşma birkaç yıl önce gelen prosedürel bina nesil. Bir dizi şablona dayalı bireysel binalar oluşturmak için, ancak tüm şehirleri oluşturmak için değil (sokaklar vb.). Ne yazık ki, onunla birlikte gitmek için ücretsiz bir kod yok. Konuşmada açıklanan sistem Unreal'da uygulanıyor, ancak UDK'nın ücretsiz sürümünde olup olmadığından emin değilim. Her durumda, kendi sisteminizi oluşturmak için aynı fikirlerden bazılarını kullanabilirsiniz.

Google'ın "prosedürel binaları" veya "prosedür şehri" de size konuyla ilgili birkaç makale ve makale daha verecektir.


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.