जीएलएम: यूलर एंगल टू क्वाटर्नियन


12

मुझे आशा है कि आप GL गणित ( GLM ) को जानते हैं क्योंकि मुझे एक समस्या है, मैं नहीं तोड़ सकता:

मेरे पास यूलर एंगल्स का एक सेट है और मुझे उनके बीच सुचारू प्रक्षेप करने की आवश्यकता है । सबसे अच्छा तरीका उन्हें Quaternions में परिवर्तित कर रहा है और SLERP alrogirthm को लागू कर रहा है।

मेरे पास यह मुद्दा है कि glm को कैसे शुरू किया जाए: Euler Angles के साथ quaternion, कृपया?

मैंने जीएलएम डॉक्यूमेंटेशन को बार-बार पढ़ा , लेकिन मुझे यह उचित नहीं लगा Quaternion constructor signature, कि तीन यूलर एंगल लगेगा। मैंने जो सबसे निकटतम पाया, वह है कोणअक्सिस () फ़ंक्शन, कोण मान और उस कोण के लिए एक अक्ष ले रहा है। ध्यान दें, कृपया, मैं सी की राह देख रहा हूं, कैसे पार्स करना है RotX, RotY, RotZ


आपकी जानकारी के लिए, यह ऊपर लिखा हुआ कोण कोण है () फ़ंक्शन हस्ताक्षर :

detail::tquat< valType > angleAxis (valType const &angle, valType const &x, valType const &y, valType const &z)

जवाबों:


13

मैं GLM से परिचित नहीं हूं, लेकिन एक फ़ंक्शन के अभाव में सीधे यूलर एंगल्स से चतुर्धातुक में परिवर्तित होने के लिए, आप "अक्ष के चारों ओर घुमाव" का उपयोग कर सकते हैं (जैसे कि "एंगल एक्सिस") इसे स्वयं।

यहाँ बताया गया है कि (छद्मकोश):

Quaternion QuatAroundX = Quaternion( Vector3(1.0,0.0,0.0), EulerAngle.x );
Quaternion QuatAroundY = Quaternion( Vector3(0.0,1.0,0.0), EulerAngle.y );
Quaternion QuatAroundZ = Quaternion( Vector3(0.0,0.0,1.0), EulerAngle.z );
Quaternion finalOrientation = QuatAroundX * QuatAroundY * QuatAroundZ;

(या आपको उन चतुर्धातुक गुणकों को चारों ओर से बदलने की आवश्यकता हो सकती है, यह उस क्रम पर निर्भर करता है जिसमें आपका यूलर एंगल रोटेशन लागू होने का इरादा है)

वैकल्पिक रूप से, जीएलएम के प्रलेखन को देखने से, ऐसा प्रतीत होता है कि आप यूलर एंगल्स -> मैट्रिक्स 3 -> चतुर्धातुक को इस तरह परिवर्तित करने में सक्षम हो सकते हैं:

toQuat( orient3( EulerAngles ) )

अच्छा जवाब क्योंकि यह आवेदन के आदेश के बारे में कम अस्पष्ट है।
रिचर्ड फैबियन

@ ट्रेवर: +1, हाय ट्रेवर, आपके अच्छे उत्तर के लिए धन्यवाद। यह यहां सबसे व्यावहारिक समाधान की तरह दिखता है। मैं आसानी से रोटेशन गुणन क्रम के बीच स्विच कर सकता हूं। संभवतः, संयोजनों की संख्या ही कारण है, क्यों Euler Angle to Quaterion रूपांतरण GLM में उपलब्ध नहीं है।
बंकई.टोरि

यद्यपि सभी उत्तर अच्छे और मूल्यवान हैं, मेरी राय में, यह सबसे व्यावहारिक है। मैं इसे स्वीकृत उत्तर के रूप में चिह्नित करना चाहूंगा ।
बंकई.टोरि

@ ट्रेवर: क्वाटरनियन फाइनल में = QuatAroundX * QuatAroundY * QuatAroundZ ?, आप किस तरह के गुणन का मतलब निकाल चुके हैं? मुझे आश्चर्य है, कि जीएलएम, operator *क्वाटरनियन गुणन के लिए अधिभार नहीं डालता है, इसलिए संभवतः, मुझे मैन्युअल रूप से गुणा करना होगा
Bunkai.Satori

3
@ चतुराई गुणन की अवधारणा मैट्रिक्स गुणन के समान है, यह न तो डॉट है और न ही क्रॉस उत्पाद है। यदि आप चतुष्कोणों के उपयोग को समझना चाहते हैं, तो मेट्रिसेस के लिए उपयोग करें और अक्ष-कोणों को समझें, उनकी मूल अवधारणा चतुर्भुजों के समान है, गणित थोड़ा अधिक उन्नत है, लेकिन एक बार जब आप अक्ष-कोणों को समझ जाते हैं, तो चतुर्भुज नहीं होते हैं अब और दूर।
माईक सेमर

16
glm::quat myquaternion = glm::quat(glm::vec3(angle.x, angle.y, angle.z));

