आपने जो वर्णन किया है, वह पूरी तरह से पर्याप्त है और संकल्प स्वतंत्रता प्रदान करने के लिए उपयुक्त है। आपके द्वारा खींची गई कोई भी चीज वास्तव में आपकी खिड़की के समान अनुपात को हमेशा बनाए रखेगी।
हालांकि, यदि आप इससे अधिक कुछ नहीं करते हैं, तो आपको पहलू अनुपात समस्याएं होंगी । उदाहरण के लिए, आपके द्वारा लिखे गए नंबरों को देखते हुए, यदि आप एक वृत्त बनाते हैं, तो इसे स्क्वीस्ड किया जाएगा - यह लंबा होने की तुलना में व्यापक है, क्योंकि आपका क्षैतिज पैमाना 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
; यदि आप इस तरह से समझना आसान पाते हैं, तो पारस्परिक रूप से लें।
फिर, यह पहलू अनुपात को प्रबंधित करने का एकमात्र तरीका नहीं है; यह सुनिश्चित करने के लिए यह बहुत आसान है कि आपकी सामग्री न तो कटी है और न ही कटी हुई है। पता लगाएँ कि आप क्या करना चाहते हैं जब आपकी खिड़की चौड़ी, लंबी या जो भी हो; फिर इसके गणित पर काम करें।