Sunday, 15 January 2012

c++ - OpenGL: Results by gluUnProject are not the expected ones -


मैं निम्नलिखित छवि में z = 0 के साथ एक बनावट बना रहा हूँ:

यहाँ छवि विवरण दर्ज करें

मेरे निकट विमान और दूर स्थित विमान सेटिंग्स 0.001 और 120.0 हैं मैं अपने कुंजीपटल का उपयोग करके आस-पास और ज़ूम इन और आउट कर सकता हूं।

मुझे जो चाहिए, gluunproject का उपयोग करते समय एक माउस कर्सर स्थिति (उदाहरण में लाल) की स्थिति को पहचानना है।

समस्या: परिणाम posx, posy और posz कुछ हद तक बंद हैं लेकिन सही नहीं है। जैसे दृश्यमान दृश्य (नीला) के केंद्र के लिए मुझे पॉज़एक्स = 8.90000 और पॉज़ी = 53.80000 मिलता है। हालांकि अगर मैं माउस को बाईं तरफ ले जाता हूं तो मुझे posX = 8.89894 (3। होना चाहिए)। अगर मैं कर्सर को दायीं ओर ले जाता हूं तो मुझे लगभग 8.90103 मिलता है। 14-16।

यहां मेरा कोड है:

  glMatrixMode (GL_PROJECTION); glLoadIdentity (); परिप्रेक्ष्य जीएल (65.0, (जीएलडबल) चौड़ाई () / (जीएलडबल) ऊँचाई (), 0.001, 120.0); glMatrixMode (GL_MODELVIEW); glPushMatrix (); ग्लक कोलर (0.0 एफ, 0.0 एफ, 0.0 एफ, 0.0 एफ); ग्लक्लियर (जीएल_कॉल्लो_B_BFFER_BIT | GL_DEPTH_BUFFER_BIT); // मौजूदा विश्व-स्थिति पर जाएं glTranslated (-m_posWorld.x), -m_posWorld.y (), -m_posWorld.z ()); // स्क्रीन (माउस) को प्रोजेक्ट करने की कोशिश करें- विश्व समन्वयित जीएलआईआईटी व्यूपोर्ट [4]; जीएलडबल मॉडलव्यूव्यू [16]; जीएलडी डबल प्रक्षेपण [16]; जीएल फ्लोट WinX, WinY, WinZ; ग्लैगड डबल्यूवी (GL_MODELVIEW_MATRIX, मॉडलदृश्य); GlGetDoublev (GL_PROJECTION_MATRIX, प्रक्षेपण); ग्लैगइन्टेगर्व (जीएल_ VIVIEW, व्यूपोर्ट); WinX = (फ्लोट) m_lastPos.x (); // m_lastPos एक बिंदु है जो ओपनजीएल-विजेट के भीतर आखिरी माउस कर्सर स्थिति को संभालता है (बिना सीमाओं के) winY = (फ्लोट) व्यूपोर्ट [3] - (फ्लोट) m_lastPos.y (); WinZ = -m_posWorld.z (); जीएलडी डबल पॉएक्स, पॉज़ी, पॉज़ेज; Int success = glhUnProjectf (winX, winY, -m_posWorld.z (), मॉडलव्यूव्यू, प्रक्षेपण, व्यूपोर्ट, और पॉज़एक्स, और पोझी, और पोज़ेज);  

यहां समस्या क्या हो सकती है?

"अप्रोजेक्ट" कुछ, आपको विंडो-स्पेस x , y और z की आवश्यकता है। < / H3>

& nbsp; & nbsp; & nbsp; & nbsp; m_posWorld.z लगभग निश्चित रूप से विंडो-स्पेस में नहीं है।

विंडो-स्पेस गहराई बफर स्टोर्स क्या z है, यह [ 0.0 , 1.0 ] (डिफ़ॉल्ट गहराई सीमा मानते हुए) के बीच का मान है। क्योंकि गहराई बफर आपको यह मान देता है, आप इसे आसानी से गहराई बफर को (winx, winY) पर पढ़ सकते हैं (हालांकि प्रदर्शन प्रभावित होगा)।

आप कर सकते हैं अपने विश्व-अंतरिक्ष समन्वय को विंडो-स्पेस में परिवर्तित करें:

  vec4 posClip = प्रक्षेपण मैट्रिक्स * दृश्य मैट्रिक्स * m_posWorld; // परियोजना के लिए क्लिप-स्पेस vec4 posendar = posclip / posclip.w; // परिप्रेक्ष्य विखंडन फ्लैग winZ = (posNDC * vec4 (0.5) + vec4 (0.5))। Z; // गहराई रेंज के लिए समायोजित करें  

ऊपर चर्चा की गई चर्चा बहुत तेज काम करेगी, लेकिन कुछ मैट्रिक्स गणित की आवश्यकता है। आप वर्तमान में आपके लिए मैट्रिक्स गणित करने के लिए ओपनजीएल पर पूरी तरह से भरोसा कर रहे हैं, और यदि आप ऐसा करना चाहते हैं, तो आपका एकमात्र विकल्प गहराई बफर को वापस पढ़ना होगा:

  जीएलफ्लोट WinZ; GlReadPixels (winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, और amp; winZ);  

No comments:

Post a Comment