एक 2d खेल के लिए चिकनी इलाके उत्पन्न करने के लिए सबसे सरल विधि क्या है?


23

"मून बग्गी" या "रूट 960" जैसे 2 डी गेम के लिए चिकनी इलाके उत्पन्न करने के लिए सबसे सरल तरीका क्या है?

मुझे यादृच्छिक हाइट की एक सरणी उत्पन्न करने और बाद में उन्हें धुंधला करने के बारे में stackoverflow.com पर एक उत्तर मिला। हां, यह काफी ठीक है। लेकिन कुछ अंक देना बेहतर होगा, और एक चिकनी वक्र प्राप्त करना होगा।

जवाबों:


13

एक तरीके से आप इसे प्राप्त कर सकते हैं:

  • एक यादृच्छिक ऊंचाई के साथ, स्क्रीन के बीच में एक बिंदु बनाएं; अब आपके पास दो खंड हैं, इस बिंदु के प्रत्येक पक्ष पर एक
  • प्रत्येक खंड के लिए, इस खंड के मध्य में एक बिंदु को दो भागों में विभाजित करें, (दो भागों के बीच) यादृच्छिक ऊंचाई
  • एन बार दोहराएँ।

क्या होता है दृश्यों में विस्तार से प्रत्येक पुनरावृत्ति के साथ महीन हो जाता है।

आप कैसे सीमा मामलों को संभालते हैं, यह आपके ऊपर है: आप उदाहरण के लिए (0, ऊंचाई / 2) और (चौड़ाई, ऊंचाई / 2) पर अंक ग्रहण कर सकते हैं।

उम्मीद है की यह मदद करेगा!

संपादित करें: यहाँ एक चित्र है जिसे मैंने चित्रण के लिए बनाया है:

terraingen

यह वही विचार है!


12

