2 डी स्क्रीन निर्देशांक और कार्टेशियन निर्देशांक के बीच अंतर से कैसे निपटें


23
  • अधिकांश 2D स्क्रीन / बिटमैप समन्वय प्रणालियों में सकारात्मक Y अक्ष नीचे की ओर इंगित होता है (ऊपरी बाएं कोने में उत्पत्ति के साथ)।
  • इस तरह ज्यादातर लोगों सकारात्मक वाई ओर इशारा करते हुए अक्ष के साथ ज्यामितीय सोचने के लिए काउंटर है अप (केंद्र में मूल के साथ)।

अधिकांश गेम दो अलग 2D समन्वय प्रणालियों का प्रबंधन कैसे करते हैं? निर्देशांक (स्क्रीन बनाम कार्टेशियन) के दो मुख्य प्रकार हैं, लेकिन कई अलग-अलग समन्वय स्थान हो सकते हैं: स्प्राइट स्पेस, वर्ल्ड स्पेस, व्यू स्पेस, स्क्रीन स्पेस, आदि ...

पृष्ठभूमि:

मैंने मूल रूप से दुनिया को अपने गेम मैच में 2 डी स्क्रीन कोऑर्डिनेट कन्वेंशन से मेल किया। इससे ग्राफिक्स ड्राइंग रूटीन का उपयोग करना बहुत स्वाभाविक हो गया, लेकिन एटैन 2 () जैसे त्रिकोणमितीय कार्यों का उपयोग करते समय सूक्ष्म मुद्दे उत्पन्न हुए। Atan2 () 2D स्क्रीन निर्देशांक खिलाने के परिणाम बहुत भ्रामक हैं क्योंकि atan2 () सकारात्मक y अक्ष बिंदुओं को मानता है।

इसलिए मैंने क्लासिक कार्टेशियन कोऑर्डिनेट सिस्टम (स्क्रीन के नीचे बाईं ओर मूल के साथ) का पालन करने के लिए अपनी दुनिया के निर्देशांक बदल दिए। Atan2 के साथ तर्क () बहुत अधिक सीधा है, लेकिन अब अन्य प्रकार के तर्क करना कठिन है:

  • अगर मैं यहां स्क्रीन पर क्लिक करता हूं, तो नीचे क्या स्प्राइट है?
  • मैंने उस स्प्राइट पर कहाँ क्लिक किया?
  • यदि गलत स्थान पर स्प्राइट खींचा जाता है, तो गलत तरीके से क्या गणना की गई थी? स्क्रीन निर्देशांक या दुनिया समन्वय करती है?

मुझे पता है कि स्क्रीन से लेकर कार्टेशियन निर्देशांक तक रूपांतरण में केवल y (-1, y) मानों के वैकल्पिक अनुवाद के साथ y मान को स्केल करना शामिल है। मैं खेल डिजाइन के लिए सर्वोत्तम प्रथाओं में अधिक रुचि रखता हूं:

  • क्या ज्यादातर गेम सिर्फ स्क्रीन समन्वय सम्मेलन से चिपके रहते हैं और उनकी सोच को बदलते हैं कि atan2 () को कैसे काम करना चाहिए?
  • समन्वय प्रणाली रूपांतरण कब / कैसे किए जाते हैं? (मैट्रिस, ओओपी अमूर्त आदि का उपयोग करके)
  • स्प्राइट स्थानों को स्प्राइट के केंद्र या कोनों में से एक के रूप में संग्रहीत किया जाता है? "गलत" दिशा में जाने पर स्प्राइट की ऊँचाई / चौड़ाई एक सामान्य समस्या लगती है जब मैं उन्हें खींचता हूँ।

हालांकि मेरा सवाल मुख्य रूप से 2D गेम्स के बारे में है, ऐसा लगता है कि OpenGL एक समन्वय प्रणाली का उपयोग करता है जहां Y अक्ष इंगित करता है। OpenGL को अंततः उन 3D निर्देशांकों को 2D स्क्रीन समन्वय प्रणाली पर प्रोजेक्ट करना होगा। शायद OpenGL की विधि में कुछ मार्गदर्शन पाया जा सकता है ...

जवाबों:


8

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

"अधिकांश गेम दो अलग 2D समन्वय प्रणालियों का प्रबंधन कैसे करते हैं?"

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

