यदि मैं अपने कार्यक्रम में एक आबादी वाले मैट्रिक्स को देखता हूं तो मैं अनुवाद घटकों को 4 वें, 8 वें और 12 वें तत्वों में देखता हूं।
शुरू करने से पहले, यह समझना महत्वपूर्ण है: इसका मतलब है कि आपके मैट्रिस पंक्ति प्रमुख हैं । इसलिए, आप इस प्रश्न का उत्तर देते हैं:
मेरे स्तंभ प्रमुख WVP मैट्रिक्स का उपयोग एचएलएसएल कॉल के साथ कोने को बदलने के लिए सफलतापूर्वक किया जाता है: मूल (वेक्टर, मैट्रिक्स) जिसके परिणामस्वरूप वेक्टर को पंक्ति-प्रमुख के रूप में माना जाना चाहिए, इसलिए मेरे गणित पुस्तकालय द्वारा प्रदान किए गए कॉलम प्रमुख मैट्रिक्स कैसे काम कर सकते हैं?
काफी सरल है: आपके मैट्रिस पंक्ति-प्रमुख हैं।
इतने सारे लोग पंक्ति-प्रमुख या ट्रांसपोज़्ड मैट्रिस का उपयोग करते हैं, कि वे भूल जाते हैं कि मैट्रिस स्वाभाविक रूप से उस तरह से उन्मुख नहीं हैं। इसलिए वे इस प्रकार एक अनुवाद मैट्रिक्स देखते हैं:
1 0 0 0
0 1 0 0
0 0 1 0
x y z 1
यह एक ट्रांसपोसड ट्रांसलेशन मैट्रिक्स है । ऐसा नहीं है कि एक सामान्य अनुवाद मैट्रिक्स कैसा दिखता है। अनुवाद 4 में चला जाता है स्तंभ , नहीं चौथी पंक्ति। कभी-कभी, आप इसे पाठ्यपुस्तकों में भी देखते हैं, जो पूरी तरह से कचरा है।
यह जानना आसान है कि एक सरणी में एक मैट्रिक्स पंक्ति या स्तंभ-प्रमुख है या नहीं। यदि यह पंक्ति-प्रमुख है, तो अनुवाद 3, 7 और 11 वें सूचक में संग्रहीत किया जाता है। यदि यह स्तंभ-प्रधान है, तो अनुवाद 12, 13 और 14 वें सूचक में संग्रहीत किया जाता है। पाठ्यक्रम के शून्य-आधार सूचकांक।
जब आप वास्तव में पंक्ति-प्रमुख लोगों का उपयोग कर रहे हैं तो स्तंभ-प्रमुख मैट्रिक्स का उपयोग कर रहे हैं यह विश्वास करने से आपका भ्रम उपजा है।
यह कथन कि पंक्ति बनाम स्तंभ प्रमुख केवल एक उल्लेखनीय सम्मेलन है, पूरी तरह सत्य है। कन्वेंशन की परवाह किए बिना मैट्रिक्स गुणा और मैट्रिक्स / वेक्टर गुणा के मैकेनिक्स समान हैं।
परिणामों में क्या परिवर्तन होता है।
सब के बाद एक 4x4 मैट्रिक्स संख्याओं का सिर्फ 4x4 ग्रिड है। इसमें समन्वय प्रणाली के बदलाव का उल्लेख नहीं है । हालांकि, एक बार जब आप किसी विशेष मैट्रिक्स को अर्थ प्रदान करते हैं, तो आपको अब यह जानना होगा कि इसमें क्या संग्रहीत है और इसका उपयोग कैसे किया जाए।
अनुवाद मैट्रिक्स लें जो मैंने आपको ऊपर दिखाया है। यह एक वैध मैट्रिक्स है। आप float[16]
दो तरीकों में से एक में उस मैट्रिक्स को स्टोर कर सकते हैं:
float row_major_t[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1};
float column_major_t[16] = {1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1};
हालाँकि, मैंने कहा कि यह अनुवाद मैट्रिक्स गलत है, क्योंकि अनुवाद गलत जगह पर है। मैंने विशेष रूप से कहा कि यह ट्रांसलेशन मैट्रिसेस को कैसे बनाया जाए, इसके लिए मानक सम्मेलन के सापेक्ष ट्रांसपोज़ किया जाता है, जो इस तरह दिखना चाहिए:
1 0 0 x
0 1 0 y
0 0 1 z
0 0 0 1
आइए देखें कि ये कैसे संग्रहीत हैं:
float row_major[16] = {1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1};
float column_major[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1};
सूचना है कि column_major
है ठीक उसी रूप में row_major_t
। इसलिए, यदि हम एक उचित अनुवाद मैट्रिक्स लेते हैं , और इसे स्तंभ-प्रमुख के रूप में संग्रहीत करते हैं, तो यह उस मैट्रिक्स को स्थानांतरित करने और इसे पंक्ति-प्रमुख के रूप में संग्रहीत करने के समान है।
इसका मतलब केवल एक संवैधानिक सम्मेलन होने से है। सम्मेलनों के वास्तव में दो सेट हैं: मेमोरी स्टोरेज और ट्रांसपोज़िशन। मेमोरी संग्रहण कॉलम बनाम पंक्ति प्रमुख है, जबकि ट्रांसपोज़ेशन सामान्य बनाम ट्रांसपोज़्ड है।
यदि आपके पास एक मैट्रिक्स है जो पंक्ति-प्रमुख क्रम में उत्पन्न हुआ था, तो आप उस मैट्रिक्स के स्तंभ-प्रमुख समकक्ष को स्थानांतरित करके समान प्रभाव प्राप्त कर सकते हैं। और इसके विपरीत।
मैट्रिक्स गुणन केवल एक ही तरीके से किया जा सकता है: दो मैट्रिक्स दिए गए, एक विशिष्ट क्रम में, आप कुछ मानों को एक साथ गुणा करते हैं और परिणामों को संग्रहीत करते हैं। अब, A*B != B*A
लेकिन वास्तविक स्रोत कोड के लिए कोड A*B
के समान है B*A
। वे दोनों आउटपुट की गणना करने के लिए समान कोड चलाते हैं।
मैट्रिक्स गुणन कोड परवाह नहीं करता है कि क्या कॉलम-प्रमुख या पंक्ति-प्रमुख क्रम में संग्रहीत किए जाने वाले मैट्रिसेस होते हैं।
एक ही नहीं कर सकते वेक्टर / मैट्रिक्स गुणन के लिए कहा जा सकता है। और यहाँ क्यों है।
वेक्टर / मैट्रिक्स गुणन एक झूठ है; यह नहीं किया जा सकता है। हालाँकि, आप एक मैट्रिक्स को दूसरे मैट्रिक्स से गुणा कर सकते हैं । इसलिए यदि आप एक वेक्टर का दिखावा करते हैं कि यह एक मैट्रिक्स है, तो आप वेक्टर / मैट्रिक्स गुणा को प्रभावी ढंग से कर सकते हैं, बस मैट्रिक्स / मैट्रिक्स गुणा करके।
4D वेक्टर को कॉलम-वेक्टर या पंक्ति-वेक्टर माना जा सकता है। यही है, एक 4D वेक्टर को 4x1 मैट्रिक्स के रूप में सोचा जा सकता है (याद रखें: मैट्रिक्स नोटेशन में, पंक्ति गणना पहले आती है) या 1x4 मैट्रिक्स।
लेकिन यहाँ एक बात है: दो मैट्रिक्स ए और बी को देखते हुए, A*B
केवल तभी परिभाषित किया जाता है यदि ए के कॉलम की संख्या बी की पंक्तियों की संख्या के समान है, इसलिए यदि ए हमारी 4x4 मैट्रिक्स है, तो बी को 4 पंक्तियों के साथ एक मैट्रिक्स होना चाहिए। इस में। इसलिए, आप प्रदर्शन नहीं कर सकते A*x
, जहां x एक पंक्ति-वेक्टर है । इसी तरह, आप प्रदर्शन नहीं कर सकते x*A
जहां x एक कॉलम-वेक्टर है।
इस वजह से, अधिकांश मैट्रिक्स गणित पुस्तकालय यह धारणा बनाते हैं: यदि आप एक वेक्टर बार एक मैट्रिक्स को गुणा करते हैं, तो आप वास्तव में गुणा करने का मतलब है कि वास्तव में काम करते हैं , वह नहीं जो कोई मतलब नहीं है।
हमें परिभाषित करें, किसी भी 4D वेक्टर x के लिए, निम्नलिखित। C
का स्तंभ-वेक्टर मैट्रिक्स रूप होगा x
, और R
पंक्ति-वेक्टर मैट्रिक्स रूप होगा x
। इसे देखते हुए, किसी भी 4x4 मैट्रिक्स ए के लिए, A*C
कॉलम-वेक्टर द्वारा मैट्रिक्स को गुणा करने का प्रतिनिधित्व करता है x
। और A R*A
से पंक्ति-वेक्टर x
को गुणा करने वाले मैट्रिक्स का प्रतिनिधित्व करता है।
लेकिन अगर हम सख्त मैट्रिक्स गणित का उपयोग करके इसे देखते हैं, तो हम देखते हैं कि ये समान नहीं हैं । R*A
नहीं कर सकते हैं के रूप में ही A*C
। ऐसा इसलिए है क्योंकि एक पंक्ति-वेक्टर स्तंभ-वेक्टर के समान नहीं है। वे समान मैट्रिक्स नहीं हैं, इसलिए वे समान परिणाम नहीं देते हैं।
हालांकि, वे एक तरह से संबंधित हैं। ऐसा नहीं है कि सच है R != C
। हालांकि, यह भी सच है कि , जहां टी ट्रांसपोज़ेशन ऑपरेशन है। दो मातृकाएँ एक-दूसरे के प्रतिरूप हैं।R = CT
यहां एक मजेदार तथ्य है। चूंकि वैक्टर को मैट्रिस के रूप में माना जाता है, इसलिए उनके पास एक कॉलम बनाम पंक्ति-प्रमुख भंडारण प्रश्न है। समस्या यह है कि वे दोनों एक जैसे दिखते हैं । फ़्लोट्स की सरणी समान है, इसलिए आप डेटा को देखकर केवल R और C के बीच अंतर नहीं बता सकते। अंतर बताने का एकमात्र तरीका यह है कि उनका उपयोग कैसे किया जाता है।
यदि आपके पास कोई दो मैट्रिसेस ए और बी हैं, और ए को पंक्ति-प्रमुख और बी को कॉलम-प्रमुख के रूप में संग्रहीत किया जाता है, तो उन्हें गुणा करना पूरी तरह से व्यर्थ है । परिणामस्वरूप आपको बकवास लगता है। असल में ऐसा नहीं है। गणितीय रूप से, जो आपको मिलता है वह करने के बराबर है । या ; वे गणितीय रूप से समान हैं।AT*B
A*BT
इसलिए, मैट्रिक्स गुणन केवल तभी समझ में आता है जब दो मैट्रिक्स (और याद रखें: वेक्टर / मैट्रिक्स गुणन सिर्फ मैट्रिक्स गुणन है) एक ही प्रमुख क्रम में संग्रहीत होते हैं।
तो, एक वेक्टर कॉलम-प्रमुख या पंक्ति-प्रमुख है? यह दोनों और न ही है, जैसा कि पहले कहा गया है। यह कॉलम प्रमुख है केवल जब इसे कॉलम मैट्रिक्स के रूप में उपयोग किया जाता है, और यह पंक्ति प्रमुख होता है जब इसे पंक्ति मैट्रिक्स के रूप में उपयोग किया जाता है।
इसलिए, यदि आपके पास एक मैट्रिक्स ए है जो कॉलम प्रमुख है, तो x*A
इसका मतलब है ... कुछ भी नहीं। खैर, फिर से, इसका मतलब है , लेकिन यह वह नहीं है जो आप वास्तव में चाहते थे। इसी तरह, यदि पंक्ति प्रमुख है, तो गुणा गुणन करता है ।x*AT
A*x
A
इसलिए, वेक्टर / मैट्रिक्स गुणन के आदेश करता है डेटा के अपने प्रमुख आदेश के आधार पर, परिवर्तन (और आप स्थानांतरित मैट्रिक्स उपयोग कर रहे हैं)।
कोड के निम्नलिखित स्निपेट में r क्यों होता है! = R2
क्योंकि आपका कोड टूट गया है और छोटी गाड़ी है। गणित के अनुसार, । यदि आपको यह परिणाम नहीं मिलता है, तो या तो आपकी समानता परीक्षण गलत है (फ्लोटिंग-पॉइंट सटीक मुद्दे) या आपका मैट्रिक्स गुणन कोड टूट गया है।A * (B * C) == (CT * BT) * AT
pos3 क्यों है! = pos के लिए
क्योंकि इसका कोई मतलब नहीं है। सच होने का एकमात्र तरीका होगा यदि । और यह केवल सममित मैट्रिक्स का सच है।A * t == AT * t
A == AT