यह मानते हुए कि आप वास्तव में एक चिकनी इलाका चाहते हैं, मैं सुझाव दूंगा कि वे शोर-आधारित उत्तरों और समझ से पीछे हट जाएँ, जहाँ से वे आते हैं। एक 'शोर' संकेत अनिवार्य रूप से यादृच्छिक आयामों के असीम रूप से कई साइनसोइड का योग है, आवृत्ति एफ के एक फ़ंक्शन द्वारा दिए गए आवृत्ति पर 'औसत' आयाम के साथ । आप इस तरह से अधिकांश आम 'शोर' परिभाषा प्राप्त कर सकते हैं। उदाहरण के लिए, ब्राउनियन गति में 1 / f ^ 2 हैफ़्रीक्वेंसी रिस्पांस (अर्थात किसी दी गई फ़्रीक्वेंसी पर औसत आयाम फ़्रीक्वेंसी के वर्ग के समानुपाती होता है): इसका मतलब है कि पास के बिंदुओं में एक दूसरे के साथ सहसंबंध का एक सा है, क्योंकि सिग्नल के उच्च-आवृत्ति वाले घटक भारी हैं। अवमन्दित। इसके विपरीत, क्लासिक फ्रैक्टल शोर (मिडपॉइंट विस्थापन, पेर्लिन शोर, आदि) में 1 / f आवृत्ति प्रतिक्रिया है; आस-पास के बिंदुओं के बीच अधिक भिन्नता है, लेकिन अभी भी काफी सहसंबंध है। एक कदम आगे जाने पर, सफेद शोर की लगातार आवृत्ति प्रतिक्रिया होती है - किसी भी बिंदु के बीच कोई संबंध नहीं है।

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

  1. [१.१०] श्रेणी में यादृच्छिक पर ४ (वास्तविक) संख्याएँ चुनें - ये आपकी साइन तरंगों की आवृत्तियाँ होंगी। मैंने random.org पर पासा घुमाया और मिला: f 0 = 1.75, f 1 = 2.96, f 2 = 6.23, और f 3 = 8.07। संख्या 4 के बारे में कुछ भी जादुई नहीं है (आप अधिक उपयोग कर सकते हैं, लेकिन किसी भी कम का उपयोग करके व्यक्तिगत साइन तरंगों को और अधिक स्पष्ट करना शुरू हो जाएगा) या यहां की रेंज 1 से 10 (यह सिर्फ यह सुनिश्चित करने का एक तरीका है कि आपका उच्चतम और निम्नतम है आवृत्तियों बहुत दूर नहीं हैं)। यह सीमा में एक आवृत्ति चुनने के लिए समझ में आता है [१.२] और बाकी की सीमा [२.१०] बस इतना है कि आपके पास एक ज्ञात 'प्रमुख' साइनसॉइड है।
  2. इन चार (या हालांकि कई) आवृत्तियों से प्रत्येक के लिए मैं , एक आयाम चुनें एक मैं बीच की सीमा में कहीं च -सी / मैं और सी / च मैं कुछ निरंतर के लिए सी । आपके द्वारा यहां चुना गया मान आपकी तरंग के समग्र आयाम को नियंत्रित करता है - सुविधा के लिए, मैंने C = 1. उठाया । तब मुझे रेंज में यादृच्छिक संख्या की आवश्यकता थी [-1 / 1.75 (= -0.571) .. 1 / 1.75 (= 0.571) ], और इसी तरह [-0.338 .. 0.338], [-0.161 .. 0.161], और [-0.124 .. 0.124] में। चार बार फिर से पासा रोलिंग, मुझे मिल गया एक 0 = -0.143, एक 1 = -0.180, एक 2 = -0.012 है, औरएक 3 = 0.088। (ध्यान दें कि यह शायद नहीं इस कदम करने के लिए काफी सबसे अच्छा तरीका है - के बाद से समारोह की अधिकतम संभव मूल्य (आयाम पेट का योग है एक 0 ) + पेट ( एक 1 ) + पेट ( एक 2 ) + पेट ( एक 3 ), यह आपके चार में से प्रत्येक को विभाजित करने के लिए और अधिक समझ बनाने सकता है एक मैं इस राशि के आधार पर मानों एक बार आप उन्हें बनाने के बाद, और फिर से गुणा हर एक सी ताकि आप सुनिश्चित सटीक अधिकतम समारोह की प्राप्ति कर सकता है हो सकता है कि सी ।)
  3. चार 'ऑफसेट्स' i , प्रत्येक को रेंज [0..2 (] (0..6.28) में ले जाएं - ये आपकी तरंगों के शुरुआती बिंदुओं को मोड़ देंगे, ताकि वे सभी शुरू न हों। 0. मुझे 0 = मिला 1.73, 1 = 4.98, 2 = 3.17, और 3 = 4.63।
  4. 'प्लॉट' समारोह f (x) = एक 0 पाप ( 0 (KX + ओ 0 ) ) + एक 1 पाप ( 0 (KX + ओ 1 ) ) + एक 2 पाप ( 0 (KX + ओ 0 ) ) + एक 3 पाप ( 0 (KX + ओ 0 ) ) - यहां कश्मीर एक और निरंतर, एक है कि नियंत्रण क्षैतिज अपने कार्यों का 'खिंचाव'। आपको यह पता लगाना होगा कि यह आपके अपने आवेदन के लिए क्या है; सुविधा के लिए मैंने अभी कश्मीर को उठाया= 1, और इसलिए मेरा संपूर्ण कार्य f (x) = -0.143 पाप (1.75 ( x + 1.73)) - 0.180 पाप (2.96 ( x +4.98)) - 0.012 पाप (6.23 ( x +3.17)) + 0.088 पाप है (8.07 ( x +4.63))।

यहाँ मेरे उदाहरण रन का परिणाम है, जैसा कि वोल्फ्राम अल्फा में प्लॉट किया गया है - ध्यान दें कि यह प्रदर्शन के उद्देश्यों के लिए इसके रेखांकन के आकार को ठीक करता है, लेकिन यह कि आपके द्वारा उल्लिखित स्थिरांक के माध्यम से परिणाम के क्षैतिज और ऊर्ध्वाधर खिंचाव पर बहुत नियंत्रण होना चाहिए। :

सरल यादृच्छिक साइनसोइड


10

मध्य विस्थापन एल्गोरिथ्म सुंदर 2 डी इलाके उत्पन्न कर सकते हैं।

इलाके का उदाहरण

मध्यबिंदु विस्थापन और @tykel क्या सुझाव दे रहा है, के बीच सूक्ष्म अंतर है। टाइकेल का एल्गोरिथ्म क्षितिज को उपविभाजित करता है और एक नई ऊंचाई चुनता है। यह उन इलाकों का निर्माण करता है जहाँ चोटियाँ समान रूप से फैली हुई हैं। मनुष्य नियमितता को चुनने में महान हैं, इसलिए उत्पन्न क्षेत्र प्राकृतिक नहीं, बल्कि उत्पन्न प्रतीत होगा।

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

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


7

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

मान लीजिए कि आप h0बिंदु पर ऊंचाई और बिंदु पर x0ऊंचाई है । फिर किसी भी बिंदु पर ऊंचाई प्राप्त करने के लिए ( ), आप उपयोग करते हैंh1x1xx0<=x<=x1

t = (x-x0)/(x1-x0); // map to [0,1] range
t = t*t*(3 - 2*t); // map to cubic S-shaped curve
h = h0+t*h1;

इस तरह से प्राप्त ऊँचाई चिकनी, यादृच्छिक होगी, लेकिन वास्तव में दिलचस्प नहीं होगी। अपने इलाके को बेहतर बनाने के लिए, आप भग्न शोर का उपयोग कर सकते हैं । यह इस तरह काम करता है: मान लीजिए आपने एक फ़ंक्शन उत्पन्न किया है h(x)जो किसी दिए गए समन्वय पर ऊंचाई देता है (ऊपर की विधि का उपयोग करके)। इस फ़ंक्शन में एक आवृत्ति होती है, जो मूल अंतराल ऊंचाइयों की आवृत्ति द्वारा निर्धारित होती है। इसमें से एक भग्न बनाने के लिए, आप कई आवृत्तियों के साथ मिलकर कार्य करते हैं:

fbm(x)=h(x) + 0.5*h(2*x) + 0.25*h(4*x) + 0.125*h(8*x);

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

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

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

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


4

इलाके ऊंचाई के नक्शे बनाने के लिए दो लोकप्रिय तरीके हैं।

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


ओपी 2 डी, मारियो-शैली के परिदृश्य के बारे में बात कर रहा है, लेकिन फिर भी ये अच्छे लिंक हैं।
तेनपॉन

1

मेरा विचार एक सुचारू शोर समारोह बनाना होगा। पहले एक विधि intNoise (int) के साथ जो एक "यादृच्छिक" int लौटाता है, लेकिन जो इनपुट पर निर्भर करता है। यदि आप एक ही इनपुट का दो बार उपयोग करते हैं, तो परिणाम समान होगा।

फिर फ़्लोटनोईज़ (फ़्लोट) बनाने के लिए एक स्मूदिंग विधि का उपयोग करें जो यादृच्छिक मान बनाने के लिए इनपुट के चारों ओर दो पूर्णांक का उपयोग करता है।

फिर इनपुट के रूप में X स्थिति और आउटपुट के रूप में Y का उपयोग करें। परिणाम एक चिकनी वक्र होगा लेकिन यादृच्छिक ऊंचाई के साथ।

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