सिटी स्ट्रीट नेटवर्क कैसे उत्पन्न करें?


16

मैं एक खेल के लिए एक शहर जनरेटर बनाना चाहूंगा, लेकिन मैं पीढ़ी के शुरू में एक समस्या का सामना कर रहा हूं: सड़क प्रणाली।

जैसा कि यह एक मध्ययुगीन दुनिया है, मुझे कई आधुनिक शहरों की तरह ग्रिड योजना नहीं चाहिए । मैं आदर्श रूप से बड़े रास्ते और छोटी सड़कों की छद्म यादृच्छिक पीढ़ी को पसंद करूंगा, जहां खो जाना संभव हो सकता है, लेकिन अभी भी कुछ तर्क के साथ - एक पूर्ण भूलभुलैया नहीं।
कुछ ऐसा जो प्राकृतिक रूप से उगा हुआ शहर जैसा दिखेगा।

इसे सरल बनाए रखने के लिए, मान लें कि मेरे शहर सपाट और स्थिर इलाकों में होंगे, बिना किसी नदी-पार या राहत की समस्याओं के। मैं इसे एक समाधान के बाद एकीकृत करने की कोशिश कर सकता था।

मैंने अपने शहरों के लिए एक सटीक आकार या स्वभाव का फैसला नहीं किया है, इसलिए यदि आपके पास एक समाधान है जो केवल सटीक रूप (वर्ग, सर्कल, आयत आदि) के शहरों के साथ काम करेगा, तो मैं इसे ले जाऊंगा।


2
आप इंट्रोवर्सन सॉफ्टवेयर द्वारा प्रक्रियात्मक शहर जनरेटर को देखना चाहते हैं जो उन्होंने तोड़फोड़ के लिए बनाया था। जबकि खेल ही रद्द हो गया, उनके जनरेटर से आसपास बहुत सारे फुटेज हैं।
फिलीपींस

क्या आपके पास एक उदाहरण है जो आप चाहते हैं (आपके लक्षित समय अवधि से वास्तविक जीवन उदाहरण, दूसरे खेल, स्केच, आदि से उदाहरण)? 'एक ग्रिड नहीं' और 'एक पूर्ण भूलभुलैया नहीं' के बीच बहुत सारे विकल्प हैं।
पिकालेक

@Pikalek मैं अधिक सटीकता नहीं देता क्योंकि मेरे पास यह नहीं है। मैं किसी बहुत विशिष्ट चीज की तलाश नहीं कर रहा हूं, पीढ़ी का कोई भी उदाहरण जो न तो भूलभुलैया पैदा करता है और न ही ग्रिड योजना मुझे संतुष्ट कर सकती है।
अव्यय

जवाबों:


21

प्रक्रियात्मक शहर पीढ़ी के साथ शुरू करने के लिए एक अच्छी जगह पारिश और मुलर की शहरों की प्रक्रियात्मक मॉडलिंग है । उनका पेपर एक एल-सिस्टम प्रस्तुत करता है जिसमें जनसंख्या घनत्व और सड़क के पैटर्न (आयताकार ग्रिड, रेडियल और कम से कम ऊंचाई परिवर्तन) से संबंधित नियम संयुक्त होते हैं और फिर स्थानीय बाधाओं जैसे कि पानी के मोर्चों और सड़क सौंदर्यशास्त्र को समायोजित करने के लिए तय किए जाते हैं। जबकि इस प्रणाली के परिणाम प्रभावशाली हैं, इसकी अनावश्यक रूप से जटिल होने के रूप में आलोचना की गई है । रुडज़िक के स्पेयर पार्ट्स देव ब्लॉग में बैरेट का वैकल्पिक समाधान इस प्रकार है:

  • "प्रस्तावित" सड़कों की एक सूची बनाए रखें
  • किसी क्रम में उनका मूल्यांकन करें
  • यदि वे स्वीकार्य हैं (कुछ मामूली संशोधनों के साथ या बिना)
  • प्रत्येक प्रस्तावित सड़क को "प्रस्तावित" करते समय उसमें से एक मुट्ठी भर ब्रांच स्टोर करें

