संचयी मैट्रिक्स परिवर्तनों का उपयोग करके जिम्बल लॉक समस्या को कैसे हल किया जाता है


12

मैं जेसन एल। मैककेसन द्वारा ऑनलाइन "लर्निंग मॉडर्न 3 डी ग्राफिक्स प्रोग्रामिंग" पुस्तक पढ़ रहा हूं

अब तक, मैं जिम्बल लॉक की समस्या के बारे में हूं और इसे चतुष्कोणों का उपयोग करके कैसे हल किया जाए।

हालाँकि यहीं, Quaternions पेज पर

समस्या का हिस्सा यह है कि हम 3 संचित अक्षीय घुमावों की एक श्रृंखला के रूप में एक अभिविन्यास को संग्रहीत करने की कोशिश कर रहे हैं। ओरिएंटेशन ओरिएंटेशन हैं, रोटेशन नहीं। और झुकाव निश्चित रूप से घुमावों की एक श्रृंखला नहीं है। इसलिए हमें एक विशिष्ट मात्रा के रूप में, एक अभिविन्यास के रूप में जहाज के उन्मुखीकरण का इलाज करने की आवश्यकता है।

मुझे लगता है कि यह पहला स्थान है जिसे मैं भ्रमित करना शुरू करता हूं, इसका कारण यह है कि मैं झुकाव और घुमाव के बीच नाटकीय अंतर नहीं देखता हूं। मुझे यह भी समझ में नहीं आता है कि एक अभिविन्यास को घूर्णन की एक श्रृंखला द्वारा क्यों नहीं दर्शाया जा सकता है ...

इसके अलावा:

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

इसका मतलब यह है कि वर्तमान अभिविन्यास पर लागू होने वाला प्रत्येक जबाव, पिच और रोल उस वर्तमान अभिविन्यास के सापेक्ष होंगे। ठीक वही है जो हमें चाहिए। यदि उपयोगकर्ता एक पॉजिटिव यव लगाता है, तो आप चाहते हैं कि जब वे वर्तमान पॉइंटिंग सिस्टम के सापेक्ष उन्हें घुमाएं, न कि किसी निश्चित समन्वित प्रणाली के सापेक्ष।

अवधारणा, मुझे समझ में आता है, हालांकि मुझे समझ में नहीं आता है कि यदि मैट्रिक्स ट्रांसफॉर्मेशन जमा करना इस समस्या का समाधान है, तो पिछले पृष्ठ में दिए गए कोड कैसे नहीं हैं।

यहाँ कोड है:

void display()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glutil::MatrixStack currMatrix;
    currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f));
    currMatrix.RotateX(g_angles.fAngleX);
    DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f));
    currMatrix.RotateY(g_angles.fAngleY);
    DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f));
    currMatrix.RotateZ(g_angles.fAngleZ);
    DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f));

    glUseProgram(theProgram);
    currMatrix.Scale(3.0, 3.0, 3.0);
    currMatrix.RotateX(-90);
    //Set the base color for this object.
    glUniform4f(baseColorUnif, 1.0, 1.0, 1.0, 1.0);
    glUniformMatrix4fv(modelToCameraMatrixUnif, 1, GL_FALSE, glm::value_ptr(currMatrix.Top()));

    g_pObject->Render("tint");

    glUseProgram(0);

    glutSwapBuffers();
}

मेरी समझ में यह नहीं है कि वह क्या कर रहा है (स्टैक पर मैट्रिक्स को संशोधित करना), संचित मैट्रिक्स को माना जाता है, क्योंकि लेखक ने सभी व्यक्तिगत रोटेशन ट्रांसफ़ॉर्मेशन को एक मैट्रिक्स में जोड़ दिया है जो स्टैक के शीर्ष पर संग्रहीत किया जा रहा है।

मैट्रिक्स के बारे में मेरी समझ यह है कि वे एक बिंदु लेने के लिए उपयोग किए जाते हैं जो एक मूल के सापेक्ष है (मान लीजिए ... मॉडल), और इसे किसी अन्य मूल (कैमरा) के सापेक्ष बनाते हैं। मुझे पूरा यकीन है कि यह एक सुरक्षित परिभाषा है, हालांकि मुझे ऐसा लगता है कि कुछ याद आ रहा है जो मुझे इस जिम्बल लॉक समस्या को समझने से रोक रहा है।

