भग्न-आधारित प्रक्रियात्मक शहर लेआउट के लिए एक अच्छा एल्गोरिथ्म क्या है?


19

पृष्ठभूमि

मैं एक मिनीक्राफ्ट सर्वर चलाता हूं, जहां मैं काफी बड़े पैमाने पर एक स्टार्टर सिटी डिजाइन करने जा रहा हूं। मेरे पास चीजों की एक श्रृंखला है, जैसे नियम के संकेत और भीड़ के पिंजरे, मैं वहां इमारतों में रखना चाहूंगा। शहर अपने आप में बहुत बड़ा और फैला हुआ होगा, अधिमानतः 1000 तक 1000 ब्लॉक आकार में होगा।

इमारतों में स्वयं घन या आयताकार पैरों के निशान होंगे जो एक निश्चित आधार क्यूब पर आधारित होते हैं, जैसे 3 ब्लॉक के सभी गुणक। गली के महत्व के आधार पर, इमारतों के बीच की सड़क और दूरी 5-11 ब्लॉक चौड़ी होगी।

जब मैं शहर के लिए योजना शुरू करता हूं, तो मुझे पता चल जाएगा कि मैं चाहता हूं कि इमारतें कितनी बड़ी होंगी और वहां कितनी होंगी।

समस्या

समस्या शहर के लिए लेआउट डिजाइन कर रही है। स्पष्ट रूप से इस तरह के कुछ पैमाने के साथ, और मुझे एक शहरी योजनाकार पृष्ठभूमि के बजाय एक प्रोग्रामिंग पृष्ठभूमि से आ रहा है, यह समस्या के चारों ओर मेरे सिर को लपेटना भी शुरू करना काफी चुनौतीपूर्ण है।

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

प्रश्न

कोड का उपयोग करके मुझे इसे डिज़ाइन करने में सक्षम होने के लिए मैं क्या एल्गोरिदम का पीछा करने में सक्षम हो सकता हूं? मैं सोच रहा था कि अगर मैं किसी तरह फ्रैक्चर का उपयोग करता हूं तो यह सबसे स्वाभाविक लगेगा, क्योंकि मिनीक्राफ्ट पहले से ही अपने इलाके में फ्रैक्टल्स का उपयोग करता है, और एक शहर स्वाभाविक रूप से एक फ्रैक्टल पैटर्न में विकसित होता है।

मुझे लगता है कि यह टेट्रिस प्ले एल्गोरिथ्म के कुछ मायनों में समान है, इसलिए यदि किसी के पास समाधान है जो उस दिशा में नीचे मौजूद है तो यह भी मदद करेगा। मैं कुछ चित्र बना रहा हूं, जहां मैं उन आकृतियों को परिभाषित करने में सक्षम होऊंगा जिनका मैं उपयोग करना चाहता हूं, और सॉफ्टवेयर तब तक पुनरावृत्त करता है जब तक कि यह भवनों के वितरण के लिए सबसे "इष्टतम" समाधान नहीं पाता। क्या कुछ पहले से ही मुझे इस समस्या को हल करने में मदद करने के लिए मौजूद है, अजगर के उपयोग से एक दृश्य तरीके से अधिमानतः?

स्वाभाविक रूप से यह गेम डिजाइन में सामान्य रूप से शहर की पीढ़ी के लिए दिलचस्प प्रभाव है, इसलिए मैं यह देखने के लिए बहुत उत्साहित हूं कि सबसे अच्छा समाधान क्या है।

संपादित करें स्पष्ट होने के लिए, मैं बस इस बिंदु पर लेआउट की तलाश कर रहा हूं क्योंकि इमारतों को डिजाइन किया जाएगा और खेल में बनाया जाएगा।


3
Minecraft भग्न का उपयोग करता है? मैं इस धारणा के तहत था कि यह निरंतर शोर कार्यों (पेर्लिन या सिम्प्लेक्स, मेरा मानना ​​है) का उपयोग करता है।
मार्टिन सोज्का

@ मर्टिन सोजका पेर्लिन शोर वास्तव में एक भग्न है, इसलिए।
बात नहीं