यह दृष्टिकोण पारिश और म्यूलर के एल-सिस्टम में विरासत में लिखे गए हाउसकीपिंग के अधिकांश प्रतीक को हटा देता है। आप इस दृष्टिकोण का डेमो यहाँ देख सकते हैं ।

इस दृष्टिकोण का एक लाभ यह है कि यह शहर के आकार का अज्ञेय है - आप आवश्यकतानुसार रूपरेखा बाधाओं को जोड़ सकते हैं, इसलिए आपके शहर का आकार एल्गोरिदम के बजाय आपके गेम डिज़ाइन की आवश्यकताओं द्वारा निर्धारित किया जा सकता है। आपके शहर के आकार के आधार पर, यह काफी अच्छा हो सकता है। यहां 100 सेगमेंट की सीमा के साथ उपरोक्त डेमो का परिणाम है: यहाँ छवि विवरण दर्ज करें लेकिन अगर आपको कुछ बड़ा चाहिए, तो आपको परेशानी हो सकती है; यहाँ 500 की एक खंड सीमा के साथ परिणाम है: यहाँ छवि विवरण दर्ज करें

भाग में, आप सड़क की शाखाओं के नियमों को बदलकर, 90 डिग्री के कोणों से बचकर, आदि को समायोजित कर सकते हैं, यदि आपका लेआउट अभी भी नियमित है, तो यहां मेरा सुधार है:

अपने शहर के ग्रिड को एक ग्राफ में बदलना जहां प्रत्येक गली एक किनारे है और प्रत्येक चौराहा एक नोड है। अगला, ग्राफ़ को एक भूलभुलैया में बदलने के लिए आप जो भी एल्गोरिथ्म पसंद करते हैं उसका उपयोग करें । यहाँ आखिरी उदाहरण एक भूलभुलैया में बदल गया है: यहाँ छवि विवरण दर्ज करें

अब आउटपुट में विपरीत समस्या है, यह बहुत भूलभुलैया की तरह है। लेकिन अब हम जैमिस बक के डंगऑन जनरेटर के सीक्रेट वर्किंग से कुछ तकनीकों को लागू कर सकते हैं । सबसे पहले, कुछ मृत अंत गलियारों को हटाकर स्पार्सनेस बढ़ाएं। इसके बाद, उन सड़कों को जोड़कर कनेक्टिविटी बढ़ाएं जो लूप बनाती हैं (यानी ग्राफ से चक्र का परिचय)। यहाँ एक उदाहरण परिणाम है: यहाँ छवि विवरण दर्ज करें

नोट: यह संभव है कि पहले ग्रिड उन्मुख लेआउट चरण (भूलभुलैया उत्पन्न करने से पहले) से सीधे एक ही अंतिम परिणाम प्राप्त किया जाए, केवल शहर के ग्रिड पर किनारे हटाने को लागू करें। उस दृष्टिकोण के साथ समस्या यह है कि आप यह सुनिश्चित करें कि एक किनारे को हटा दिया जाए जिससे शहर का विभाजन न हो सके जिससे भाग अप्राप्य हो।


6

यदि आप Google पर मध्ययुगीन / पुराने शहर की योजनाओं की तलाश करते हैं, तो आपको कई अलग-अलग विविधताएँ मिलेंगी, जो ज्यादातर शहर की उत्पत्ति (जैसे यादृच्छिक निपटान बनाम संगठित सामाजिक घटना) पर आधारित हैं।

मुझे लगता है कि आप अधिक स्वाभाविक रूप से विकसित / अराजक निपटान के लिए देख रहे हैं।

