OpenGL में GlLoadIdentity () क्या करता है?


132

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

मुझे पता है कि glLoadIdentity()वर्तमान मैट्रिक्स को पहचान मैट्रिक्स के साथ बदल देता है, लेकिन वास्तव में क्या करता है? यदि हर प्रोग्राम को इसकी आवश्यकता है, तो पहचान मैट्रिक्स को डिफ़ॉल्ट रूप से तब तक क्यों नहीं कहा जाता है जब तक कि अन्यथा निर्दिष्ट न हो? मुझे अपने कोड में फ़ंक्शंस पसंद नहीं हैं जब तक कि मुझे नहीं पता कि वे क्या करते हैं। मुझे ध्यान देना चाहिए कि मैं विशेष रूप से समृद्ध 2D ग्राहकों के लिए OpenGL का उपयोग कर रहा हूं, इसलिए मेरी अज्ञानता का बहाना करें यदि यह 3D के लिए बहुत स्पष्ट है।

glMatrixMode(GL_PROJECTION)वीएस के बारे में भी थोड़ा भ्रमित glMatrixMode(GL_MODELVIEW)

जवाबों:


139

पहचान मैट्रिक्स, प्रक्षेपण और मॉडलव्यू मैट्रिसेस के संदर्भ में, अनिवार्य रूप से मैट्रिक्स को उसकी डिफ़ॉल्ट स्थिति में रीसेट करता है।

जैसा कि आप उम्मीद करते हैं कि आप जानते हैं, glTranslateऔर glRotateहमेशा मैट्रिक्स की वर्तमान स्थिति के सापेक्ष होते हैं। उदाहरण के लिए, यदि आप कॉल glTranslateकरते हैं , तो आप मैट्रिक्स की वर्तमान स्थिति से अनुवाद कर रहे हैं, मूल से नहीं। लेकिन अगर आप मूल पर शुरू करना चाहते हैं glLoadIdentity(), तो जब आप कॉल करते हैं , और तब आप glTranslateउस मैट्रिक्स से कर सकते हैं जो अब मूल पर स्थित है, या glRotateमैट्रिक्स से जो अब डिफ़ॉल्ट दिशा में उन्मुख है।

मुझे लगता है कि बून का जवाब, कि यह 1 के बराबर है, बिल्कुल सही नहीं है। मैट्रिक्स वास्तव में इस तरह दिखता है:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

यही पहचान मैट्रिक्स है। बून सही है, गणितीय रूप से, कि किसी भी मैट्रिक्स को उस मैट्रिक्स के साथ गुणा किया जाता है (या एक मैट्रिक्स जो ऐसा दिखता है; विकर्ण वाले, अन्य सभी 0s) का परिणाम मूल मैट्रिक्स में होगा, लेकिन मुझे विश्वास नहीं होता कि उन्होंने समझाया कि यह क्यों महत्वपूर्ण है।

यही कारण है कि यह महत्वपूर्ण है क्योंकि ओपनजीएल प्रत्येक मैट्रिक्स के माध्यम से सभी पदों और घुमावों को गुणा करता है; उदाहरण के लिए जब आप एक बहुभुज ( glBegin(GL_FACE), कुछ बिंदुओं glEnd()) को खींचते हैं, तो वह इसे MODELVIEW के साथ गुणा करके "विश्व स्थान" में बदल देता है, और फिर इसे PROJECT मैट्रिक्स के साथ गुणा करके 3D से 2D में अनुवाद करता है, और यह देता है स्क्रीन पर 2 डी बिंदु, गहराई के साथ (स्क्रीन 'कैमरा' से), जिसका उपयोग यह पिक्सेल खींचने के लिए करता है। लेकिन जब इन मैट्रिक्स में से कोई एक पहचान मैट्रिक्स होता है, तो पॉइंट्स को मैट्रिक्स के साथ गुणा किया जाता है और इसलिए इसे बदला नहीं जाता है, इसलिए मैट्रिक्स का कोई प्रभाव नहीं होता है; यह अंकों का अनुवाद नहीं करता है, यह उन्हें घुमाता नहीं है, यह उन्हें छोड़ देता है-जैसा है।

मुझे आशा है कि यह थोड़ा और स्पष्ट करता है!


1
इसका मतलब है कि, ओपनजीएल एक 'मास्टर' या 'ग्लोबल' मैट्रिक्स रखता है, और, प्रत्येक बाद के मैट्रिक्स को उस 'मास्टर' या 'ग्लोबल' मैट्रिक्स के सापेक्ष लागू किया जाता है। क्या मैं सही हू?
user366312

41

पहचान मैट्रिक्स संख्या के लिए 1 के बराबर है। जैसा कि आप किसी भी संख्या को जानते हैं जो 1 से गुणा करता है (e.g. A x 1 = A),

यही बात मैट्रिक्स के लिए भी जाती है ( MatrixA x IdentityMatrix = MatrixA)

इससे पहले कि आप मैट्रिक्स मैट्रिक्स में और अधिक गुणा करें, पहचान मैट्रिक्स को लोड करना आपके मैट्रिक्स को सही स्थिति में आरंभीकृत करने का एक तरीका है।