"स्प्राइट स्थानों को स्प्राइट के केंद्र या कोनों में से एक के रूप में संग्रहीत किया जाता है?"

  • यदि आप केंद्र से काम करते हैं तो यह घुमाव को और अधिक सीधा बनाता है, हालांकि आप कोनों को भी जानना चाहेंगे।

"शायद OpenGL की विधि में कुछ मार्गदर्शन मिल सकता है ..."

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

1

मैं यहां चीजों की देखरेख कर सकता हूं, लेकिन मेरा झुकाव किसी भी 2D / UI सबसिस्टम से सख्ती से होगा, जिसे आप "स्क्रीन" निर्देशांक में डब करते हैं। आपके पास दो मैट्रिसेस होंगे: ScreenToCartesianTransform और CartesianToScreenTransform। जब माउस इनपुट ईवेंट प्राप्त होते हैं, तो माउस निर्देशांक 2D / UI सिस्टम के इनपुट मैनेजर के पास होने से पहले CartesianToScreenTransform का उपयोग करके बदल दिया जाएगा। वहां से, UI सिस्टम स्क्रीन कोऑर्डिनेट सिस्टम का उपयोग करके हिट-टेस्टिंग करेगा, और उसी के अनुसार इवेंट को हैंडल (या हैंडल नहीं) करेगा। यदि एक माउस इनपुट ईवेंट 2 डी / यूआई द्वारा अखंडित हो जाता है, तो इसे मूल, अप्रमाणित निर्देशांक का उपयोग करके 3 डी सिस्टम (यदि कोई मौजूद है) पर पारित किया जा सकता है।

चूंकि 2D / UI सिस्टम केवल "स्क्रीन" निर्देशांक में काम करेगा, इसलिए इसकी ज्यामिति को रेंडरिंग इंजन द्वारा संसाधित होने से पहले ScreenToCartesianTransform के माध्यम से बदलना होगा।


दरअसल, आप किस टूलकिट का उपयोग कर रहे हैं, इसके आधार पर, माउस इनपुट ईवेंट पहले से ही स्क्रीन निर्देशांक में हो सकते हैं। उस स्थिति में, आप उन्हें 2D / UI सिस्टम के लिए परिवर्तित नहीं करेंगे, लेकिन आप 3D सिस्टम के लिए (यदि कोई मौजूद है)।
माइक स्ट्रोबेल

0

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

मैं तो बस दुनिया नोड बदलना। अनुवाद (कैमरा पैनिंग) और आनुपातिक स्केलिंग (कैमरा ज़ूमिंग) के साथ-साथ मैं दो अन्य परिवर्तनों को भी लागू करता हूं:

  • समन्वय प्रणाली को फ्लिप करने के लिए -1 y-स्केल।
  • विश्व इकाइयों (मीटर) को स्क्रीन इकाइयों (पिक्सेल) में बदलने के लिए एक स्केलिंग

मैं तब गेम ऑब्जेक्ट ड्राइंग कोड में y-up / world निर्देशांक का उपयोग करता हूं और HUD ड्राइंग कोड में y-down / स्क्रीन निर्देशांक, जो दोनों बहुत स्वाभाविक लगता है।

"मैं किस वस्तु पर क्लिक कर रहा हूं" जैसे सवालों का जवाब देने के लिए, मैं समन्वय प्रणाली (जैसे कि globalToLocalफ्लैश में इसका उलटा) के बीच निर्देशांक बदलने के लिए प्रदर्शन नोड विधियों का उपयोग करता हूं ।

वैसे, atanवास्तव में अलग काम नहीं करता है जब y नीचे होता है, तो आपको काउंटर-क्लॉकवाइज के बजाय सभी कोणों को घड़ी की दिशा में सोचने की आवश्यकता होती है।


0

ओपनएक्सएक्स, डायरेक्टएक्स की तरह, क्षैतिज विमान के साथ एक्स और जेड कुल्हाड़ी है और वाई ऊपर की ओर है।
मेरे पास स्क्रीन के निर्देशांक के साथ कभी कोई समस्या नहीं थी, और मुझे लगता है कि सबसे आसान तरीका यह है कि इसका इलाज कैसे किया जाए: यदि कोई चीज, जैसे कि एटैन 2, यह पसंद नहीं है, तो खिलाए जा रहे मापदंडों को बदल दें।

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

स्प्राइट्स को ऊपर बाएं कोने से या (0,0) मूल से खींचा जाता है। कारण खिड़की के शीर्ष बाएँ मूल के कारण हैं।

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

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