ओपनजीएल: डिस्प्ले और ग्लोरोथो / ग्लोवपोर्ट का आकार बदलना


16

मैंने कई स्रोतों से इस सवाल पर शोध किया है और अभी तक यह कहते हुए कोई ठोस जवाब नहीं पाया है कि "हाँ यह सही सोच है" या "नहीं, यहाँ ऐसा कैसे किया गया है।"

मैं ओपनजीएल प्रतिपादन के साथ संकल्प स्वतंत्रता सुनिश्चित करने की कोशिश कर रहा हूं। जिस तरह से मुझे लगता है कि मुझे इसके बारे में जाना चाहिए, यह है कि मैं glOrthoदुनिया के निर्देशांक के लिए जो कुछ भी चाहता हूं, उसके साथ एक प्रक्षेपण बनाना है। उदाहरण के लिए, glOrtho(-50.0, 50.0, -50.0, 50.0, 1.0, -1.0)। इसके बाद, व्यूपोर्ट को स्क्रीन रिज़ॉल्यूशन पर सेट करें , अर्थात - glViewport(0, 0, 800, 600)। अंत में, जब भी विंडो री-साइज़ हो, glViewportअपडेटेड स्क्रीन रिज़ॉल्यूशन के साथ कॉल करें । यह आपके आंकड़े को मापेगा।

क्या यह सुनिश्चित करने का सही तरीका है कि मॉडल विभिन्न प्रस्तावों पर स्क्रीन-स्पेस का समान अनुपात लेते हैं? क्या मुझे संकल्प के बराबर एक प्रक्षेपण का उपयोग करना चाहिए? मुझे कुछ उत्तर मिले, जिसमें कहा गया था कि आपको glOrthoअपनी विंडो के रिज़ॉल्यूशन का उपयोग करना चाहिए जबकि अन्य ने कहा कि यह अलग होना चाहिए।

विचार?

जवाबों:


20

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

हालांकि, यदि आप इससे अधिक कुछ नहीं करते हैं, तो आपको पहलू अनुपात समस्याएं होंगी । उदाहरण के लिए, आपके द्वारा लिखे गए नंबरों को देखते हुए, यदि आप एक वृत्त बनाते हैं, तो इसे स्क्वीस्ड किया जाएगा - यह लंबा होने की तुलना में व्यापक है, क्योंकि आपका क्षैतिज पैमाना 800 / (50 + 50) = 8 है और आपका वर्टिकल स्केल 600 / (50+) है 50) = 6।

इस समस्या का कोई स्वचालित समाधान नहीं हो सकता है ; आपको यह चुनना होगा कि आप क्या ग्राफ़िकल परिणाम चाहते हैं, और गेमप्ले पर इसके प्रभाव पर विचार करें। कुछ सामान्य उदाहरण:

  • बिना HUD के एक परिप्रेक्ष्य-प्रक्षेपण 3 डी गेम में, ऊर्ध्वाधर आयाम केgluPerspective सापेक्ष प्रक्षेपण के क्षेत्र को ठीक करने के लिए सामान्य सरल समाधान (ओपनजीएल के भाग के रूप में उपलब्ध ) है । इसका मतलब है कि इस तरह के खेल में, यदि आप खिड़की को क्षैतिज रूप से आकार देते हैं, तो आप दृश्य के कम या ज्यादा देखेंगे और छवि का मध्य भाग बिल्कुल भी नहीं बदलेगा।

    एक ही विचार 2 डी / 2.5 डी दृश्य पर भी लागू किया जा सकता है।

    (ध्यान दें कि यह खिलाड़ी को विस्तृत लेकिन लम्बी खिड़की नहीं बनाकर क्षैतिज रूप से उनके क्षेत्र को बड़ा करने की अनुमति देता है। यह प्रतिस्पर्धी मल्टीप्लेयर गेम में अवांछित हो सकता है।)

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

    या आप ग्राफिक्स बना सकते हैं जिसमें किनारों के आसपास विषयगत सुसंगत भराव सामग्री होती है जिसे गेमप्ले को नुकसान पहुंचाए बिना प्रदर्शन को फिट करने के लिए उन्हें क्रॉप किया जा सकता है।

  • यदि आपके पास अन्य ग्राफिक्स के शीर्ष पर एक HUD है, तो आप यह तय कर सकते हैं कि प्रत्येक HUD तत्व खिड़की के एक हिस्से (ऊपरी बाएं, नीचे केंद्र, आदि) के लिए तय किया गया है और इसके निर्देशांक की गणना करता है; HUD तत्वों के बीच 'व्हाइट स्पेस' द्वारा पहलू अनुपात के अलग-अलग होने की 'स्ट्रेचिंग' हो जाती है।

मामले के विशिष्ट गणित के अनुसार, यह देखते हुए कि आप रिज़ॉल्यूशन इंडिपेंडेंस कर रहे हैं, आपको केवल एक समान संख्या: पहलू अनुपात के साथ शुरुआत करनी होगी width / height। उदाहरण के लिए, यदि खिड़की वर्गाकार है तो यह 1 होगी; यदि यह 800 से 600 है तो यह 800/600 = 4/3 = 1.333 600 होगा।

उदाहरण के लिए, मान लें कि आपने ऑर्थोग्राफ़िक प्रोजेक्शन को छोड़ दिया है और अगर आपने खिड़की को चौड़ा किया है, तो बाईं और दाईं ओर अतिरिक्त जगह हासिल करने के लिए लिखा है। आप ऐसा कर सकते हैं:

float aspect = width / height;
glViewport(0, 0, width, height);
glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);

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

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

float aspect = width / height;
glViewport(0, 0, width, height);
if (aspect >= 1.0)
  glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);
else
  glOrtho(-50.0, 50.0, -50.0 / aspect, 50.0 / aspect, 1.0, -1.0);

ध्यान दें कि दूसरे मामले में हम गुणा करने के बजाय विभाजित करते हैं। यह केवल इसलिए है क्योंकि हमने width / heightइसके बजाय पहलू अनुपात की गणना की है height / width; यदि आप इस तरह से समझना आसान पाते हैं, तो पारस्परिक रूप से लें।

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


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