कहाँ angleएक है glm::vec3युक्त पिच, विचलन, रोल क्रमशः।

पुनश्च। यदि संदेह है, तो केवल हेडर पर जाएं और देखें। परिभाषा glm / gtc / quaternion.hpp में पाई जा सकती है:

explicit tquat(tvec3<T> const & eulerAngles) {
        tvec3<T> c = glm::cos(eulerAngle * value_type(0.5));
    tvec3<T> s = glm::sin(eulerAngle * value_type(0.5));

    this->w = c.x * c.y * c.z + s.x * s.y * s.z;
    this->x = s.x * c.y * c.z - c.x * s.y * s.z;
    this->y = c.x * s.y * c.z + s.x * c.y * s.z;
    this->z = c.x * c.y * s.z - s.x * s.y * c.z;    
}

जहां के quatलिए एक फ्लोट टाइपडिफ है tquat


यह काफी अस्पष्ट है, ये किस क्रम में लागू होंगे? यूलर्स को रोटेशन का आदेश दिया जाता है और यहां के क्वाटेरियन कंस्ट्रक्टर को इसकी परवाह नहीं है।
रिचर्ड फैबियन

फ़ंक्शन परिभाषा आपकी जैसी ही है; मैंने इसे अपने उत्तर में पोस्ट किया अगर यह मामला था।
deceleratedcaviar

तर्कों का क्रम नहीं, रोटेशन के आवेदन का क्रम। मेरे उत्तर में XYZ ऑर्डरिंग है, विकिपीडिया लेख से लिया गया है, हालांकि, हम अपने पुराने कंपनी में ZYX ऑर्डरिंग का उपयोग करते हैं, और मेरे वर्तमान में YZX। x कोण अभी भी सभी मामलों में वेक्टर / तर्क सूची में पहला मान है, लेकिन वास्तविक परिणामी परिवर्तन समान नहीं है।
रिचर्ड फैबियन

मैंने रोटेशनक्वाट के लिए अपना जवाब तय किया, ताकि आप देख सकें कि आप आसानी से ऑर्डर कैसे बदल सकते हैं। डिफ़ॉल्ट रूप से यह XYZ को स्वीकार करता है, लेकिन आप इसे आसानी से बदल सकते हैं।
deceleratedcaviar

2
-1 रोटेशन ऑर्डर का उल्लेख नहीं करने के लिए, जो कि प्रश्न के लिए बहुत महत्वपूर्ण है
Maik Semder

7

समाधान विकिपीडिया में है: http://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles

उस का उपयोग:

sx = sin(x/2); sy = sin(y/2); sz = sin(z/2);
cx = cos(x/2); cy = cos(y/2); cz = cos(z/2);

q( cx*cy*cz + sx*sy*sz,
   sx*cy*cz - cx*sy*sz,
   cx*sy*cz + sx*cy*sz,
   cx*cy*sz - sx*sy*cz ) // for XYZ application order

q( cx*cy*cz - sx*sy*sz,
   sx*cy*cz + cx*sy*sz,
   cx*sy*cz - sx*cy*sz,
   cx*cy*sz + sx*sy*cz ) // for ZYX application order

एक quaternion के लिए कंस्ट्रक्टर, एक यूलर (जहां रोटेशन का आवेदन XYZ या ZYX है) दिया गया। हालांकि, यह यूलर कोणों के छह संभावित संयोजनों में से केवल दो हैं। आपको वास्तव में यह पता लगाना होगा कि मैट्रिक्स को रूपांतरित करते समय यूलर कोणों का निर्माण किस क्रम में किया जाता है। तभी समाधान को परिभाषित किया जा सकता है।

जिस पुरानी कंपनी में मैंने काम किया था, हमारे पास Z था (जैसे अधिकांश ग्राफिक्स कार्ड), इसलिए एप्लिकेशन ऑर्डर ZYX था, और मेरी वर्तमान कंपनी में Y अक्ष आगे है और Z ऊपर है, इसलिए हमारा एप्लिकेशन ऑर्डर YZX है। यह आदेश वह आदेश है जिसे आप अपने अंतिम परिवर्तनों को उत्पन्न करने के लिए अपने quaternions को एक साथ गुणा करते हैं, और रोटेशन के लिए आदेश मायने रखता है गुणन सराहनीय नहीं हैं।


1
+1, हाय और महान जवाब के लिए धन्यवाद। जैसे ही मैं OpenGL का उपयोग करता हूं , Z मान स्क्रीन से बाहर चला जाता है। अपने आवेदन में मैं ZYX गुणन क्रम करता हूं । मूल रूप से, मैंने सोचा, कि GLM के पास यह कार्यक्षमता उपलब्ध है, लेकिन मैं देख रहा हूं, उन्होंने इसे अभी तक लागू नहीं किया है, इसलिए एक विकल्प मैन्युअल रूप से रूपांतरण का निर्माण कर रहा है , जैसा कि आप अनुशंसा करते हैं।
बंकई.टोरि

यह यहां सबसे अच्छा जवाब है।
प्लाज़्मासेल जुएल

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