2012-12-19 37 views
5

सबसे आसान तरीका है एक सममितीय परिवर्तन करने के लिए एक affine परिवर्तन कन्वर्ट करने के लिए क्या है (यानी केवल एक रोटेशन और अनुवाद से मिलकर) Eigen लाइब्रेरी का उपयोग करने के लिए एक Eigen affine परिवर्तन कन्वर्ट?एक Eigen isometry परिवर्तन

दोनों परिवर्तन 3 डी हैं। एफ़िन मैट्रिक्स में शीर्ष बाएं चतुर्भुज के लिए एक सामान्य 3x3 मैट्रिक्स (यानी रोटेशन, स्केलिंग और कतरनी) होता है, जबकि आइसोमेट्री में एक ही चतुर्भुज के लिए 3x3 रोटेशन मैट्रिक्स होता है, इसलिए एक प्रक्षेपण आवश्यक होता है।

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

जबकि

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a.rotation(), a.translation()); 

देता

(line 2) error C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform' : no overloaded function takes 2 arguments

और

:

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a); 

संकलन त्रुटि देता है

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.rotation() = a.rotation(); 

(line 4) error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion)

देता रोटेशन() और अनुवाद को देखते हुए() काम करता है, प्रश्न के रूप में rephrased जा सकता है "मैं सबसे अच्छा बदलने एक सममितीय के रोटेशन और अनुवाद घटकों निर्धारित करूं?"

+0

आपको निर्दिष्ट करना चाहिए कि आप कौन सी लाइब्रेरी या टूलकिट का उपयोग कर रहे हैं, क्योंकि वे मानक C++ प्रकार या नाम नहीं हैं। – abelenky

+2

मैं ईजिन (एक प्रसिद्ध सी ++ गणित पुस्तकालय) का उपयोग कर रहा हूं, जैसा कि मैंने शीर्षक और पाठ में कहा था। मैं इसे स्पष्ट बनाने के लिए एक लिंक जोड़ दूंगा। – user664303

उत्तर

5

। अनुवाद() परिवर्तन के घूर्णन भाग निकालें। इसमें एक एसवीडी शामिल है, और इस प्रकार यह केवल पढ़ने के लिए है। बाएं हाथ की ओर पर, आप) .linear उपयोग करने के लिए (है:

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.linear() = a.rotation(); 

आप जानते हैं कि 'एक' एक isometry है और केवल एक isometry 3F करने के लिए इसे कास्ट करना चाहते हैं, तो आप बस कर सकते हैं:

b = a.matrix();