2010-12-05 19 views
11

मेरा प्रश्न बस है: प्रोजेक्शन और मॉडल व्यू मैट्रिक्स के लिए सही प्रारूप क्या है?ओपनजीएल मैट्रिक्स प्रारूप सही?

मुझे बताया गया है कि निम्नलिखित उदाहरण मैट्रिक्स ट्रांसपोज़ किए गए हैं और ओपनजीएल मैट्रिक्स की तरह नहीं बनाए गए हैं।

ModelView Matrix 
{(1, 0, 0, 0) 
(0, 0.7071068, 0.7071068, 0) 
(0, -0.7071068, 0.7071068, 0) 
(0, -141.4214, -141.4214, 1)} 

Projection Matrix 
{(1.931371, 0, 0, 0) 
(0, 2.414213, 0, 0) 
(0, 0, -1.0002, -1) 
(0, 0, -2.0002, 0)} 

उत्तर

23

संपादित करें: इस उत्तर के लिए एक अद्यतन की गंभीर जरूरत है। अर्थात्, शेडर्स के बारे में कोई विचार नहीं है।

जैसा कि @gman टिप्पणियों में बताता है, पंक्ति-प्रमुख या स्तंभ-प्रमुख का उपयोग करना है या नहीं, इस पर निर्भर करता है कि आप अपना गणित कैसे करते हैं। आप एक या दूसरे (या यहां तक ​​कि दोनों अलग-अलग समय में भी चुन सकते हैं यदि आपको लगता है कि यह भ्रमित नहीं है) तब तक जब तक वे आपके समन्वय प्रणाली और संचालन के आदेश से मेल खाते हैं।

मैं इस जवाब को समुदाय विकी के रूप में छोड़ रहा हूं यदि किसी के पास समय है और इसे अपडेट करना होगा।


ओपन तत्वों के साथ स्तंभ-प्रमुख क्रम में सूचीबद्ध एक आयामी सरणी, यानी इस तरह का आदेश दिया के रूप में मैट्रिक्स निर्दिष्ट करता है:

m0 m4 m8 m12 
m1 m5 m9 m13 
m2 m6 m10 m14 
m3 m7 m11 m15 

तो अगर आप एक सरणी इस तरह से प्रारंभ, सी में या बहुत अधिक कोई अन्य भाषा, परिणामी मैट्रिक्स ऐसा दिखता है जैसे इसे ट्रांसपोज़िंग की आवश्यकता होती है, क्योंकि सी कोड बाएं से दाएं पहले और फिर ऊपर से नीचे पढ़ता है (दूसरे शब्दों में, जैसे कि यह पंक्ति-मुख्य क्रम में था):

int mat[16] = { 
    0, 1, 2, 3, 
    4, 5, 6, 7, 
    8, 9, 10, 11, 
    12, 13, 14, 15, 
} 

वैसे, ओपनजीएल में glLoadTransposeMatrix और glMultTransposeMatrix दोनों हैं, जिन्हें आप glLoadMatrix और glMultMatrix के बजाय उपयोग कर सकते हैं, इसलिए यह कोई समस्या नहीं होनी चाहिए।

+0

तो मैं कैसे बता सकता हूं कि मेरे प्रश्न से मैट्रिक्स कॉलम- या पंक्ति-प्रमुख क्रम में हैं या नहीं? –

+0

मॉडल-व्यू मैट्रिक्स में अंतिम पंक्ति में गैर-शून्य तत्व हैं, जबकि अंतिम कॉलम पढ़ा गया है (0, 0, 0, 1)। इसका मतलब है कि यह पंक्ति-प्रमुख क्रम में है। (Http://www.songho.ca/opengl/gl_transform.html#modelview के अनुसार) – Zecc

+0

इस बीच, इस लिंक में से एक के साथ प्रक्षेपण मैट्रिक्स को विपरीत - http://www.songho.ca/opengl/gl_projectionmatrix.html - ऐसा लगता है कि यह कॉलम-प्रमुख क्रम में है। कृपया ध्यान दें कि मैंने वास्तव में इस बारे में ज्यादा विचार नहीं किया है, हालांकि। – Zecc

5

आप जो भी नोटेशन पसंद करते हैं उसका उपयोग कर सकते हैं, जब तक कि आप मैट्रिक्स परिचालन के क्रम के अनुरूप हों। https://www.opengl.org/archives/resources/faq/technical/transformations.htm से हवाला देते हुए:

9,005 ओपन मैट्रिक्स हैं स्तंभ-प्रमुख या पंक्ति-प्रमुख?

प्रोग्रामिंग उद्देश्यों के लिए, ओपनजीएल मैट्रिस मेमोरी में मूल रूप से रखे गए बेस वेक्टर के साथ 16-मान सरणी हैं। अनुवाद घटक 16-तत्व मैट्रिक्स के 13 वें, 14 वें और 15 वें तत्वों पर कब्जा करते हैं, जहां ओपनजीएल 2.1 विशिष्टता के खंड 2.11.2 में वर्णित सूचकांक 1 से 16 तक गिने जाते हैं।

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

यानी।एक शेडर में आप के रूप में नाव सरणियों बदलने के लिए एक समान में कॉलम और पूर्व गुणा एक शीर्ष द्वारा आदेश दिया परिवर्तन मैट्रिक्स लोड कर सकते हैं:

gl_Position = Proj * View * Model * vPosition; 

या नाव सरणियों के रूप में ही मैट्रिक पंक्तियों द्वारा आदेश दिया लोड और बाद गुणा एक ही प्रभाव को प्राप्त करने:

gl_Position = vPosition * Model * View * Proj; 

आप प्रभावी रूप से यह बदलना एक मैट्रिक्स transposing द्वारा विपरीत नहीं में संग्रहीत करने के लिए टेशन, यही कारण है कि OpenGL में मैट्रिक्स को ट्रांसफर करने के विकल्प हैं क्योंकि वे इनपुट किए गए हैं।

+0

यह पीछे की तरफ देखता है। गुणाओं का पहला क्रम कॉलम-प्रमुख मैट्रिस के लिए उपयोग किया जाता है, पंक्ति-प्रमुख मैट्रिस के लिए दूसरा। –

+0

हां, क्षमा करें तय करें। – tmw

संबंधित मुद्दे