आप एक परिवर्तन मैट्रिक्स से अभिविन्यास कैसे निकाल सकते हैं?


10

मेरे पास 4x4 ट्रांसफ़ॉर्मेशन मैट्रिक्स एम है, और मैं एम द्वारा रूपांतरित होने पर एक गोले के आकार का पता लगाना चाहता हूं (स्फियर मूल में है और त्रिज्या 1. है)

मुझे पता है कि मैं केवल (0,0,0,1) M से गुणा करके केंद्र पा सकता हूं।

हालाँकि, त्रिज्या एक समस्या बन जाती है क्योंकि एम स्क्वैश कर सकता है और गोले को घुमा सकता है। मैं परिणामी दीर्घवृत्त के नए त्रिज्या (तों) का पता कैसे लगा सकता हूं? क्या ओरिएंटेशन का पता लगाने का कोई तरीका है?

अधिक विशेष रूप से, मुझे बाउंडिंग क्षेत्र के आकार को जानने की आवश्यकता है जो रूपांतरित क्षेत्र को संलग्न करेगा। दूसरे शब्दों में, अधिकतम क्या है। M * V - M * (0,0,0,1) |, जहां V एक इकाई वेक्टर (मूल क्षेत्र पर एक बिंदु) है।


1
क्या आप केवल रूपांतरित कुल्हाड़ियों वाले वैक्टर की लंबाई की गणना नहीं कर सकते हैं? (आपके मैट्रिक्स के रोटेशन वाले हिस्से के 3 कॉलम) बाउंडिंग गोले का दायरा सबसे लंबे वेक्टर की लंबाई के बराबर होगा।
बार्ट

नहीं, मुझे नहीं लगता कि यह सही है। सबसे लंबी दिशा अक्ष संरेखित नहीं हो सकती है। (कल्पना करें कि अगर आपने इसे
निचोड़ा

हम्म, यह सुनिश्चित नहीं है कि मायने रखता है। अगर मैं खुद को समझाने का प्रबंधन करता हूं तो मैं आज उत्तर दूंगा। ;)
बार्ट

समस्या यह है, यदि आप SCALE परिवर्तन करते हैं, तो M मैट्रिक्स के बेस वैक्टर को एक-दूसरे को ORTHOGONAL नहीं रहना पड़ता है।
24

जवाबों:


6

गणितीय रूप से, आप जिस मात्रा के बारे में पूछ रहे हैं, उसे ऑपरेटर मानदंड कहा जाता है । दुर्भाग्य से, इसके लिए कोई सरल सूत्र नहीं है। यदि यह पूरी तरह से सामान्य एफाइन परिवर्तन है - उदाहरण के लिए, अगर यह किसी भी क्रम में घुमावों और गैर-समान तराजू का एक मनमाना संयोजन हो सकता है - तो मुझे डर है कि इसके लिए कुछ भी नहीं है, बल्कि एकवचन मूल्य अपघटन का उपयोग करना है । यदि आप एसवीडी को अपने मैट्रिक्स पर लागू करते हैं तो सबसे बड़ा विलक्षण मान परिणामी दीर्घवृत्त का अधिकतम त्रिज्या होगा। अन्य एकवचन मान भी इसके अन्य दो रेडी होंगे, और एसवीडी प्रक्रिया आपके लिए कुल्हाड़ियों के उन्मुखीकरण को भी निकाल सकती है।

एसवीडी को लागू करना दिल के बेहोश होने के लिए नहीं है, क्योंकि इसमें आइगेनवैल्यूज़ खोजना शामिल है। यदि आप चाहते हैं कि सभी स्वयं एकवचन मान हैं, तो वे M ^ T * M. के आइगेनवेल्यूज़ की वर्गाकार जड़ें हैं। इसलिए यदि आपके पास एक 3x3 ईजेनवेल्यू सॉल्वर है, या आप एक लिखने का मन नहीं रखते हैं, तो आप इसका उपयोग कर सकते हैं। यदि आप कुल्हाड़ियों के झुकाव को भी बाहर निकालना चाहते हैं, तो यह अधिक शामिल हो जाता है क्योंकि आपको eigenvectors को भी ढूंढना होगा। उस विकिपीडिया लेख पर एसवीडी करने के लिए पुस्तकालयों के लिंक की एक सूची है, जिसमें से एक आप अपनी परियोजना में उपयोग करने में सक्षम हो सकते हैं।

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


धन्यवाद, मैं विस्तृत प्रतिक्रिया की सराहना करता हूं। अन्य उत्तर में प्रदान किया गया अपघटन कार्य करने में विफल नहीं होता है?
कैप्टनकोडरमैन

2
@CaptainCodeman अन्य उत्तर केवल परिवर्तित अक्ष वैक्टर (मैट्रिक्स के कॉलम) को देख रहा है, जैसे मैंने अपने तीसरे पैराग्राफ में क्या वर्णित किया है। यह उस मामले में विफल रहता है जब रोटेशन के बाद एक गैर-वर्दी पैमाने होता है, तब से स्केलिंग मूल अक्षों पर लागू नहीं होती है।
नाथन रीड 21

2

हो सकता है कि मैट्रिक्स से बड़े पैमाने पर कारक निकालें और फिर इसके घटकों का अधिकतम मूल्य उपयोग करें। SRT (स्केल-रोटेशन-ट्रांसलेशन) मैट्रिक्स का उपयोग करके आप ऐसा कर सकते हैं:

glm::mat4 m = ...;
// Extract col vectors of the matrix
glm::vec3 col1(m[0][0], m[0][1], m[0][2]);
glm::vec3 col2(m[1][0], m[1][1], m[1][2]);
glm::vec3 col3(m[2][0], m[2][1], m[2][2]);
//Extract the scaling factors
glm::vec3 scaling;
scaling.x = glm::length(col1);
scaling.y = glm::length(col2);
scaling.z = glm::length(col3);

float scaleFactor = MAX(scaling.x, MAX(scaling.y, scaling.z));

( http://wklej.org/id/950061/ के आधार पर - नाम decomposeTRS है और decomposeSRT नहीं है क्योंकि मैं ऑर्डर पर लिखे नामों का उपयोग करता हूं, जो मैट्रिक्‍स ओपनजीएल में गुणा किए जाते हैं)।

अब आप स्केलफैक्टर द्वारा मूल क्षेत्र की त्रिज्या को गुणा कर सकते हैं और आपके पास अपना सीमा क्षेत्र है।

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