glMatrixMode(GL_PROJECTION) : परिप्रेक्ष्य परिवर्तन या ऑर्थोगोनल परिवर्तन द्वारा उपयोग किए जाने वाले मेट्रिसेस से संबंधित है।

glMatrixMode(GL_MODELVIEW): मॉडल-व्यू ट्रांसफॉर्मेशन द्वारा उपयोग किए जाने वाले मैट्रिसेस से संबंधित है। यही है, अपने ऑब्जेक्ट (उर्फ मॉडल) को व्यू कोऑर्डिनेट स्पेस (या कैमरा स्पेस) में बदलने के लिए।


6

प्रक्षेपण मैट्रिक्स का उपयोग आपके देखने की मात्रा बनाने के लिए किया जाता है। वास्तविक दुनिया में एक दृश्य की कल्पना करो। आप वास्तव में अपने चारों ओर सब कुछ नहीं देखते हैं, केवल वही है जो आपकी आँखें आपको देखने की अनुमति देती हैं। यदि आप उदाहरण के लिए एक मछली हैं तो आप चीजों को थोड़ा व्यापक देखते हैं। इसलिए जब हम कहते हैं कि हम प्रक्षेपण मैट्रिक्स की स्थापना करते हैं तो हमारा मतलब है कि हम उस दृश्य से जो हम देखना चाहते हैं उसे सेट करते हैं। मेरा मतलब है कि आप अपनी दुनिया में कहीं भी वस्तुओं को आकर्षित कर सकते हैं। अगर वे व्यू वॉल्यूम के अंदर नहीं हैं तो आपको कुछ भी दिखाई नहीं देगा। जब आप व्यू वॉल्यूम बनाते हैं तो कल्पना करें कि आप 6 क्लिपिंग प्लेन बनाते हैं जो आपके व्यू फील्ड को परिभाषित करते हैं।

मॉडलव्यू मैट्रिक्स के रूप में, इसका उपयोग आपकी दुनिया में मॉडल (ऑब्जेक्ट) में विभिन्न परिवर्तन करने के लिए किया जाता है। इस तरह आपको केवल एक बार अपनी वस्तु को परिभाषित करना होगा और फिर उसका अनुवाद करना होगा या उसे घुमाना होगा या उसे स्केल करना होगा।

दृश्य वॉल्यूम सेट करने के लिए अपने दृश्य में ऑब्जेक्ट्स को आरेखण करने से पहले आप प्रोजेक्शन मैट्रिक्स का उपयोग करेंगे। फिर आप अपनी वस्तु को आकर्षित करते हैं और तदनुसार मॉडलव्यू मैट्रिक्स को बदलते हैं। बेशक आप अपने मॉडलों को खींचने के अपने मैट्रिक्स मिडवे को बदल सकते हैं यदि उदाहरण के लिए आप एक दृश्य खींचना चाहते हैं और फिर कुछ पाठ आकर्षित करते हैं (जो कुछ तरीकों से आप ऑर्थोग्राफिक प्रक्षेपण में आसान काम कर सकते हैं) तो मॉडलव्यू मैट्रिक्स में वापस बदल सकते हैं।

नाम के रूप में मॉडलव्यू के लिए यह मॉडलिंग और देखने के परिवर्तनों के द्वंद्व के साथ करना है। यदि आप कैमरा 5 इकाइयों को वापस खींचते हैं, या ऑब्जेक्ट को 5 इकाइयों को आगे बढ़ाते हैं तो यह अनिवार्य रूप से समान है।

आशा है कि मैंने कुछ प्रकाश डाला है


2

पहचान मैट्रिक्स का उपयोग एक मैट्रिक्स को "डिफ़ॉल्ट" करने के लिए किया जाता है।

एहसास करने के लिए एक महत्वपूर्ण बात यह है कि मैट्रिक्स गुणन एक अर्थ में, additive हैं। उदाहरण के लिए, यदि आप एक मैट्रिक्स लेते हैं जो पहचान मैट्रिक्स से शुरू होता है, तो इसे एक रोटेशन मैट्रिक्स से गुणा करें, फिर इसे एक स्केलिंग मैट्रिक्स से गुणा करें, आप एक मैट्रिक्स के साथ समाप्त होते हैं जो मेट्रिसेस के खिलाफ गुणा और घूमता है।


0

बस दूसरों ने जो कहा है उसे फिर से जोड़ने के लिए, पहचान मैट्रिक्स एक मैट्रिक्स है जो ऐसा है कि जब आप इसके साथ एक वेक्टर / मैट्रिक्स गुणा करते हैं, तो परिणाम वही वेक्टर / मैट्रिक्स होता है। यह गुणा के साथ नंबर 1 के बराबर है या जोड़ के साथ संख्या 0 है।

glLoadIdentity () एक पदावनत समारोह है, और आपको अपने स्वयं के मेट्रिसेस का प्रबंधन करने के लिए प्रोत्साहित किया जाता है।


-1

glLoadIdentity() फ़ंक्शन यह सुनिश्चित करता है कि हर बार जब हम प्रक्षेपण मोड में प्रवेश करते हैं, तो मैट्रिक्स को पहचान मैट्रिक्स पर रीसेट किया जाएगा, ताकि नए देखने के मापदंडों को पिछले एक के साथ संयुक्त न किया जाए।

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