2009-03-10 7 views
116

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

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

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

उत्तर

125

पहचान मैट्रिक्स, प्रक्षेपण और modelview मैट्रिक्स के मामले में, अनिवार्य रूप से मैट्रिक्स वापस अपने डिफ़ॉल्ट राज्य के लिए रीसेट करता है।

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

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

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

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

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

मुझे उम्मीद है कि यह थोड़ा और स्पष्ट होगा!

+0

स्पष्ट उदाहरण बहाया गया है :) – hqt

+1

इसका मतलब है, ओपन एक 'मास्टर' या 'वैश्विक' मैट्रिक्स कहना है, और, प्रत्येक अनुवर्ती मैट्रिक्स लागू किया जाता है कि 'मास्टर' के सापेक्ष या 'ग्लोबल' मैट्रिक्स। क्या मैं सही हू? – anonymous

38

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

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

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

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

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

2

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

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

5

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

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

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

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

आशा मैं मेरे साथ कुछ प्रकाश