Prosedürel… oda jeneratörlü ev


74

Prosedürel olarak bir zindan oluşturma ile ilgili bazı algoritma ve makalelere bakıyorum . Sorun şu ki, odalı bir ev üretmeye çalışıyorum ve benim ihtiyaçlarıma uymuyor gibi görünüyor.

Birincisi, zindanların evlerin koridorları olduğu koridorları var. Ve başlangıçta aynı görünseler de, salon, oda olmayan alandan başka bir şey değildir; oysa koridor, bir alanı diğerine bağlamak için özel olarak tasarlanmıştır.

Bir evle ilgili diğer önemli bir fark, belirli bir genişliğe ve yüksekliğe sahip olmanız ve her şeyi oda ve salonlarla doldurmanız gerektiği, oysa zindanda boş bir alan var.

Bir evdeki salonların bir zindan koridoru (sizi diğer odalara götürür) ile zindandaki boş bir alan (kodda açıkça tanımlanmamıştır) arasında bir şey olduğunu düşünüyorum.

Daha spesifik olarak, gereksinimler:


  • Anında duvarlar ve kapılar yaratamayacağım önceden tanımlanmış bir dizi oda var .
  • Odalar döndürülebilir ancak yeniden boyutlandırılamazlar.
    Önceden tanımlanmış bir oda setim olduğundan, onları yeniden boyutlandırabilirim, sadece yeniden döndürebilirim.
  • Evin boyutları belirlenmiş ve tamamen odalarla (ya da salonlarla) doldurulması gerekiyor.
    Yani boş bir alan olmadığından emin olarak 14x20'lik bir evi uygun odalarla doldurmak istiyorum.

Bunu biraz daha net hale getirmek için bazı resimler:

Tipik zindan jeneratörü Koridorsuz Zindan Ev jeneratör sonucu

Gördüğünüz gibi, evde, "boş alan" hala yürünebilir ve sizi bir odadan diğerine götürür.

Yani, tüm bunları söyledikten sonra belki bir ev, gerçekten çok sıkı bir şekilde doldurulmuş bir zindandır, koridorlar vardır. Ya da bir zindandan daha kolay bir şey. Belki dışarıda bir şeyler vardır ve onu bulamadım çünkü ne arayacağımı gerçekten bilmiyorum.

Yardımınızı istediğim yer burası: Bana bu algoritmayı nasıl tasarlayacağınıza dair ipuçları verebilir misiniz? Hangi adımlar atılacağı hakkında bir fikriniz var mı? Bir zindan jeneratörü yarattıysanız, gereksinimlerime uyacak şekilde nasıl değiştirirsiniz? İstediğiniz kadar spesifik veya genel olabilir. Gerçekten beynini almaya çalışıyorum.


2
Tuhaf bir öneri: Christopher Alexander'ın kitaplarının Zamansız Yapım Biçimi ve Desen Dili kitabını, bir (yazılım) desen kavramı için orijinal temeli oluşturan mimarlık kitapları; temel olarak, yukarıdan aşağıya bir prosedürel inşaat yöntemine dönüştürülebilen binalar ve yaşam alanları için açık bir dil tanımlar.
Steven Stadnicki

Şahsen ben egarcias'ın cevabı gibi bir algoritma yapmaya çalışacağım. Oda yer tutucuları oluşturmaya başlayın (çeşitli odalarla doldurulabilen büyük alanlar. Her oda yer tutucusunun aralarında belirli (veya daha düşük bir sınırla rastgele) boyut aralığına sahip olması gerekir. Bir koridorda, yani evde bulunan, ancak odada olmayan bir alan olduğu düşünülür ve oda yer sahipleri, 'koridorsuz zindan' örneğinize benzer, rastgele büyüklükteki odalarla doldurulur
Benjamin Danger Johnson,

@pek Lütfen çözümünüz için bir cevap oluşturun, soruyu cevaplamayın.
MichaelHouse

@ Byte56 Yapıldı. Sadece açık olmak gerekirse, bunu yaptım çünkü kredi almak istemedim çünkü başkalarının önerdiği şeyi yaptım. Bunun neden sitenin formatı için ideal olmadığını anladım, bu yüzden cevabımı ekledim.
pek

@Pek teşekkürler. Kredi alma konusunda endişelenmeyin, hak edilir ve siteye gelen kişilerin çözümü görmeleri için faydalıdır (ve beklendiği yerde görmek en iyisidir).
MichaelHouse

Yanıtlar:


50

