मैं व्यूपोर्ट को स्ट्रेचिंग / विकृत करने से कैसे रोक सकता हूं?


13

मूल रूप से, मैं यह जानना चाहता हूं कि जब व्यूपोर्ट / विंडो का आकार बदलता है तो मैं रेंडर इमेज की विकृति या खिंचाव को कैसे दूर कर सकता हूं।

निम्नलिखित छवियां विकृति को विस्तृत करती हैं / मैं जिस स्ट्रेचिंग के बारे में बात कर रहा हूं:

मूल छवि (स्क्वायर विंडो)

कोई विकृति नहीं

विकृत / टूटी हुई छवि (आयताकार खिड़की)

विकृति के साथ

आदर्श रूप से, दूसरी छवि को क्षैतिज खिंचाव के बिना गोले को प्रदर्शित करना चाहिए, और बड़ी खिड़की के आकार के लिए उपयोगकर्ता के दृश्य को अधिक उजागर करेगा।

यह कैसे किया जा सकता है?

मैं छवि को प्रस्तुत करने के लिए OpenGL के साथ काम कर रहा हूं, और मैं कॉल के माध्यम से परिप्रेक्ष्य प्रक्षेपण का उपयोग करता हूं:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

पहलू-अनुपात width/heightउन सभी दस्तावेज़ों / ट्यूटोरियल्स के अनुसार है, जो मैं भर चुका हूँ, इसलिए मुझे यह गलत होने की उम्मीद नहीं है। हालांकि, मेरा संदेह यह है कि यह स्ट्रेचिंग समस्या को प्रभावित कर रहा है।


विचार के बाद

ईमानदारी से, जैसा कि मैं इस मुद्दे के बारे में अधिक सोचता हूं, मुझे विश्वास है कि समाधान में प्रत्यक्ष रूप से fovy (y- दिशा में देखने के क्षेत्र) कोण और पहलू-अनुपात के बीच आनुपातिक संबंध शामिल है।

परिप्रेक्ष्य की संभावना

उपरोक्त छवि का उपयोग एक संदर्भ के रूप में, यदि चौड़ाई बढ़ती है (क्षैतिज खिंचाव पैदा करता है), तो यह बहुत प्रशंसनीय लगता है कि फ़ॉवी कोण को ऊर्ध्वाधर खिंचाव का कारण बनना चाहिए जो प्रदान की गई छवि के आनुपातिकता को 'ठीक' करता है।

इसी तरह, चौड़ाई में कमी के लिए फोवी कोण में कमी की आवश्यकता होती है।

अपडेट करें:

इसलिए, इस बारे में और जांच करने के बाद, मैंने इस तरह से देखने के लिए निराशा के तरीके को बदलने का फैसला किया है:

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

और मेरी उम्मीदें सही थीं, जिससे आनुपातिकता का मुद्दा हल हो गया। हालाँकि, यह मेरे इच्छित परिणाम प्राप्त नहीं करता है। जब खिड़की की चौड़ाई बढ़ जाती है, तो प्रदान की गई छवि छोटी हो जाती है (लेकिन क्षेत्र वास्तव में परिपत्र है)। इसके बजाय, गोले को आकार बिल्कुल नहीं बदलना चाहिए; प्रदर्शित होने वाले दृश्य की केवल मात्रा बदलनी चाहिए।

जवाबों:


14

वास्तव में, मूल प्रश्न समाधान से 1 कास्ट दूर है।

मूल कोड

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

निश्चित कोड

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

समस्या यह थी कि window.widthऔर window.heightपूर्णांक हैं, जो पूर्णांक विभाजन के परिणामस्वरूप पहलू-अनुपात का कारण बने।

आयामों में से किसी एक को फ़्लोट में कास्टिंग करने के परिणामस्वरूप फ़्लोटिंग-पॉइंट डिवीज़न का उपयोग करने का परिणाम होता है।

चूँकि पहलू-अनुपात अब सही है, इसलिए मूल पोस्ट में अधिक स्ट्रेचिंग नहीं देखी गई है।

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

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