अनन्त इलाकों के लिए प्रक्रियात्मक नदी या सड़क निर्माण


28

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

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

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

मैं पहले से उत्पन्न होने के लिए इलाके की आवश्यकता नहीं चाहता हूं। इसमें एक ऊँचाई शामिल है (जैसे वर्षा सिमुलेशन या समान के लिए उपयोग किया जाता है)। मैं भी एक शुरुआत / अंत बिंदु की आवश्यकता नहीं करना चाहता।

इस तरह के एक एल्गोरिथ्म या एक शोर एल्गोरिथ्म के लिए किसी को पता है कि मैं क्या समझाने की कोशिश कर रहा हूँ पूरा करने के लिए पता हो सकता है?

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

यहाँ 2 डी में मेरे पास अब तक की एक तस्वीर है, लेकिन अधिक विस्तार दिखाने के लिए एक उच्च आवृत्ति पर:

यहाँ छवि विवरण दर्ज करें


चूंकि नदियाँ "प्रवाह" होती हैं इसलिए उत्पत्ति के बिंदु को निर्धारित करने के लिए केवल शोर का उपयोग करके नदियों को निर्धारित करना आसान हो सकता है, इसके बाद पथ को निर्धारित करने के लिए बस अपने कच्चे ऊंचाई के डेटा का उपयोग करें।
वार

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

1
@ user19142 ठीक है, तब डुप्लिकेट नहीं। आपको इस प्रश्न / उत्तर से कुछ उपयोग मिल सकता है: gamedev.stackexchange.com/questions/53400/… और मैं पिछले लिंक को फिर से "संबंधित" gamedev.stackexchange.com/questions/45403/… gamedev के रूप में शामिल करूंगा। stackexchange.com/questions/29044/... gamedev.stackexchange.com/questions/31263/...
MichaelHouse

4
मुझे लगता है कि यदि शोर के साथ सड़कों को बनाया जाए तो यह बहुत विश्वसनीय नहीं होगा। सड़कें भौतिकी और समय के बजाय बुद्धि द्वारा बनाई जाती हैं। हालांकि वे कई बार एक-दूसरे से मिलते-जुलते हैं, वे काफी अलग हैं कि आप दोनों के लिए एक ही एल्गोरिदम का उपयोग नहीं कर सकते हैं।
MichaelHouse

1
उस परियोजना की सड़कें समोच्च लाइनें थीं जो विशिष्ट ऊंचाइयों का अनुसरण करती थीं, इसलिए आप संभवतः उन्हें स्थानीय रूप से उत्पन्न कर सकते थे। इसने वहां काम किया लेकिन ऊंचाई के नक्शे पेरलिन शोर के साथ उत्पन्न नहीं हुए
अमिट

जवाबों:


11

बस मेरा विचार यह संग्रह करने के लिए है कि आप क्या चाहते हैं (बहुत) पूर्वसंक्रमण और अनंत दुनिया के लिए संभावना।

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

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

इस चरण के बाद आप नेटवर्क के माध्यम से पथ खोज सकते हैं जो मान्य हैं।

मान्य रास्तों के लिए अब आप सड़कें बना सकते हैं (उनके पास नुकीले किनारे हैं)।

नोट : आपको सभी नाइट्रोब कोशिकाओं के लिए वोरोनियो आरेख के निर्देशांक भी उत्पन्न करने की आवश्यकता है ताकि आपके पास सेल के किनारों पर सीमाएं न हों।

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

वोरोनोई-डायग्राम के उपयोग के बारे में

सड़क संरचनाओं की तरह शहर को संग्रहित करने के लिए छद्म यादृच्छिक फ़ंक्शन से बिंदुओं को एक ग्रिड पर जोड़ा जा सकता है, इसलिए तरीके आयत के आकार के होते हैं।

सड़कों की तरह अधिक काउंटी के लिए अंक को अधिक अव्यवस्थित होना चाहिए।

विकिपीडिया से आरेख

वोरोनि-डायग्राम के लिए बिंदुओं की स्थिति उत्पन्न करने के लिए छद्म यादृच्छिक फ़ंक्शन के बारे में

यह एक सामान्य यादृच्छिक कार्य हो सकता है या अंक के अधिक समान गैर-clumpy वितरण के लिए एक Hammersley सेट हो सकता है ।


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