एक बात जो मुझे समझ में नहीं आती है: यदि कोई मैट्रिक्स दो "रिक्त स्थान के बीच के अंतर को निर्धारित करता है," कैसे Y अक्ष के चारों ओर घूमता है, तो आइए कहते हैं, रोल करें, बिंदु को "रोल स्पेस" में न रखें। "जो फिर इस रोल के संबंध में एक बार फिर से रूपांतरित किया जा सकता है ... दूसरे शब्दों में इस बिंदु के लिए कोई और परिवर्तन नहीं होना चाहिए इस नए" रोल स्पेस "के संबंध में और इसलिए रोटेशन पिछले के सापेक्ष नहीं होना चाहिए" मॉडल स्पेस "जो जिम्बल लॉक का कारण बन रहा है।

इसलिए जिम्बल लॉक सही होता है? यह इसलिए है क्योंकि हम सेट X, Y और Z कुल्हाड़ियों के आसपास की वस्तु को घुमा रहे हैं, बजाय इसके कि वह स्वयं, सापेक्ष कुल्हाड़ियों के आसपास की वस्तु को घुमा रहा है । या मैं गलत हूँ?

जाहिरा तौर पर इस कोड से मैं जुड़ा हुआ हूं मैट्रिक्स परिवर्तनों का एक संचय नहीं है जो आप इस पद्धति का उपयोग करके समाधान का एक उदाहरण दे सकते हैं।

तो संक्षेप में:

  • एक रोटेशन और एक अभिविन्यास के बीच अंतर क्या है?
  • कोड को मैट्रिक्स परिवर्तनों के संचय का उदाहरण क्यों नहीं कहा गया है?
  • यदि मैं गलत था, तो मैट्रिक्स का वास्तविक, विशिष्ट उद्देश्य क्या है?
  • मैट्रिक्स परिवर्तनों के संचय का उपयोग करके जिम्बल लॉक समस्या का समाधान कैसे लागू किया जा सकता है?
  • इसके अलावा, एक बोनस के रूप में: रोटेशन के बाद भी परिवर्तन "मॉडल स्थान" के सापेक्ष क्यों हैं?
  • एक और बोनस: क्या मैं इस धारणा में गलत हूं कि एक परिवर्तन के बाद, वर्तमान के सापेक्ष और परिवर्तन होंगे?

इसके अलावा, अगर यह निहित नहीं था, तो मैं ओपनजीएल, जीएलएसएल, सी ++ और जीएलएम का उपयोग कर रहा हूं, इसलिए यदि आवश्यक नहीं है तो इन के संदर्भ में उदाहरण और स्पष्टीकरण बहुत सराहना करते हैं।

और अधिक विस्तार बेहतर!

अग्रिम में धन्यवाद।

जवाबों:


11

मैं इसे प्रस्तुत करने के लिए एक अच्छे तरीके के बारे में सुनिश्चित नहीं हूं, इसके अलावा मुझे उम्मीद है कि यह अंत तक अच्छी तरह से एक साथ संबंध रखेगा। उस ने कहा, चलो में गोता:

एक रोटेशन और एक अभिविन्यास अलग हैं क्योंकि पूर्व एक परिवर्तन का वर्णन करता है, और बाद वाला एक राज्य का वर्णन करता है। एक घुमाव यह है कि कैसे एक वस्तु एक अभिविन्यास में मिलती है , और एक अभिविन्यास वस्तु का स्थानीय घुमा हुआ स्थान है । यह सीधे तौर पर संबंधित हो सकता है कि दोनों को गणितीय रूप से कैसे दर्शाया गया है: एक मैट्रिक्स एक समन्वय स्थान से दूसरे में परिवर्तन करता है (आपके पास यह सही था), और एक quaternion सीधे एक अभिविन्यास का वर्णन करता है। मैट्रिक्स, इसलिए, केवल यह वर्णन कर सकता है कि घुमाव की एक श्रृंखला के माध्यम से वस्तु कैसे एक अभिविन्यास में मिलती है । हालांकि, इसके साथ समस्या गिंबल लॉक है।

Gimbal लॉक घूर्णन की एक श्रृंखला का उपयोग करके एक अभिविन्यास में एक वस्तु प्राप्त करने की कठिनाई को दर्शाता है। समस्या तब होती है जब रोटेशन के कम से कम दो अक्षों को संरेखित किया जाता है:

