द्वारा परिभाषित घूर्णन से 3x3 रोटेशन मैट्रिक्स की गणना करने के लिए कुशल तरीका, जबकि मुझे इसके 2 समाधान मिल गए हैं, लेकिन अगर मैं इस ऑपरेशन को करने के लिए अच्छी तरह से ज्ञात विधि है तो यह उत्सुक था क्योंकि यह काफी आम काम लगता है।दो 3 डी वेक्टर
यहाँ 2 स्पष्ट तरीकों psudo-कोड रहे हैं ...
एक्सिस कोण
यह काफी तार्किक है, लेकिन (रूपांतरण मैट्रिक्स कोण गणना और अक्ष कोण में) sin
कॉल दो बार और एक बार cos
।
Matrix3x3 rotation_between_vectors_to_matrix(const Vector v1, const Vector v2)
{
angle = v1.angle(v2);
axis = v1.cross(v2);
/* maths for this is well known */
Matrix3x3 matrix = axis_angle_to_matrix(axis, angle);
return matrix;
}
संपादित: सबसे सरल कार्य है, एक काफी धीमी है लेकिन जैसा कि यहाँ उत्तर में बताया गया है: कोण की गणना angle_sin
और angle_cos
रही, अक्ष लंबाई और v1,v2
डॉट से से बचा जा सकता क्रमशः उत्पाद।
के बीच
अंतर यहाँ एक और तरीका मैंने पाया जो वैक्टर से दो 3x3 मैट्रिक्स निर्माण करती है और अंतर देता है।
हालांकि यह धीमा है तो अक्ष/कोण गणना जिसे अनुकूलित किया जा सकता है (ऊपर उल्लिखित)।
नोट। यह मानता है कि दोनों वैक्टर सामान्यीकृत हैं, मैट्रिक्स कॉलम-प्रमुख (ओपनजीएल) है।
Matrix3x3 rotation_between_vectors_to_matrix(const Vector v1, const Vector v2)
{
Matrix3x3 m1, m2;
axis = v1.cross(v2);
axis.normalize();
/* construct 2 matrices */
m1[0] = v1;
m2[0] = v2;
m1[1] = axis;
m2[1] = axis;
m1[2] = m1[1].cross(m1[0]);
m2[2] = m2[1].cross(m2[0]);
/* calculate the difference between m1 and m2 */
m1.transpose();
Matrix3x3 matrix = m2 * m1;
return matrix;
}
क्या इस गणना को करने के बेहतर तरीके हैं?
संपादित करें: इस प्रश्न का उद्देश्य माइक्रो-ऑप्टिमाइज़ और प्रत्येक विधि को बेंचमार्क नहीं करना है। इसके बजाए - अगर मैं कुछ पूरी तरह से अलग और बेहतर तरीका है जो मुझे नहीं पता था तो मैं उत्सुक था।
नोट: मैं उद्देश्यपूर्ण सह-रैखिक वैक्टर के लिए पतित मामले (जहां अक्ष शून्य लंबाई है) के लिए चेक बाहर छोड़ दिया, उदाहरण सरल रखने के लिए।
@ किंवदंतियों 2k, जहां तक मुझे पता है, मुझे अक्ष/कोण विधि के बेहतर विकल्प देखने के दौरान यह स्वयं ही मिला। (अपने अच्छी तरह से परीक्षण किया और यह पतित मामलों में भी काम कर गया) – ideasman42
आप एक ही परिणाम प्राप्त shoudn't अगर आप m1.transpose बारे में(); मैट्रिक्स = एम 2 * एम 1; वापसी मैट्रिक्स; ? एक ट्रांज़ेक्शन ऑपरेशन बचाएगा। – SpiderPig
@ ideasman42: हाँ, समझ गया। एक दो और बी मैट्रिक्स हो, उन दोनों के बीच _difference_, तो 'कुल्हाड़ी = b' ⇒' एक्स = A⁻¹B' के रूप में कुछ मैट्रिक्स एक्स के साथ। चूंकि शुद्ध रोटेशन को ऑर्थोगोनल मैट्रिक्स द्वारा दर्शाया जाता है, इसलिए इसका स्थानांतरण इसके विपरीत है।मुझे लगता है कि दूसरा ट्रांज़ेप अनावश्यक है, अगर आप 'एम 1' को ट्रांसफर करते हैं और फिर इसे 'एम 2' से गुणा करते हैं। – legends2k