नहीं, हैश फंक्शन सेल के लिए एक शुरुआत प्रदान करने के लिए है। X * Prime1 + y * Prime2 + z * Prime3 के रूप में तुच्छ कुछ हो सकता है। जहाँ प्राइम्स एक-दूसरे के लिए असमान हैं और आदर्श रूप से बड़े हैं, आपको यहाँ 64 बिट पूर्णांक / अहस्ताक्षरित के साथ गणना करनी चाहिए। यह एक समस्या नहीं है अगर लिब एक बाउंडिंग बॉक्स का उपयोग करता है, क्योंकि प्रत्येक सेल के लिए आपको बस सेल के सभी बिंदुओं और पड़ोस की कोशिकाओं के सभी बिंदुओं (जो कि 8 पड़ोस कोशिकाएं हैं) को पूरा करना होगा।
क्वांक्स

यदि आप एकल सटीकता का उपयोग करते हैं या यदि आप एकल प्रीस्केशन का उपयोग करते हैं, तो आप संभवतः एकल परिशुद्धता के साथ सटीक मुद्दों में भाग लेंगे। समस्या को दरकिनार करने के लिए अगर लिब सिर्फ एकल परिशुद्धता का उपयोग करता है और आप निम्नानुसार नहीं करते हैं: पदों को एकल परिशुद्धता में परिवर्तित करने से पहले उनसे केंद्र सेल की वैश्विक स्थिति को घटाएं, फिर इसे लिबास में तैरते हुए डालें, फिर रूपांतरण करें परिणाम वापस।
क्वांक्स

मैंने वास्तव में इस एल्गोरिथ्म को कभी लागू नहीं किया है, लेकिन हैश फ़ंक्शन वास्तव में एक तुच्छ हो सकता है।
क्वांक्स

8

सड़क (और शहर) निर्माण के लिए, सबसे अच्छा कागज जो मैंने पाया है वह यह है:

वाई पैरिश और पी मुलर द्वारा शहरों की प्रक्रियात्मक मॉडलिंग

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


+1 सिर्फ इसलिए कि मुझे पेपर पसंद आया। वास्तव में फिट नहीं था कि कैसे मैं सड़कों / रास्तों / नदियों को उत्पन्न करने का प्रयास करना चाहता / चाहती हूं, जो गतिशील रूप से इलाके का निर्माण कर रहे हैं।
मिथक १२

6

http://vterrain.org/Culture/Roads/ सेक्शन "जनरेटिंग 3D रोड्स" में रोड जनरेशन की कुछ जानकारी है

सड़कों के साथ समस्या यह है कि वे स्थलों को जोड़ते हैं (हालांकि वे अक्सर ए से बी तक जाने के बजाय इलाके का अनुसरण करते हैं )।

व्यक्तिगत रूप से, मैं इलाक़ा उत्पन्न करूंगा, फिर नदियों को स्थान दूंगा (शायद कटाव का उपयोग करके, http://vterrain.org/Water/ खंड "जल विज्ञान"), फिर शहरों को उन स्थानों पर रखें जहाँ यह समझ में आता है (जैसे नदी या अन्य के पास) पानी का स्रोत, या ऐसी जगह जहां पानी को एक्वाडक्ट्स या पानी के टावरों और पाइपों का उपयोग करने के लिए ले जाया जा सकता है) और अंत में शहरों के लिए सड़कों का निर्माण करें।

एक प्रक्रियात्मक दुनिया में उपयोग करने के लिए इसे और अधिक आसान बनाने के लिए, आप इलाके पर मध्यवर्ती बिंदु बना सकते हैं, जहां सड़कों को उस स्थान पर उत्पन्न होने पर सबसे अधिक संभावना होगी, फिर मध्यवर्ती बिंदुओं को कनेक्ट करें यदि उस स्थान पर वास्तव में एक सड़क बनाई गई है।


4

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

यह स्पष्ट लग सकता है, लेकिन विभिन्न प्रकार के इलाकों और सड़कों पर Google मानचित्र देखें; आपको इस बात की बेहतर जानकारी होगी कि उन्हें कैसा दिखना चाहिए।


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