आप टिप्पणियों के आधार पर, ऐसा लगता है कि आप ऑब्जेक्ट के ओरिएंटेशन को यूलर एंगल्स के सेट के रूप में स्टोर कर रहे हैं , और जब खिलाड़ी ऑब्जेक्ट को घुमाता है तो एंगल्स को घटाता / बढ़ाता है। अर्थात्, आपके पास इस छद्मकोड जैसा कुछ है:
// in player input handling:
if (axis == AXIS_X) object.angleX += dir;
else if (axis == AXIS_Y) object.angleY += dir;
else if (axis == AXIS_Z) object.angleZ += dir;
// in physics update and/or draw code:
matrix = eulerAnglesToMatrix(object.angleX, object.angleY, object.angleZ);
जैसा कि चार्ल्स बीट्टी नोट करते हैं , क्योंकि घुमाव की शुरुआत नहीं होती है, यह तब तक अपेक्षित नहीं होगा जब तक कि खिलाड़ी उसी क्रम में ऑब्जेक्ट को घुमाता नहीं है जिसमें eulerAnglesToMatrix()
घुमाव लागू होते हैं।
विशेष रूप से, रोटेशन के निम्नलिखित अनुक्रम पर विचार करें:
- एक्स अक्ष के चारों ओर एक्स डिग्री द्वारा ऑब्जेक्ट घुमाएं ;
- Y अक्ष के चारों ओर y डिग्री से घूमने वाली वस्तु ;
- ऑब्जेक्ट को घुमाएगी - एक्स अक्ष के चारों ओर एक्स डिग्री;
- ऑब्जेक्ट को घुमाएं - Y अक्ष के चारों ओर y डिग्री।
भोले Euler कोण प्रतिनिधित्व में, जैसा कि ऊपर छद्मकोड में लागू किया गया है, ये घुमाव बाहर रद्द हो जाएंगे और वस्तु अपने मूल अभिविन्यास पर वापस आ जाएगी। वास्तविक दुनिया में, ऐसा नहीं होता है - यदि आप मुझ पर विश्वास नहीं करते हैं, तो छह-पक्षीय मरो या एक रूबिक के घन को पकड़ो, x = y = 90 ° होने दें, और इसे स्वयं आज़माएं!
समाधान, जैसा कि आप अपने स्वयं के उत्तर में नोट करते हैं , ऑब्जेक्ट के ओरिएंटेशन को रोटेशन मैट्रिक्स (या एक क्वाटर्नियन) के रूप में संग्रहीत करना है , और उपयोगकर्ता इनपुट के आधार पर उस मैट्रिक्स को अपडेट करना है। ऊपर छद्म कोड के बजाय, आप ऐसा कुछ करेंगे:
// in player input handling:
if (axis == AXIS_X) object.orientation *= eulerAnglesToMatrix(dir, 0, 0);
else if (axis == AXIS_Y) object.orientation *= eulerAnglesToMatrix(0, dir, 0);
else if (axis == AXIS_Z) object.orientation *= eulerAnglesToMatrix(0, 0, dir);
// in physics update and/or draw code:
matrix = object.orientation; // already in matrix form!
(तकनीकी तौर पर, के बाद से किसी भी रोटेशन मैट्रिक्स या चार का समुदाय यूलर कोण का एक सेट के रूप में प्रतिनिधित्व किया जा सकता है, यह है संभव वस्तु के उन्मुखीकरण स्टोर करने के लिए उन्हें इस्तेमाल करने के लिए। लेकिन दो अनुक्रमिक रोटेशन के संयोजन के लिए शारीरिक रूप से सही नियम, प्रत्येक में प्रतिनिधित्व के रूप में यूलर कोण, एक ही रोटेशन में बल्कि जटिल है, और अनिवार्य रूप से बारी बारी से matrices / quaternions में घूर्णन, उन्हें गुणा, और फिर परिणाम को यूलर कोण में परिवर्तित करना।)