विशाल प्रक्रियात्मक रूप से 'जंगल' दुनिया में उत्पन्न हुए


76

मुझे यकीन है कि आप सभी बौने किले जैसे खेलों के बारे में जानते हैं - बड़े पैमाने पर, प्रक्रियात्मक उत्पन्न जंगल और जमीन। कुछ ऐसा ही, इस बेहद उपयोगी लेख से लिया गया है

हालांकि, मैं सोच रहा था कि मैं इसे और अधिक बड़े पैमाने पर कैसे लागू कर सकता हूं; Minecraft का पैमाना दिमाग में आता है (क्या यह 8x पृथ्वी की सतह के आकार जैसा कुछ नहीं है?)। छद्म अनंत, मुझे लगता है कि सबसे अच्छा शब्द होगा।

: डी

लेख फ्रैक्टल पर्लिन शोर के बारे में बात करता है। मैं इस पर एक विशेषज्ञ नहीं हूं, लेकिन मुझे सामान्य विचार मिलता है (यह कुछ प्रकार का यादृच्छिक रूप से उत्पन्न शोर है जो अर्ध-सुसंगत है, इसलिए केवल यादृच्छिक पिक्सेल मान नहीं है)।

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

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

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


9
"बस भारी मात्रा में द्वीपों में परिणाम होगा" - या यह इसमें झीलों के साथ भूमि उत्पन्न करता है, अगर आप बस भूमि / पानी स्वैप करते हैं।

3
फिर भी, आपको काफी मानक पैटर्न में, झीलों की एक बड़ी मात्रा मिलेगी।
कम्युनिस्ट डक

3
@ कियलोतन: मिन्स्कटन आकार में अनंत है (अच्छी तरह से वास्तव में नहीं है, लेकिन यह वास्तव में बहुत बड़ा है ... कुल मात्रा = लंबी। मैक्सवेल x 128 x लंबी। मैक्सवेल)। इसलिए, यह पूरी दुनिया को एक शॉट में उत्पन्न नहीं करता है और न ही यह पूरे मानचित्र को मेमोरी में संग्रहीत करता है। यह 16x128x16 ब्लॉक के क्षेत्रों को असिंक्रोनस रूप से उत्पन्न करता है अगर उन्हें डिस्क से लोड नहीं किया गया है, तो इससे पहले कि उनका दौरा नहीं किया गया है।
zfedoran

2
@ द कम्युनिस्ट डक: हाँ यह सच है, मिनीक्राफ्ट जैसा गेम प्रति ब्लॉक लगभग 2 से 4 बाइट डेटा का उपयोग करके दूर हो सकता है लेकिन केवल बाइट को बचाने की आवश्यकता है क्योंकि यह अब दिखाई नहीं देता है (एक बाइट ब्लॉक के प्रकार का वर्णन करता है। , अन्य बाइट्स प्रकाश और अन्य डेटा का वर्णन करते हैं जिन्हें बाद में पुनर्गणना किया जा सकता है)। यह वह जगह है जहां यह दिलचस्प हो जाता है, आप RLE का उपयोग केवल कुछ बाइट्स में संग्रहीत आकार को बहुत कम करने के लिए कर सकते हैं क्योंकि ब्लॉक कुछ हद तक सुसंगत हैं, जैसा कि आपने उल्लेख किया है।
zfedoran

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

जवाबों:


35

मुझे लगता है कि मैं बेहतर समझता हूं कि आप अब क्या पूछ रहे हैं।

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

यहाँ एक सरल उदाहरण है, ऊँचाई पीढ़ी के लिए पेरिनल शोर के बजाय साइन का उपयोग करना, और दुनिया की कल्पना करना एक्स अक्ष में अनंत है, लेकिन वाई और जेड अक्ष में केवल 1 यूनिट ऊंचा है।

सूत्र है: height(x,y) = sin(x/20)