Bu ikili ya da üçlü alan bölümü kullanmak için iyi bir durum olduğunu düşünüyorum.

İlk geçişte ev alanını salonlara ve {oda bloklarına} ayırın. Bir sonraki büyük öbürü al, {salon ve öbek} veya {2 öbek ve aralarındaki salonlara böl. Her adımda, dilimleme yönünü 90 derece döndürün. {Başka büyük parça kalmadı} veya {total hall area limitine ulaştığında} durun.

İkinci geçişte, kalan parçaları odalara bölün. Bir sonraki büyük parçayı alın ve ayırın. Bazı büyük odalara sahip olmak için rastgele olmayan bazı büyük parçaları ayırma işlemini atlayın.

Herhangi bir salon çok daha eski bir salona bakarsa, duvarı (veya kapılı duvarları) yerleştirin.

Odaları doğrudan salonlara veya önceden bağlı olan diğer odalara bağlayın.

Örneğin, el yapımı sonucumu veya kısmen yapılmış sözde kod gibi C ++ 'ı görebilirsiniz . Son atış:

son atış


Araştırmamın sonuçlandığı, alanların bölünmesi. Kod içeren örneğiniz bana çok iyi bir başlangıç ​​yaptı. Şu anda algoritmaları okuyorum. Yine de bir soru: şartlarımdan biri odaların önceden tanımlanmış olması (yani bir kapılı 2x2 oda, iki kapılı 1x1, ancak üç kapılı 2x2 yok), bu yüzden bölmeye başlayamam ve sonra kapıları nereye yerleştireceğime karar veremem . Bölümleme yaparken sınırlamalarımı akılda tutmam gerektiğini düşünüyorum. Nasıl devam edeceğime dair bir önerin var mı? Her durumda, cevabınız ve çabanız için çok teşekkür ederiz!
pek çok

@pek Sadece ölümlülerin bu sorun için akademik bir çözüm bulabileceklerinden emin değilim. Öbek ayırıcı ve kutu ayırıcı için ek koşullar ayarlamayı ve ardından tüm koşulların yerine getirilebileceğini bulana kadar düzeyler oluşturup bırakmayı deneyebilirsiniz.
Yağmurda Gölgeler

evet, bir şeyleri özlediğimi umuyordum. İlk yaklaşımım, odaların belirli bir alana nasıl yerleştirileceğini bulmak için A * kullanmaktı, ancak salonlar için mantık yoktu. Şimdi salonları yerleştirmek için BSP'yi kullanabileceğimi ve sonra blokları için A * kullanabileceğimi düşünüyorum. En çok endişelendiğim şey, çok pahalı olabileceği ve her zaman bir sonuç üretmeyeceğidir. Ama önce bunu test edeceğim. Belki de o kadar kötü olmayacak?
pek

2
@pek Eğer hala ilgileniyorsanız, yararlı bir şey buldum. Bak bu da google, L-system.
Yağmurda Gölgeler

24

İstenilen tasarımın odaları koridorlarla çevrili dikdörtgen odalarda toplaması gerçeğinden yararlanabilirsiniz. Bunu aklımda tutarak bunu yapardım:

  1. Odalar için koridorlar ve "büyük alanlar" tasarlayın
  2. Her "büyük alanı" içine odalarla doldurun

2 adım

Sınırları aşan odalarla başlarsanız, büyük alanları odalarla doldurmak kolayca yapılabilir - örneğin, bir koridora bakan odalar o duvarda bir kapıya sahip olabilir, ancak "dış duvarlara" bakan odalar (belki de pencereleri olabilir) olamaz. Büyük bloklarda "içeride" odalar en az bir girişe ihtiyaç duyacaktır.


15

İşte bu problemi nasıl çözdüğüm. Ama önce, hem @ Shadows In Rain'e hem de @ egarcia'a cevapları için teşekkür ediyorum. Bana iyi bir yön verdiler, bu da bazı sonuçlar elde etmeme yardımcı oldu.

Shadows In Rain'in uzay bölümlemesini temel bir ev yapmak için kullandım ve sonra egarcia'nın tavsiyesini alanın odalara doldurulmasını takip ettim.

Alanın bölümlenmesi, kodun% 90'ı Shadows tarafından yapıldığından oldukça kolaydı. "Odalar doldurmak" bölümü biraz daha zorlayıcıydı. Odaları uygun şekilde konumlandırmak için A * kullanan bir sahte AI Planning sistemi kullanmaya karar verdim. Sadece A * yerine planlamayı kullanmanın iyi yanı, ön koşulların arama alanını önemli ölçüde azaltmaya yardımcı olmasıdır.

İşte sonuçları ile bazı ekran görüntüleri:

Kat planı oluşturma aşaması Kat planı oluşturma aşaması

Oda yerleştirme aşaması Oda yerleştirme aşaması

Şimdi bağlantı kapılarıyla!
Şimdi bağlantı kapılarıyla!


11

Dahl ve Rinde, bina iç mekanlarını oda ve koridorlarla doldurmak için iskelet ve bölgeler yaklaşımı kullanan İç Mekan Ortamlarının Usul Üretimi üzerine bir tez çalışmasına sahiptir . Bu makale prototipleri için sınıf diyagramları içermektedir. Yukarıda sözü geçen A Pattern Language de dahil olmak üzere kaynakçalarında bazı iyi referanslar var .

Çalışmaları aşağıdaki basitleştirici varsayımlara göre tasarlanmıştır:

  • sadece apartman binalarıyla ilgileniyor
  • bölünmüş seviye yok
  • binaların şeklini sınırlama (zarf) çokgen olmalıdır
  • zarfta delik yok
  • benzer veya doğrusal olarak değişen zarf kalınlığı (IE kum saati şekli yok)
  • sadece koridorlara ihtiyaç duyan binalarla uğraşmak

İşte süreçlerine kısa bir genel bakış:

  • Zarfın iskeletini bulun . Koridorlar daha sonra zarftan uzaklığa, kapılara veya merdivenlere olan yakınlık ve önceden yerleştirilmiş koridorlara yakınlık temelinde iskelet boyunca yerleştirilir.
  • Daha sonra, kalan koridor dışı alan, her biri tek bir sürekli sınır olan maksimum bağlı alanlara ayrılır. Bazı durumlarda, bu bir duvarın yerleştirilmesini gerektirebilir.
  • Bu bölgeler daha sonra daire başına en az bir pencere tahsis etmeye çalışan dairelere ayrılır. Bazı durumlarda aşırı küçük dairelerden kaçınmak için daha küçük bölümler bir araya gelecektir. Penceresi olmayan bölgeler göz ardı edilir.
  • Son olarak, daireler aşağıdaki gibi temel bir Voronoi benzeri diyagram kullanılarak odalara bölünmüştür:

    • Oda büyüklüğünü etkilemek için tohum ağırlıkları kullanılır. Tohumlara kapılara ve pencerelere eklenir. Genellikle istenen oda başına bir adet ek tohum eklenir; açıkça belirtilmediği halde, tohumlar dairenin dış duvarlarına yerleştirilmiş gibi gözüküyor.
    • En uzak noktadan başlayarak, verilen tohum ile diğer tüm noktalar arasındaki bir çizgi hesaplanır ve ardından uç noktaların ilgili ağırlıklarına göre bir mesafe hesaplanır (A & B'nin 1 & 4 ağırlığa sahip olması durumunda EG, parçalama noktası, A'dan B'ye kadar olan yolun 1 / 4'ü). Dış duvarla birlikte parçalama çizgilerinin toplanması daha sonra tohum hücresini oluşturur.
    • Daha sonra, bir S-Space duvar iskeleti (Peponis et al 1997'ye göre), alanın dış duvar özelliklerinin komşu çiftleri (pencereler veya kapılar) arasındaki orta noktalardan dik olarak çıkan çizgilerle bölünmesiyle yaratılır.
    • Son olarak, duvarlar 'Voronoi hücre duvarlarına mümkün olduğu kadar karşılık gelen' S-uzay iskeletinden seçilir.

3
Resim ekleyebilir misin Bu harika olurdu. Kağıdı gözden kaçırdım ve oluşturdukları odalar mimari bir POV'dan güzel görünüyordu.
congusbongus

Çok ilginç bir yöntem, ondan alabileceğim herhangi bir fikir için onu daha yakından incelemek zorunda kalacağım.
Draco18,

Buraya işten rahatlamaya geldim ... Sürpriz bir araştırma konusu çıkıyor. Kendi araştırmamı temel alan bir cevap yazmak için çok tembelim (sadece algoirthm'in çıplak kemiklerini tasarladım, bu yüzden yine de değmez) ya da Danil Nagy'nin soruna yaklaşımlarını açıklıyor, bu yüzden bunu burada bırakacağım. autodeskresearch.com/publications/…
Felipe Gutierrez
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.