opengl - Screen position unprojection without W -
मैं कैसे unproject की बुनियादी अवधारणा को समझता हूं:
चलो mut z = 0.0; Gl :: ReadPixels (x के रूप में i32, i32 के रूप में y, 1, 1, gl :: DEPTH_COMPONENT, gl :: FLOAT, & amp; z); स्क्रीन स्थिति के लिए // खिड़की की स्थिति स्क्रीन_पोजीशन = स्फ़ी। टॉ_स्क्रीन_पोजीशन (एक्स, वाई) दें; // दुनिया की स्थिति के लिए स्क्रीन की स्थिति world_position = self.projection_matrix ()। Invert () * Vector4 :: new (screen_position.x, screen_position.y, z, 1.0); लेकिन यह डब्ल्यू समन्वय ठीक से नहीं लेता है - जब मैं विश्व अंतरिक्ष से स्क्रीन स्थान तक चीजों को प्रस्तुत करता हूं, तो वे W! = 1 के साथ समाप्त होते हैं, परिप्रेक्ष्य परिवर्तन की वजह से () जब मैं स्क्रीन स्थान से वापस विश्व अंतरिक्ष ( W = 1 की धारणा के साथ) में परिवर्तित करता हूं, तो वस्तु गलत स्थिति में होती है। जैसा कि मैंने इसे समझ लिया, डब्ल्यू अन्य सभी निर्देशांक के लिए एक स्केलिंग कारक है। यदि यह मामला है, तो इसका मतलब यह नहीं है कि स्क्रीन वैक्टर (0, 0, -1, 1) और (0, 0, -2, 2) का नक्शा होगा एक ही खिड़की के निर्देशांक के लिए, और क्या यह अप्रत्यक्ष रूप से बिना किसी काम के अनूठे परिणाम उत्पन्न करता है? धन्यवाद!
परिप्रेक्ष्य परिवर्तन की वजह से, आप वास्तव में डब्ल्यू की उपेक्षा नहीं कर सकते।
मैं gluUnproject फ़ंक्शन के स्रोत कोड को देखने का सुझाव दूंगा:। आप देखेंगे कि यह क्या करता है: - प्रोजेक्शन की गणना करें * मॉडलदृश्य मैट्रिक्स और इसे उलटा करें।
- स्क्रीन स्थिति से बना एक वेक्टर गुणा करें (कोड में, WinZ = 0 निकट के विमान के अनुरूप होगा, आपके परिप्रेक्ष्य प्रक्षेपण के दूरसंचार के लिए winZ = 1; डब्ल्यू हमेशा 1 होगा।
- गणना वाले वेक्टर के एक्स, वाई और जेड को डब्ल्यू से विभाजित करें।
ध्यान दें कि यदि आप ऐसा करते हैं, तो परिणाम के डब्ल्यू को अनदेखा कर दिया जाना चाहिए (यानी 1 होना माना गया है)।
आप यह भी देख सकते हैं कि ओपनजीएल में परिवर्तन कैसे काम करते हैं - अगर आप इस से परिचित नहीं हैं, तो मैं क्लिप निर्देशांक और सामान्य उपकरण निर्देशांक के बारे में पढ़ने का सुझाव देता हूं।
Comments
Post a Comment