खेल शुरू होता है, और हम पास के क्षेत्र के लिए हाइट्स उत्पन्न करते हैं, अर्थात। (0,0) से (9,0):

[0.0, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.34, 0.39, 0.43]

हमारे पास एक पहाड़ी है, जो दाईं ओर बढ़ती है। मान लीजिए कि हम इसके अंत तक चलते हैं और अब (10,0 से 19,0) मान उत्पन्न करने की आवश्यकता है:

[0.48, 0.52, 0.56, 0.61, 0.64, 0.68, 0.72, 0.75, 0.78, 0.81]

ध्यान दें कि पहाड़ी कैसे लगातार बढ़ती रहती है, और यह कि (10,0) मान एक (9,0) से अच्छी तरह से चलता है। ऐसा इसलिए है क्योंकि साइन फ़ंक्शन निरंतर है, जिसका मूल अर्थ है कि यदि आप इसे 2 आसन्न संख्याओं में फीड करते हैं, तो आपको आसन्न परिणाम की एक निश्चित परिभाषा के लिए 2 आसन्न परिणाम प्राप्त होंगे। इसलिए यदि आप अपनी दुनिया के निर्देशांक का उपयोग उस फ़ंक्शन के मापदंडों के रूप में करते हैं जो आपकी दुनिया को परिभाषित करता है, तो आपको एक निरंतर परिदृश्य मिलेगा जो एक साथ फिट बैठता है चाहे आप एक बार में कितना या कम उत्पन्न करें। जब आप नए भागों को उत्पन्न करते हैं, तो वे मौजूदा भागों से स्वचालित रूप से प्रवाहित होंगे, क्योंकि ऊंचाइयां पहले से निर्धारित हैं।

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

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


आपने निश्चित रूप से चीजों को साफ करने में मदद की है, धन्यवाद। :) लेकिन एक शोर समारोह की तरह कुछ निरंतर नहीं होगा। और AFAICS, अगर यह निरंतर है तो मुझे 'यादृच्छिक' दुनिया नहीं मिलेगी। या मुझसे यहां कुछ छूट रहा है?
कम्युनिस्ट डक

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

ठीक है, आपकी शोर पीढ़ी निश्चित रूप से निरंतर हो सकती है, और आमतौर पर है, क्योंकि आप इसे सुचारू करते हैं। सीमाओं के पार सुचारू करने के लिए आपको सीमा के पार थोड़ा पढ़ना पड़ सकता है, लेकिन सिद्धांत वही है। यदि प्रश्न में शोर को छद्म यादृच्छिक डेटा की आवश्यकता है, तो आप ज्ञात मात्रा से उत्पन्न करते हैं - अर्थात। आपकी दुनिया का एक हैश समन्वय करता है। तब आउटपुट प्रेडिक्टेबल होते हैं।
काइलोटन

2
यादृच्छिकता के लिए, प्रत्येक दुनिया का अपना बीज मूल्य हो सकता है जो गणना में उपयोग किया जाता है। जैसे। पाप (x + बीज) पाप के बजाय (x), ऊपर मेरे उदाहरण में। प्रत्येक अलग बीज एक अलग दुनिया उत्पन्न करेगा। और विशाल पत्रक के बारे में ... मुझे यकीन नहीं है कि इसकी क्या प्रासंगिकता है। इससे कोई फर्क नहीं पड़ता कि आप कितना या कितना कम उत्पन्न करते हैं या जब आप ऐसा करते हैं। दुनिया का प्रारंभिक राज्य गणितीय सूत्र द्वारा परिभाषित किया गया है, और आप बस उस सूत्र का उपयोग उस स्थिति को खोजने के लिए करते हैं जब आपको इसकी आवश्यकता होती है।
काइलोटन

32

यह ट्यूटोरियल मैंने सालों पहले लिखा था कि आप जैसा चाहते हैं वैसा आपको कुछ दे सकते हैं:

वैकल्पिक शब्द