1
@Nevermind: एक भग्न की परिभाषित विशेषता आत्म-समानता है : यदि आप इसका एक हिस्सा चुनते हैं और इसे मूल के आकार में स्केल करते हैं, तो यह "समान" (समान संरचना) होगा। विशेष रूप से, एक भग्न संकेत की आवृत्ति स्पेक्ट्रम पैमाने पर अपरिवर्तनीय है। यदि आप पेर्लिन के शोर के साथ ऐसा करते हैं, तो आपको मिलेगा कि पेर्लिन के शोर का एक छोटा क्षेत्र है; आवृत्ति स्पेक्ट्रम के रूप में अच्छी तरह से बदलाव होगा।
मार्टिन सोजका

@Nevermind Perlin शोर वास्तव में एक भग्न नहीं है, हालांकि ब्राउनियन गति (जो एक ऐसी तकनीक है जो पेरलिन शोर का उपयोग कर सकती है) एक भग्न है और इसे आमतौर पर पर्लिन शोर के रूप में जाना जाता है।
इलावा

हाँ, क्षमा करें, मैं हमेशा लोगों को सही करता हूं जब वे पेर्लिन शोर और गुलाबी शोर को भ्रमित करते हैं, लेकिन यहां मैं खुद वही गलती कर रहा हूं। मेरा एकमात्र बचाव यह है कि Minecraft वास्तव में गुलाबी (ब्राउनियन गति) शोर का उपयोग करता है, IIRC।
कोई बात नहीं

जवाबों:


20

मैंने हाल ही में एक प्रक्रियात्मक शहर लेआउट के लिए एक एल्गोरिथ्म लागू किया है। यह अभी भी बहुत काम की प्रगति पर है, लेकिन मुझे आशाजनक लगता है। जरा देखो तो:

प्रक्रियात्मक शहर उदाहरण

इस लेआउट को बनाने के लिए उपयोग किया जाने वाला एल्गोरिथ्म एल-सिस्टम पर आधारित है । मेरे पास एक आधार Elementवर्ग है, जिसमें एक आयत है जो मानचित्र पर अपनी जगह और एक विधि को चिह्नित करता है Grow, जो Elementsआयत के अंदर अन्य बनाता है , और / या मानचित्र पर कुछ वस्तुओं को पैदा करता है। तो फिर वहाँ वास्तविक तत्व, इस आधार वर्ग से विरासत में मिली हैं: City, Street, Buildingआदि

पीढ़ी कई "बीज" वस्तुओं के साथ शुरू होती है (मेरे मामले में, बस एक Cityतत्व को यादृच्छिक रूप से मानचित्र पर रखा गया है)। तब सिस्टम सभी तत्वों पर कॉल करता है, कॉलिंग Grow, जब तक कि सभी तत्व निष्क्रिय नहीं हो जाते ( Growरिटर्न false), या कुछ बड़ी संख्या में चलना गुजरता है।

चित्र में शहर केवल कुछ सरल नियमों का उपयोग करके बनाया गया है:

  • CityStreetक्षेत्र को कहीं पर विभाजित करने वाला एक तत्व बन जाता है ।
  • सभी Streetएस 0-3 साइड सड़कों पर बढ़ते हैं, आगे क्षेत्र को विभाजित करते हैं।
  • इसके अलावा, Streetलगातार Buildingपक्ष में एक यादृच्छिक आकार फिट करने का प्रयास करें ।

परिणाम बहुत दिलचस्प नहीं है, लेकिन बुरा भी नहीं है। सिस्टम को आसानी से बढ़ाया जा सकता है, और यह समझने के लिए काफी सरल है कि क्या चल रहा है (-8)


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

मुझें यह पसंद है। =) अब pygame में लागू करने के लिए ...
केन

8

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

Googling "प्रक्रियात्मक इमारतें" या "प्रक्रियात्मक शहर" भी आपको विषय पर कुछ अन्य पत्र और लेख देगा।


1

मैं कुछ समय पहले प्रक्रियात्मक शहरों को बनाने के लिए बहुत अच्छे / विस्तृत ट्यूटोरियल में भाग गया था। एक वीडियो है @ http://www.youtube.com/watch?v=-d2-PtK4F6Y ट्यूटोरियल लेखक के ब्लॉग पर है: http://www.shamusyoung.com/twentyseredtale/?p=2940 उम्मीद है कि यह मदद करता है AMB


अगर मैं बाद में शहरों को बनाने का फैसला करता हूं, तो मुझे जो कुछ दिखाई देता है, उससे एक महान ट्यूटोरियल की तरह लगता है। =)
केन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.