मैं जेसन एल। मैककेसन द्वारा ऑनलाइन "लर्निंग मॉडर्न 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 कुल्हाड़ियों के आसपास की वस्तु को घुमा रहे हैं, बजाय इसके कि वह स्वयं, सापेक्ष कुल्हाड़ियों के आसपास की वस्तु को घुमा रहा है । या मैं गलत हूँ?
जाहिरा तौर पर इस कोड से मैं जुड़ा हुआ हूं मैट्रिक्स परिवर्तनों का एक संचय नहीं है जो आप इस पद्धति का उपयोग करके समाधान का एक उदाहरण दे सकते हैं।
तो संक्षेप में:
- एक रोटेशन और एक अभिविन्यास के बीच अंतर क्या है?
- कोड को मैट्रिक्स परिवर्तनों के संचय का उदाहरण क्यों नहीं कहा गया है?
- यदि मैं गलत था, तो मैट्रिक्स का वास्तविक, विशिष्ट उद्देश्य क्या है?
- मैट्रिक्स परिवर्तनों के संचय का उपयोग करके जिम्बल लॉक समस्या का समाधान कैसे लागू किया जा सकता है?
- इसके अलावा, एक बोनस के रूप में: रोटेशन के बाद भी परिवर्तन "मॉडल स्थान" के सापेक्ष क्यों हैं?
- एक और बोनस: क्या मैं इस धारणा में गलत हूं कि एक परिवर्तन के बाद, वर्तमान के सापेक्ष और परिवर्तन होंगे?
इसके अलावा, अगर यह निहित नहीं था, तो मैं ओपनजीएल, जीएलएसएल, सी ++ और जीएलएम का उपयोग कर रहा हूं, इसलिए यदि आवश्यक नहीं है तो इन के संदर्भ में उदाहरण और स्पष्टीकरण बहुत सराहना करते हैं।
और अधिक विस्तार बेहतर!
अग्रिम में धन्यवाद।