यदि आप अंतिम चरण में द्वीप संशोधन करते हैं, तो यह एक एकल लैंडमास की ओर जाता है जो मानचित्र के किनारे तक नहीं पहुंचता है।


7
महान दृश्य!
zfedoran

3
मुझे याद है कि प्राकृतिक घटनाओं के अनुकरण पर मेरे परास्नातक शोध प्रबंध करते समय इस ट्यूटोरियल का उपयोग करना। मैंने अपने 3D दुनिया पर आकाश गुंबद बनाने के लिए "पहाड़ी" उदाहरण का उपयोग किया। इलाके की पीढ़ी की अवधारणा का उत्कृष्ट परिचय।
C.McAtackney

1
पागल, यह कमाल है! मुझे नहीं पता था कि किसी ने कभी इसका इस्तेमाल किया है।
उदार

1
हे भगवान !!! मैं यह भी एक पिछले परियोजना में इस्तेमाल किया ... मैं कभी भर में आया है कि इलाके उत्पन्न करने के लिए सबसे आसान तरीका है !!!
युद्ध

15

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

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

पहला सप्तक विवरण

इस लेख में मदद करनी चाहिए: http://freespace.virgin.net/hugo.elias/models/m_perg.nm

यदि आप अनंत 3 डी दुनिया के बारे में और विभिन्न ट्रिक्स के बारे में सीखना चाहते हैं, तो आप शोर इनपुट और आउटपुट के माध्यम से इलाके की उपस्थिति को बदलने के लिए उपयोग कर सकते हैं, इस लेख पर एक नज़र डालें: http://http.developer.nvidia.com /GPUGems3/gpugems3_ch01.html

यदि आप ग्राफिक्स पाइपलाइन और शेडर प्रोग्रामिंग से परिचित नहीं हैं, तो यह थोड़ा मुश्किल हो सकता है।


जिस तरह का प्रभाव मैं हासिल करना चाहता हूं, वह Minecraft के नक्शे (खेल नहीं) के 2d टॉप डाउन की तरह है ... अगर मैंने सिर्फ कम ऑक्टेव्स का इस्तेमाल किया है, तो क्या मुझे अभी भी भारी मात्रा में पर्लिन शोर की चादर नहीं पैदा करनी होगी? या मैं किसी तरह सिर्फ एक बहुत, बहुत कम राशि उत्पन्न कर सकता है?
कम्युनिस्ट डक

मुझे लगता है कि आप अभी भी थोड़ा भ्रमित हो सकते हैं कि कैसे पर्लिन शोर काम करता है। आप x और y फ़ंक्शन को perlin शोर के लिए निर्देशांक भेजकर 16x16 खंडों के अलग-अलग भाग उत्पन्न कर सकते हैं। ध्यान दें कि कैसे x और y समन्वय में PerlinNoise_2D (फ्लोट एक्स, फ्लोट वाई) फ़ंक्शन लेता है। दूसरे शब्दों में यह कुछ (x, y) स्थिति के लिए शोर उत्पन्न करता है। इसके अलावा, कम अष्टक उत्पन्न करना सप्तक की तरंग दैर्ध्य को बदलने के समान नहीं है। कम सप्तक => कम बारीक अनाज का विस्तार। लंबा तरंग दैर्ध्य => अधिक ज़ूम इन किया।
zfedoran

इसके अलावा, यहाँ एक कोड है जो आपको जूम / लंबे वेवलेंथ को लागू करने का तरीका दिखाता है: dreamincode.net/forums/topic/66480-perlin-noise
zfedoran


7

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

मेरे द्वारा देखे गए गेमों में "कूल पार्टिकल डिपोजिशन" लेख में वर्णित बहुत बढ़िया समाधानों में से एक है। 7. इंटरनेट पर बहुत से अन्य उपलब्ध हैं, इसलिए बहुत सारे संसाधन उपलब्ध हैं (जैसे 1 या 2 ) ।

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