की छवि सौजन्य deepmesh3d.com
ऊपर की बाईं छवि में, नीले और नारंगी अक्ष एक ही घुमाव बनाते हैं! यह एक समस्या है, क्योंकि इसका मतलब है कि स्वतंत्रता की तीन डिग्री में से एक खो गई है, और इस बिंदु से अतिरिक्त घुमाव अप्रत्याशित परिणाम उत्पन्न कर सकते हैं। क्वाटरनियन्स का उपयोग यह हल करता है क्योंकि किसी ऑब्जेक्ट के ओरिएंटेशन को बदलने के लिए एक क्वैश्चन को लागू करें, ऑब्जेक्ट को रोल, पिच, और यव ऑपरेशंस में ट्रांसफॉर्मेशन को तोड़ने के बजाय सीधे एक नए ओरिएंटेशन में लगाएगा (यानी मैं इसे सबसे अच्छा तरीका कह सकता हूं)।

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

pTransformed = q * pAsQuaternion * qConjugate

या एक मैट्रिक्स में चतुर्धातुक को रूपांतरित करके और उस मैट्रिक्स का उपयोग करके बिंदु को परिवर्तित करें।

एक सादा मैट्रिक्स घुमाव (जैसे 45 डिग्री यव) को हमेशा वैश्विक अंतरिक्ष में परिभाषित किया जाएगा। यदि आप स्थानीय स्थान में परिवर्तन लागू करना चाहते हैं, तो आपको अपने परिवर्तन को उस स्थानीय स्थान में बदलना होगा। यह अजीब लगता है, इसलिए मैं विस्तार से बताऊंगा। यह वह जगह है जहाँ घूर्णन के क्रम का महत्व आता है। मैं यहाँ एक पुस्तक हथियाने की सलाह देता हूँ ताकि आप परिवर्तनों के साथ अनुसरण कर सकें।

पुस्तक फ्लैट से शुरू करें, छत पर इसका कवर ऊपर की ओर उन्मुख है, जैसे कि आप इसे खोलने और पढ़ने के बारे में थे। अब पुस्तक के अग्र भाग को 45 डिग्री तक झुकाएं (सामने का आवरण लगभग आपका सामना करना चाहिए):

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(45);

अब, मान लें कि आप पुस्तक के योग को 45 डिग्री पर समायोजित करना चाहते हैं (मुझे लगता है कि मैं एक दाएं हाथ का समन्वय प्रणाली मान रहा हूं, इसलिए यह बाईं ओर शीर्षक बदल रहा होगा), और आप इसे पुस्तक के स्थानीय पर लागू करना चाहते हैं स्थान का समन्वय करें, ताकि पुस्तक का आवरण अभी भी आपका सामना करे:

bookMatrix.RotateY(45);

समस्या यह है, यह रोटेशन वैश्विक समन्वय स्थान में होता है, इसलिए पुस्तक का आवरण आपके दाहिने कंधे पर समाप्त होगा। स्थानीय समन्वय स्थान में हेडिंग में यह परिवर्तन होने के लिए, आपको इसे पहले लागू करना चाहिए!

glutil::MatrixStack bookMatrix;
bookMatrix.RotateY(45);
bookMatrix.RotateX(45);

कोशिश करके देखो! छत पर फिर से सामना करना पड़ रहा किताब शुरू करें। इसकी यव ४५ डिग्री बदलें, और फिर इसे वैश्विक एक्स अक्ष के साथ ४५ डिग्री पिच (अपने बाएं से दाएं चल रहा है)। यह अभिविन्यास आपने पुस्तक के स्थानीय स्थान में 45 की पिच और 45 के साथ अपेक्षित है।

इसका क्या मतलब है? यह सब वास्तव में नीचे आता है कि संचालन का क्रम मायने रखता है। पहले किए गए रूपांतरण बाद में किए गए परिवर्तनों के संदर्भ में स्थानीय परिवर्तन बन जाते हैं। यह आपके सिर को चारों ओर लपेटने के लिए बहुत कुछ हो जाता है, और यह है कि कैसे quaternions बहुत परेशानी से बचाते हैं। सभी आदेश-निर्भर सामान को छोड़ें।

