जवाबों:
हां, आप अनुवाद के मामले में एक वेक्टर जोड़ सकते हैं। मैट्रिक्स का उपयोग करने का कारण अलग-अलग संयुक्त परिवर्तनों को संभालने के लिए एक समान तरीके से फोड़ा जाता है।
उदाहरण के लिए, रोटेशन आमतौर पर एक मैट्रिक्स का उपयोग करके किया जाता है (घुमावों से निपटने के अन्य तरीकों के लिए @MickLH टिप्पणी करें), इसलिए एक समान तरीके से कई परिवर्तनों (रोटेशन / अनुवाद / स्केलिंग / प्रोजेक्शन ... आदि) से निपटने के लिए, आपको उन्हें एक मैट्रिक्स में एनकोड करने की आवश्यकता है।
ठीक है, अधिक तकनीकी रूप से बोलना; एक रूपांतरण एक बिंदु / वेक्टर को दूसरे बिंदु / वेक्टर पर मैप कर रहा है।
p` = T(p);
जहाँ p` रूपांतरित बिंदु है और T (p) परिवर्तन कार्य है।
यह देखते हुए कि हम एक मैट्रिक्स का उपयोग नहीं करते हैं हमें कई परिवर्तनों को संयोजित करने के लिए ऐसा करने की आवश्यकता है:
p1 = T (p);
p अंतिम = M (p1);
न केवल एक मैट्रिक्स एक ही मैट्रिक्स में कई प्रकार के परिवर्तनों को जोड़ सकता है (जैसे affine, रैखिक, प्रक्षेप्य)।
मैट्रिक्स का उपयोग करने से हमें परिवर्तनों की श्रृंखलाओं को संयोजित करने और फिर उन्हें गुणा करने का अवसर मिलता है। यह आमतौर पर GPU द्वारा एक टन चक्र बचाता है (इसे इंगित करने के लिए @ChristianRau के लिए धन्यवाद)।
टी अंतिम = टी * आर * पी; // ट्रांसलेट रोटेट प्रोजेक्ट
पी फाइनल = टी फाइनल * पी;
यह भी बताने के लिए अच्छा है कि GPU और यहां तक कि कुछ CPU वेक्टर ऑपरेशन के लिए अनुकूलित हैं; सीपीयू और जीपीयू का उपयोग करके सीपीयू डिजाइन द्वारा डेटा संचालित समानांतर प्रोसेसर होते हैं, इसलिए मैट्रिस का उपयोग हार्डवेयर त्वरण के साथ पूरी तरह से फिट बैठता है (वास्तव में, GPUs को मैट्रिक्स / वेक्टर संचालन के लिए डिज़ाइन किया गया था)।
यदि आप कभी भी ऐसा करने जा रहे हैं, तो एक ही धुरी पर जाना है और कभी भी किसी अन्य परिवर्तन को लागू नहीं करना है तो आप जो सुझाव दे रहे हैं वह ठीक है।
एक मैट्रिक्स का उपयोग करने की वास्तविक शक्ति यह है कि आप आसानी से एक साथ जटिल ऑपरेशन की एक श्रृंखला को समेट सकते हैं, और एक ही श्रृंखला को कई ऑब्जेक्ट्स पर लागू कर सकते हैं।
अधिकांश मामले इतने सरल नहीं होते हैं और यदि आप पहले वस्तु को घुमाते हैं, और दुनिया की कुल्हाड़ियों के बजाय अपने स्थानीय अक्षों के साथ बदलना चाहते हैं, तो आप पाएंगे कि आप बस एक संख्या में 10 नहीं जोड़ सकते हैं और इसे सही ढंग से पूरा कर सकते हैं ।
सफलतापूर्वक "क्यों" सवाल का जवाब देने के लिए, यह इसलिए है क्योंकि 4x4 मैट्रिक्स एक ही बार में रोटेशन, अनुवाद और स्केलिंग ऑपरेशन का वर्णन कर सकता है। सुसंगत तरीके से इनमें से किसी का वर्णन करने में सक्षम होना बहुत सारी चीजों को सरल बनाता है।
विभिन्न प्रकार के परिवर्तनों को एक अलग गणितीय कार्यों के साथ अधिक सरल रूप से दर्शाया जा सकता है। जैसा कि आप ध्यान दें, अनुवाद सिर्फ जोड़कर किया जा सकता है। एक स्केलर द्वारा गुणा करके यूनिफ़ॉर्म स्केलिंग। लेकिन उचित रूप से तैयार किए गए 4x4 मैट्रिक्स कुछ भी कर सकते हैं। तो 4x4 का लगातार उपयोग करने से कोड और इंटरफेस बहुत सरल हो जाता है। आप इन 4x4 को समझने में कुछ जटिलता का भुगतान करते हैं, लेकिन फिर इसके कारण बहुत सी चीजें आसान और तेज हो जाती हैं।
4x4 मैट्रिक्स का उपयोग करने का कारण यह है कि ऑपरेशन एक रैखिक परिवर्तन है । यह सजातीय निर्देशांक का एक उदाहरण है । यही बात 2d मामले में (3x3 मैट्रिक्स का उपयोग करके) की जाती है। सजातीय निर्देशांक का उपयोग करने का कारण इतना है कि एक ऑपरेशन का उपयोग करके सभी 3 ज्यामितीय टैंसफॉर्मेशन किए जा सकते हैं; अन्यथा एक 3x3 मैट्रिक्स को गुणा और एक 3x3 मैट्रिक्स के अलावा (अनुवाद के लिए) करने की आवश्यकता होगी। सीगप्रकाश का यह लिंक उपयोगी है।
अनुवादों को 3D मैट्रिसेस द्वारा प्रस्तुत नहीं किया जा सकता है
एक साधारण तर्क यह है कि अनुवाद मूल वेक्टर ले सकता है:
0
0
0
मूल से दूर, करने के लिए कहें x = 1
:
1
0
0
लेकिन इसके लिए एक मैट्रिक्स की आवश्यकता होगी जैसे:
| a b c | |0| |1|
| d e f | * |0| = |0|
| g h i | |0| |0|
लेकिन यह असंभव है।
एक अन्य तर्क एकवचन मूल्य अपघटन प्रमेय है , जो कहता है कि प्रत्येक मैट्रिक्स को दो रोटेशन और एक स्केलिंग ऑपरेशन के साथ बनाया जा सकता है। वहां कोई अनुवाद नहीं।
मैट्रिस का उपयोग क्यों किया जा सकता है?
कई मॉडल किए गए ऑब्जेक्ट (जैसे कार चेसिस) या मॉडलिंग की गई वस्तुओं का हिस्सा (जैसे कार टायर, ड्राइविंग व्हील) ठोस होते हैं: वर्टेक्स के बीच की दूरी कभी नहीं बदलती है।
केवल रूपांतरण जो हम उन पर करना चाहते हैं, वे हैं रोटेशन और अनुवाद।
मैट्रिक्स गुणन रोटेशन और अनुवाद दोनों को एन्कोड कर सकता है।
रोटेशन मैट्रिसेस के स्पष्ट सूत्र हैं, उदाहरण के लिए: कोण के लिए एक 2 डी रोटेशन मैट्रिक्स a
है:
cos(a) -sin(a)
sin(a) cos(a)
3 डी के लिए अनुरूप सूत्र हैं , लेकिन ध्यान दें कि 3 डी घुमाव केवल 1 के बजाय 3 पैरामीटर लेते हैं ।
अनुवाद कम तुच्छ हैं और बाद में चर्चा की जाएगी। वे कारण हैं जिन्हें हमें 4D मैट्रिस की आवश्यकता है।
मैट्रिस का उपयोग करना क्यों अच्छा है?
क्योंकि मल्टीपल मैट्रिसेस की संरचना को कई गुणा मैट्रिक्स से प्री-कैलकुलेट किया जा सकता है ।
उदाहरण के लिए, यदि हम v
मैट्रिक्स के साथ अपनी कार चेसिस के एक हजार वैक्टर का अनुवाद करने जा रहे हैं T
और फिर R
करने के बजाय मैट्रिक्स के साथ घूमते हैं:
v2 = T * v
और फिर:
v3 = R * v2
प्रत्येक वेक्टर के लिए, हम पूर्व-गणना कर सकते हैं:
RT = R * T
और फिर हर शीर्ष के लिए सिर्फ एक गुणा करें:
v3 = RT * v
इससे भी बेहतर: अगर हम कार के सापेक्ष टायर और ड्राइविंग व्हील के शीर्ष स्थान चाहते हैं, तो हम कार के सापेक्ष मैट्रिक्स RT
द्वारा पिछले मैट्रिक्स को केवल गुणा करते हैं ।
यह स्वाभाविक रूप से मैट्रिस के ढेर को बनाए रखने की ओर जाता है :
कैसे एक आयाम जोड़ने से समस्या हल हो जाती है
आइए 1 डी से 2 डी तक के मामले पर विचार करें जो कल्पना करना आसान है।
1D में एक मैट्रिक्स सिर्फ एक संख्या है, और जैसा कि हमने 3D में देखा है कि यह अनुवाद नहीं कर सकता, केवल स्केलिंग है।
लेकिन अगर हम अतिरिक्त आयाम जोड़ते हैं:
| 1 dx | * |x| = | x + dx |
| 0 1 | |1| | 1 |
और फिर हम नए अतिरिक्त आयाम के बारे में भूल जाते हैं, हम प्राप्त करते हैं:
x + dx
जैसा हम चाहते थे।
यह 2 डी परिवर्तन इतना महत्वपूर्ण है कि इसका एक नाम है: कतरनी परिवर्तन ।
इस परिवर्तन की कल्पना करना अच्छा है:
ध्यान दें कि हर क्षैतिज रेखा (निश्चित y
) का अनुवाद कैसे किया जाता है।
हम बस लाइन y = 1
को अपनी नई 1 डी लाइन के रूप में लेते हैं , और इसे 2 डी मैट्रिक्स के साथ अनुवाद करते हैं।
3 डी में चीजें समरूप हैं, 4 डी कतरनी के रूप में:
| 1 0 0 dx | | x | | x + dx |
| 0 1 0 dy | * | y | = | y + dy |
| 0 0 1 dz | | z | | z + dz |
| 0 0 0 1 | | 1 | | 1 |
और हमारे पुराने 3D घुमाव / स्केलिंग अब रूप में हैं:
| a b c 0 |
| d e f 0 |
| g h i 0 |
| 0 0 0 1 |
यह जेमी किंग वीडियो ट्यूटोरियल भी देखने लायक है।
अंतरिक्ष को प्रभावित करें
Affine स्पेस हमारे सभी 3 डी रैखिक परिवर्तनों (मैट्रिक्स गुणन) द्वारा 4D कतरनी (3D अनुवाद) के साथ मिलकर उत्पन्न होता है।
यदि हम एक कतरनी मैट्रिक्स और एक 3 डी रैखिक परिवर्तन को गुणा करते हैं, तो हमें हमेशा फॉर्म का कुछ मिलता है:
| a b c dx |
| d e f dy |
| g h i dz |
| 0 0 0 1 |
यह सबसे सामान्य संभव चक्करदार परिवर्तन है, जो 3 डी रोटेशन / स्केलिंग और अनुवाद करता है।
एक महत्वपूर्ण संपत्ति यह है कि यदि हम 2 शमन मेट्रिसेस को गुणा करते हैं:
| a b c dx | | a2 b2 c2 dx2 |
| d e f dy | * | d2 e2 f2 dy2 |
| g h i dz | | g2 h2 i2 dz2 |
| 0 0 0 1 | | 0 0 0 1 |
हमें हमेशा फॉर्म का एक और एफिन मैट्रिक्स मिलता है:
| a3 b3 c3 (dx + dx2) |
| d3 e3 f3 (dy + dy2) |
| g3 h3 i3 (dz + dz2) |
| 0 0 0 1 |
गणितज्ञ इस संपत्ति को बंद करते हैं , और एक स्थान को परिभाषित करने के लिए आवश्यक है।
हमारे लिए, इसका अर्थ है कि हम अंतिम रूपांतरों को ख़ुशी से परिकलन करने के लिए मैट्रिक्स गुणा कर सकते हैं, यही वजह है कि पहली बार में उपयोग किए गए मेट्रिसेस का उपयोग करें, बिना सामान्य रूप से अधिक 4 डी रैखिक परिवर्तन किए जो कि नमकीन नहीं हैं।
फ्रस्ट्रम प्रोजेक्शन
लेकिन रुकिए, एक और महत्वपूर्ण परिवर्तन है जो हम हर समय करते हैं: glFrustum
जो आगे 2x एक वस्तु बनाता है, 2x छोटा दिखाई देता है।
पहले के बारे में कुछ अंतर्ज्ञान प्राप्त glOrtho
बनाम glFrustum
पर: https://stackoverflow.com/questions/2571402/explain-the-usage-of-glortho/36046924#36046924
glOrtho
केवल अनुवाद + स्केलिंग के साथ किया जा सकता है, लेकिन हम glFrustum
मैट्रिसेस के साथ कैसे लागू कर सकते हैं ?
मान लो कि:
z = -1
उस पर लंबाई 2 का एक वर्ग हैz = -2
यदि केवल हम सामान्य प्रकार के 4 से अधिक वैक्टर की अनुमति देते हैं:
(x, y, z, w)
के साथ w != 0
, और इसके अलावा हम हर के (x, y, z, w)
साथ की पहचान करते हैं (x/w, y/w, z/w, 1)
, तब मैट्रिक्स के साथ एक फ्रुम परिवर्तन होगा:
| 1 0 0 0 | | x | | x | | x / -z |
| 0 1 0 0 | * | y | = | y | identified to | y / -z |
| 0 0 1 0 | | z | | z | | -1 |
| 0 0 -1 0 | | w | | -z | | 0 |
यदि हम दूर z
और w
अंत में फेंक देते हैं, तो हम प्राप्त करते हैं:
x_proj = x / -z
y_proj = y / -z
जो वास्तव में हम चाहते थे! हम कुछ मूल्यों के लिए इसे सत्यापित कर सकते हैं, जैसे:
z == -1
, ठीक उसी तल पर, जिस पर हम प्रोजेक्ट कर रहे हैं, x_proj == x
और y_proj == y
।z == -2
, तो x_proj = x/2
: वस्तुएं आधे आकार की हैं।ध्यान दें कि glFrustum
ट्रांसफॉर्मेशन एफाइन फॉर्म का नहीं है: इसे सिर्फ घुमाव और अनुवाद के साथ लागू नहीं किया जा सकता है।
w
इसे जोड़ने और विभाजित करने के गणितीय "प्रवंचना" को सजातीय निर्देशांक कहा जाता है
इसे भी देखें: संबंधित स्टैक ओवरफ्लो प्रश्न: https://stackoverflow.com/questions/2465116/understanding-opengl-matrices
मॉडल, दृश्य और प्रक्षेपण की अवधारणाओं को समझने के लिए इस वीडियो को देखें ।
4x4 मैट्रिस का उपयोग सिर्फ 3 डी ऑब्जेक्ट के अनुवाद के लिए नहीं किया जाता है। लेकिन विभिन्न अन्य प्रयोजनों के लिए भी।
यह समझने के लिए इसे देखें कि दुनिया में शीर्ष रेखाओं को 4D मैट्रिक्स के रूप में कैसे दर्शाया जाता है और वे कैसे रूपांतरित होते हैं।