इनके लिए मैं इस तरह एक दृष्टिकोण की कोशिश करूँगा:

  • एक मुख्य सड़क से शुरू करके एक छोर से दूसरे छोर तक जाएं (और आदर्श रूप से कुछ अन्य बस्तियों को जोड़ने के लिए। यदि आप चाहें, तो एक तीसरी सड़क बनाएं ताकि आपको एक जंक्शन मिल जाए, जिस पर अपना निपटान शुरू करना है।
  • कुछ घरों को सड़क के किनारे रखें (केवल एक तरफ)।
  • अब उस सड़क को घरों के साथ चौड़ा करें और दूसरी तरफ एक प्रमुख मील का पत्थर जोड़ें (आमतौर पर एक चर्च, लेकिन यह भी कुछ मिल या समान हो सकता है)। यह आपका केंद्र / बाज़ार हो सकता है।
  • अब घरों के साथ क्षेत्र के बाहर दो स्थान चुनें और घरों को घेरते हुए एक नई सड़क बनाएं।
  • वैकल्पिक रूप से पुराने और नई सड़क को जोड़ने वाले घरों के बीच कुछ छोटे सहयोगी बनाएं।
  • अब दोहराएं जब तक आप अपने "कोर" से खुश न हों:
    • कुछ और घर जोड़ें।
    • उन्हें घेरते हुए एक और सड़क जोड़ें।
    • सड़कों को जोड़ने वाली गली वापस जोड़ें।
  • एक बार जब आप इसके साथ खुश हो जाते हैं, तो आप कर लेते हैं। यदि यह एक शहर माना जाता है, तो इसे दीवारों के साथ घेर लें और दीवारों के बाहर अतिरिक्त घरों को जोड़ते हुए अंतिम चरणों को कुछ और बार दोहराएं।

3

सबसे पहले, प्रक्रियात्मक पीढ़ी को करने के तरीकों के बारे में पता चलता है और उनमें से कोई भी आसान नहीं है, मैं इस तरह का दृष्टिकोण बनाऊंगा कि आप इसे कैसे काम कर सकते हैं, यह आपके ऊपर है कि आप इसे ले जाएं, इसे संशोधित करें या इसे छोड़ दें।

जेएस में छद्म कोड होगा क्योंकि इसे समझना आसान है।

1, एक प्रवेश बिंदु को परिभाषित करें, जैसा कि आप एक मध्ययुगीन शहर का निर्माण करना चाहते हैं, जिसे हम एक वर्ग के साथ शुरू करने वाले हैं, जिससे आप कह सकते हैं कि आपके शहर में 300 वर्ग इकाइयां होंगी और वर्ग इसके बीच में होगा (एक्स के साथ प्रतिनिधित्व)।

       300
________________
|               |
|               |
|               | 300
|       X       |
|               |
|               |
|_______________|

const square = [ 150, 150 ];

2 अब हम रास्ते बदलेंगे, उनमें से एक यादृच्छिक संख्या होगी, वे सीधे होंगे और मध्य वर्ग से या अन्य रास्ते से शुरू होंगे

let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square

for av in av_from_square
  avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
  // we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size

यह आपको एक वर्ग और युगल मुख्य सड़कों देना चाहिए

       300
________________
|   \\          |
|    \\         |
|     \\        | 300
|       X=====  |
|               |
|               |
|_______________|

अब हमें उन रास्तों को निर्धारित करना होगा जो मुख्य वर्ग में शुरू नहीं होते हैं, वे अन्य राशियों को पार करेंगे

for av in (n_avenues - av_from_square){
  const av_to_intersect = avenues[RANDOM(0,avenues.length)];

  //check av_to... and get a perpendicular vector (explained bellow)
  av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
  av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];

}

लंबवत वैक्टर पाने के लिए आपको x, y डोरियों को स्वैप करना होगा और नए y को नकारना होगा:

swiped == x: noswiped.y, y: -1 * (noswiped.x)

अभी आपके पास ऐसा ही कुछ होना चाहिए, यह शहर जैसा नहीं दिखता? : पी

       300
________________
|   \\  //      |
|    \\//  ||   |
|     \\   ||   | 300
|    //\X=====  |
|   //     ||   |
|          ||   |
|_______________|

3 अब आपको केवल छोटी गलियों वाले रास्ते को आपस में जोड़ना है, साथ ही, आप पूरे शहर में बेतरतीब चौराहों पर जा सकते हैं और उन सभी के लिए ऊपर के समान बना सकते हैं, या बस कुछ सेकेंडरी चौकों से छोटी सड़कों को खोल सकते हैं, यह आपके ऊपर है।

याद रखें, आपकी सड़कें सबसे छोटी हैं, शहर जितना अराजक दिखता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.