चिकनी वोक्सल टेरेन


13

एक निजी परियोजना के रूप में, मैं एक इलाक़ा जनरेटर बनाने की कोशिश कर रहा हूँ, जो कि इलाके को कैसल स्टोरी के सुगम इलाके जैसा कुछ बना देगा।

यदि आपने इसे यहाँ पहले नहीं देखा है, तो: यहाँ छवि विवरण दर्ज करें

तो जैसा कि आप देख सकते हैं, यह ब्लॉकों और "चिकनी" ब्लॉकों का संयोजन है।

इस लुक का अनुकरण करने के लिए मैंने जो कुछ करने की कोशिश की है, वह प्रत्येक सतह ब्लॉक को एक मिनी ऊंचाई देना है। यह आम तौर पर काम करता है, लेकिन कुछ मुद्दे हैं, इस तरह से एक इलाके की उपज:

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

समस्या यह है कि प्रत्येक ब्लॉक 1x1x1 है, लेकिन कभी-कभी किसी विशेष स्थान पर ऊंचाई नकारात्मक या> 1 है। उस स्थिति में, मैं इसे क्लिप करता हूं और ऊंचाई को 0 या 1 पर सेट करता हूं।

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

ऊंचाई उत्पन्न करने के लिए, मैं मूल रूप से करता हूं:

genColumn(int x, int z)
{
    int highestBlockY = (int)noise2d(x, z);

    bool is_surface = true;

    for(int y = max_height - 1; y >= 0; y--)
    {
        Block b;

        if(is_surface)
        {
            b = Block.Grass;
            b.HasHeightMap = true;

            // generate heightmap
            for(int ix = 0; ix < 5; ix++)
            {
                for(int iz = 0; iz < 5; iz++)
                {
                    float heightHere = noise2d(x + ix / 4, z + iz / 4) - y;

                    // clip heights
                    if(heightHere > 1)
                        heightHere = 1;

                    if(heightHere < 0)
                        heightHere = 0;

                    b.HeightMap[ix][iz] = heightHere;
                }
            }

            is_surface = false;
        }
        else
        {
            b = Block.Dirt;
        }

        setBlock(x, y, z, b);
    }
}

शायद "गलत" पेर्लिन शोर मूल्य का उपयोग करके मैं इसे गलत तरीके से आ रहा हूं?

किसी भी तरह की सहायता का स्वागत किया जाएगा!

जवाबों:


11

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

सबसे पहले, अपने विकल्पों को देखें:

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

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

(२) शायद एक बेहतर विकल्प है; यह है, यह सुनिश्चित करना है कि कोने कोने voxel ग्रिड interstices के लिए तस्वीर। लेकिन फिर हम चरम ढलान मुद्दे को कैसे संबोधित करते हैं? ठीक है, हमें कुछ ढाल चुनने की जरूरत है जहां हम केवल एक ऊर्ध्वाधर स्तंभ पर स्नैप करते हैं और इस तरह यह सुनिश्चित करते हैं कि हमारे पास कोई ग्रेडिएंट नहीं है जो एन टॉपेस्ट वॉक्सल्स के माध्यम से क्रॉस कर सकते हैं। 45 डिग्री का ढाल नीचे बताए गए कारणों से प्राकृतिक कटऑफ है। (3) के बजाय, हमारे पास (4) होगा:

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

(4) निकटतम ग्रिड इंटरस्टाइस के लिए वॉक्सल के कोने के शीर्ष को तड़काना समाधान है। विज़ुअल इफ़ेक्ट - विकर्ण अलियासिंग - आपके कैसल स्टोरी के स्क्रीनशॉट में देखा जा सकता है। स्वरों के लिए कटऑफ ढलान एक 1: 1 ढाल, या 45 डिग्री (जैसा कि ऑर्थोगोनली देखा जाता है) है। समाधान से पीछे की ओर काम करते हैं, आइए देखें कारणों पर:

  • एक ही रास्ता हम एक अखंड, चरम ढलान हो सकता है, अगर एक voxel खड़ी लम्बी थे ...
  • .... लेकिन कोई भी वॉक्सेल की जाली बाउंडिंग एरिया से अधिक नहीं हो सकती है, चाहे वह वास्तविक स्मूद शेप हो; एक voxel को एक 3D ग्रिड में परिभाषित स्थान पर बैठना पड़ता है जो खाता है, यदि यह सटीक रूप के लिए नहीं है, तो कम से कम इसके लिए अक्ष-संरेखित बाउंडिंग बॉक्स है।

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


मैंने बस इसे लागू करने की कोशिश की, और मैं कुछ भ्रम में भाग गया - "अंतरजाल" से आपका क्या मतलब है? आप अभिन्न ग्रिड निर्देशांक मतलब है?
अप्रयुक्त

@ThomasBradworth। "एक अंतरिक्ष जो चीजों के बीच हस्तक्षेप करता है।" 2 डी के लिए, यदि आपके पास कोशिकाओं के ग्रिड की चिंता है, तो आपके पास (n + 1) x (n + 1) इंटरस्टिस होंगे। यह सीधे 3 डी तक फैला हुआ है। वे "कोष्ठक" हैं जो प्रत्येक कोशिका को बांधते हैं, जो ज्यादातर कई कोशिकाओं / स्वरों के बीच साझा किए जाते हैं। यदि आप इसे 1 डी (एक पंक्ति) तक उबालते हैं, तो यदि सेल और इंटरस्टिस दोनों को सरणी के रूप में दर्शाया जाता है, तो सेल 0 को इंटरस्टिस 0 और इंटरस्टिस 1 द्वारा बाध्य किया जाता है, जबकि सेल 1 को इंटरस्टिस 1 और इंटरस्टाइस 2 द्वारा बाध्य किया जाता है ... आदि
इंजीनियर

उत्तर के लिए धन्यवाद! मैंने ठीक वैसा ही करने की कोशिश की, लेकिन मुझे कुछ प्रतिकूल परिणाम मिले। सबसे पहले, मैंने किनारों पर ऊंचाई के मानों को गोल करने की कोशिश की (जब x 0 या 4 है, या z 0 या 4 है), लेकिन मुझे मिला: i.imgur.com/eQW7Y.png ( pastebin.com/LrvvyyHB ) इसके बाद, मैंने बीच के बिंदुओं को चौरसाई करने की कोशिश की, इसलिए मैंने एक "फिक्स हाइट्स फंक्शन" जोड़ा: pastebin.com/AazQ07Xm , हालांकि, इससे मुझे अधिक कोणीय, लेकिन बुरा परिणाम भी मिला : i.imgif.com/q1JVP .Png शायद मेरे शोर समारोह के साथ कुछ गलत है?
अप्रयुक्त

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

क्या आप कह रहे हैं कि मुझे केवल कोनों के लिए ऊंचाई मानों को स्टोर करना चाहिए और "मध्यवर्ती" बिंदुओं की ऊंचाई मूल्यों को स्टोर नहीं करना चाहिए?
अप्रयुक्त
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.