अन्य विशाल लाभ जो कि चतुर्धातुक प्रदान करते हैं, वह यह है कि वे झुकाव के प्रक्षेप के लिए अनुमति देते हैं। ऑर्डर निर्भरता के कारण यूलर एंगल्स के बीच अंतर करने की कोशिश करना लगभग असंभव है। चतुर्धातुक के गणितीय गुण उनके बीच एक अच्छी तरह से परिभाषित गोलाकार रैखिक प्रक्षेप के लिए अनुमति देते हैं।

चीजों को लपेटने और अपने मूल प्रश्न को संबोधित करने के लिए: संचित मैट्रिक्स रूपांतरण वास्तव में जिम्बल लॉक समस्या को हल नहीं करेंगे, जब तक कि परिवर्तनों को सावधानीपूर्वक चुना और एक सटीक क्रम में लागू नहीं किया जाता है। इसलिए, हमेशा quaternions का उपयोग करें, और quaternion गुणन का उपयोग करके बिंदुओं पर quaternions लागू करें।

उम्मीद है की यह मदद करेगा :)


4
सिर्फ रिकॉर्ड के लिए, क्वाटर्न्स अभी भी गिंबल लॉक को पेश कर सकते हैं यदि यूलर कोण के माध्यम से वर्णित किया गया है; जैसा कि आप एक ही तरीके से एक ही गणना कर रहे होंगे (
मैट्रिस के

1
@ concept3d - इस उल्लेख के लिए बधाई! यह समझना महत्वपूर्ण है कि स्वतंत्रता के एक डिग्री को खोने के लिए जिम्बल तंत्र क्या बनाता है: यह एक रोबोट संयुक्त की तरह है जो स्वाभाविक रूप से समीकरणों की एक निर्धारित प्रणाली का वर्णन करता है। यदि आप इस तंत्र को quaternions, matrices या जादू के साथ बनाते हैं, तो आप अभी भी अस्पष्टता के साथ समाप्त होते हैं - यह इसे समझ रहा है और पहली जगह में इसका उपयोग नहीं कर रहा है जो कि एक वास्तविक समाधान है (जब तक कि आपको कुछ प्रदर्शनकारी या तकनीकी उद्देश्य के लिए इसका उपयोग करने की आवश्यकता न हो) ।
तेओद्रोन

quaternions की कल्पना करना कठिन है, जिस तरह से मैं हमेशा इसके बारे में सोचता हूं वह यह है कि वे (यूनिट quaternions) एक 3-क्षेत्र स्थान का प्रतिनिधित्व करते हैं, इसलिए किसी भी अभिविन्यास का प्रतिनिधित्व कर सकते हैं, जबकि मैं समझता हूं कि Euler कोण प्रत्येक को हलकों / ट्यूरो का प्रतिनिधित्व करते हैं, इसलिए यह एक पूर्ण क्षेत्र नहीं है। अभिविन्यास का प्रतिनिधित्व करने के लिए बहुत सटीक तरीका नहीं है (3 सर्कल / टोरस वास्तव में हर संभव अभिविन्यास उत्पन्न नहीं कर सकते हैं जब तक कि वे स्वतंत्र रूप से घूमते नहीं हैं जो कि यूलर एंगल्स के मामले में संभव नहीं है), निश्चित नहीं कि अगर मैंने सही तरीके से समझाया हो :)
concept3d

1

मैट्रिक्स संचय वास्तव में जिम्बल लॉक को हल कर सकते हैं। घुमावों को जमा करके, आप किसी भी मनमाना रोटेशन की अनुमति देते हुए, जिंबल जोड़ रहे हैं। जो चित्र ktodisco प्रदान करता है वह बाएं आरेख में एक gimbal लॉक दिखाता है। इस अभिविन्यास के लिए मैट्रिक्स को इस प्रकार परिभाषित किया जा सकता है:

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(90);
bookMatrix.RotateY(90);
bookMatrix.RotateZ(90);

वाई जिम्बल रोटेशन के कारण, एक्स और जेड गिंबल्स अब बंद हो गए हैं, इसलिए हमने एक डिग्री आंदोलन खो दिया है। इस बिंदु पर हमारे पास इन तीनों gimbals का उपयोग करने के लिए कोई yawing (स्थानीय y, ग्लोबल z) नहीं है। लेकिन एक और गिमबल जोड़कर, मैं y के आसपास स्थानीय रूप से घूम सकता हूं:

glutil::MatrixStack bookMatrix;
bookMatrix.RotateX(90);
bookMatrix.RotateY(90);
bookMatrix.RotateZ(90);
bookMatrix.RotateY(90);

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

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