एक छद्म 3 डी ग्लोब प्लॉटिंग

Sep 06 2020

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

मैं रेकास्टिंग से परिचित हूं, जिसका उपयोग वुल्फेनस्टीन और अन्य खेलों में 2 डी मानचित्र में 3 डी परिप्रेक्ष्य "अनुकरण" करने के लिए किया जाता है।

लेकिन मैं यह नहीं समझ सका कि ग्लोब चीज़ को कैसे प्रोग्राम किया जाए, और मुझे लगता है कि यह असली 3 डी रेंडरिंग नहीं था, क्योंकि सोनिक 16 बिट गेम था।

किसी भी परिष्कृत 3 डी इंजन के बिना यह कैसे करना है पर कोई विचार?

जवाब

1 Engineer Sep 06 2020 at 15:22

अवलोकन

  • 2x 2D विमानों के एक अंतहीन 1D ट्रैक की स्थापना करें। जैसे-जैसे आप आगे बढ़ते हैं, आपके पीछे चलने वाला विमान आपको दौड़ते रहने के लिए आगे आता है; यह बार-बार होता रहता है कि आप आगे या पीछे भागते हैं।
  • अब यही काम 2D में भी करते हैं यानी 2x2 2D विमानों के साथ। आप जहां भी जाते हैं, दुनिया आपके पैरों के नीचे चलती रहती है।
  • विमानों को एक परिप्रेक्ष्य दृश्य में बदलना।
  • अब स्क्रीन स्पेस ट्रांसफ़ॉर्मेशन के माध्यम से एक गोलाकार उभार प्रभाव पैदा करें अर्थात सभी ग्राउंड पिक्सेल को समायोजित करके उन्हें घुमावदार दिखाई दें, भले ही यह वास्तव में सपाट हो, सतह को दोहराता है।
  • यहां तक ​​कि जब चरित्र कुछ फ़्रेमों पर 90 डिग्री घूमता है , तब भी यह वही घुमावदार-विश्व प्रभाव दिखाता है।

3 डी प्लान 2 डी में

मान लेते हैं कि आपके पास 2x2 फ्लैट प्लेन हैं, जो आपकी स्क्रीन पर वर्गों के रूप में प्रस्तुत हैं (ऊपर नीचे देखा गया है), और आप ऊपर बताए अनुसार उन्हें घुमा सकते हैं।

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

यह 2 चरणों में किया जाता है:

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

ये दोनों चरण उस पर निर्भर हैं जहां खिलाड़ी वर्तमान में खड़ा है।

वक्रता

पिक्सेल के परिवर्तन के लिए अर्धवृत्त सूत्र की आवश्यकता होती है, जो उभार प्रभाव को प्राप्त करने के लिए स्क्रीन y के साथ विस्थापित किया जाएगा। यह हिस्सा आपके शोध के लिए छोड़ दिया गया है।

semicircleDisplace(xCurrent)
{
    
    //formula to calculate maximal (horizon) yDisplacement from xCurrent
    //...
    
    return yDisplacement;
}

pixels[xCurrent][yCurrent].y += semicircleDisplace(xCurrent);

इसके साथ समस्या यह है कि हम सभी पिक्सेल को स्क्रीन के निचले भाग के पास उतना ही ऊपर उठाते हैं, जितना कि शीर्ष के पास, एक प्रकार का उल्टा U इलाक़ा दिखता है, जब हम वास्तव में सबसे नीचे चाहते हैं स्क्रीन लगभग सीधी रेखा है; बीच में, कुछ विस्थापन / उभार; और क्षितिज पर, अधिकतम विस्थापन। हम एक (संभवतः रैखिक) प्रक्षेपित कारक का उपयोग करके इसे प्राप्त करते हैं:

semicircleDisplace(xCurrent, yCurrent)
{
    
    //formula to calculate maximal (horizon) yDisplacement from xCurrent
    //...

    //linear interpolation based on where we are between bottom of screen and horizon
    yRange  = yMax - yMin
    yRatio  = yCurrent - yMin
    yFactor = yRatio / yRange

    return yDisplacement * yFactor;

}
pixels[xCurrent][yCurrent].y += semicircleDisplace(xCurrent, yCurrent);

yFactorके बीच कोई मान है 0.0और 1.0आप गुणा है जिसके द्वारा yDisplacement। यदि रैखिक प्रक्षेप (जो सस्ता है) एक शानदार रूप नहीं देता है, तो आप सही प्रकार के ग्राउंड वक्रता को प्राप्त करने के लिए गैर-रेखीय प्रक्षेपों के साथ खेल सकते हैं। लेकिन मेरा अनुमान रैखिक है बस ठीक लगेगा।