मैं 3 डी (मूल के बजाय) में एक मनमाना बिंदु के बारे में कैसे घूम सकता हूं?


15

मेरे पास कुछ मॉडल हैं जो मैं सामान्य तरीके से चतुष्कोणों का उपयोग करके घूमना चाहता हूं, मूल के बारे में घूमने के बजाय, मैं चाहता हूं कि इसे थोड़ा ऑफसेट किया जाए। मुझे पता है कि आप 3 डी स्पेस में नहीं कहते हैं, कि आप एक बिंदु पर घूमते हैं; आप कहते हैं कि आप एक अक्ष पर घूमते हैं। इसलिए मैं इसे एक वेक्टर के बारे में घुमाता हुआ देख रहा हूं, जिसकी पूंछ स्थानीय मूल में नहीं है।

मेरे प्रतिपादन / भौतिकी इंजन में सभी affine परिवर्तनों को SQT (स्केल, क्वाटर्नेशन, अनुवाद, एक गेम गेम इंजन आर्किटेक्चर से उधार लिया गया एक विचार) का उपयोग करके संग्रहीत किया जाता है । इसलिए मैं इन घटकों से प्रत्येक फ्रेम का निर्माण करता हूं और इसे वर्धमान शेडर को पास करता हूं। इस प्रणाली में, अनुवाद लागू किया जाता है, फिर स्केल, फिर रोटेशन।

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

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


चतुर्भुज पहले से ही एक मनमाना अक्ष के बारे में एक रोटेशन का वर्णन करते हैं; क्या आपके पास डेटा से इस तरह के एक quaternion के निर्माण में समस्याएं हैं?
मार्टिन सोजका

3
सच में, जवाब देने वाले लोग वास्तव में उन्हें पढ़ सकते हैं ? मैंने एक विधि, एक कुशल सूत्र और एक प्रदर्शन भी दिया। फिर भी कुछ मूल्यवान जानकारी (और कुछ स्पष्ट रूप से गलत जानकारी) प्रदान करते हुए एकमात्र उत्कीर्ण उत्तर, इनमें से कोई भी विशेषता नहीं है और प्रश्न का उत्तर भी नहीं देता है!
सैम होसेवर

@MartinSojka, यह एक मनमाना अक्ष नहीं है, इसके बारे में और मनमाना बिंदु है।
नोवेल

@SamHocevar आपके दोनों उत्तर सहायक थे। मैंने तुम्हारा चयन किया क्योंकि यह अधिक गहन था और मुझे एक समाधान पर पहुंचने में मदद की। आप दोनों को धन्यवाद।
18

आह, क्षमा करें - मैंने इसे दोहरे उद्धरणों के साथ भ्रमित किया था (जो आपको अनुवाद "मुफ्त में" भी मिलते हैं)। मैं बाद में एक जवाब में क्या मतलब था लिखूंगा; हो सकता है कि दूसरों को यह उपयोगी लगे, खासकर जब से आप अपने तीन घटकों को सिर्फ एक तक कम कर सकते हैं - भले ही थोड़ा अधिक जटिल हो।
मार्टिन सोज्का

जवाबों:


17

संक्षेप में

आपको केवल अपने SQT फॉर्म में T को बदलना होगा।

अनुवाद वेक्टर vको बदलें, v' = v-invscale(p-invrotate(p))जहां vप्रारंभिक अनुवाद वेक्टर है,p बिंदु जो चारों ओर आप रोटेशन घटित करना चाहते है, और invrotateऔर invscaleअपने रोटेशन और पैमाने के प्रतिलोम हैं।

त्वरित प्रदर्शन

आज्ञा देना pबिंदु है जिसके चारों ओर आप रोटेशन लागू करते हैं r। आज्ञा sदेना अपने स्केलिंग मापदंडों और vअपने अनुवाद वेक्टर। इसके T(p)R(r)T(-p)S(s)T(v)बजाय अंतिम मैट्रिक्स परिवर्तन हैR(r)S(s)T(v)

आप जो चाहते हैं वह नया परिवर्तन पैरामीटर है v', r'और s'ऐसा है कि अंतिम मैट्रिक्स परिवर्तन है R(r')S(s')T(v')और हमारे पास है:

T(p)R(r)T(-p)S(s)T(v) = R(r')S(s')T(v')

अनंत पर व्यवहार इंगित करता है कि रोटेशन पैरामीटर और स्केलिंग पैरामीटर बदल नहीं सकते हैं (यह प्रदर्शित किया जा सकता है)। हम इस प्रकार है r = r'और s = s'। एकमात्र अनुपलब्ध पैरामीटर इसलिए है v', आपका नया अनुवाद वेक्टर:

T(p)R(r)T(-p)S(s)T(v) = R(r)S(s)T(v')

यदि ये मैट्रिक्स समान हैं, तो उनके व्युत्क्रम बराबर हैं:

T(-v)S(-s)T(p)R(-r)T(-p) = T(-v')S(-s)R(-r)

यह विशेष रूप से मूल के लिए सच है O:

T(-v)S(-s)T(p)R(-r)T(-p)O = T(-v')S(-s)R(-r)O

स्केलिंग और घूमने से मूल की उत्पत्ति होती है, इस प्रकार whe मिलता है:

T(-v)S(-s)T(p)R(-r)(-p) = -v'

v'नया अनुवाद वेक्टर है जिसे आप खोज रहे हैं जो आपको SQT रूप में अपने परिवर्तन को संग्रहीत करने देता है। गणना को सरल करना संभव है; लेकिन कम से कम आवश्यक भंडारण में वृद्धि नहीं हुई है।


स्पष्टीकरण के लिए धन्यवाद। BTW, क्या आप किसी भी संसाधन के बारे में जानते हैं जहाँ मैं SQT प्रतिनिधित्व ट्रिक्स के बारे में अधिक पढ़ सकता था?
पचांग

मुझे सही करें यदि मैं गलत हूं, लेकिन ऐसा लगता है कि एक अन्य समाधान आपके Quaternion को सामान्य रूप में संग्रहीत करने के लिए होगा, और यदि आपको एक मनमाना बिंदु / अक्ष के चारों ओर अनुवाद के लिए खाते की आवश्यकता है, तो इसके साथ क्यू मैट्रिक्स का निर्माण करें, बस अनुवाद वेक्टर निकालें इस मैट्रिक्स से (अंतिम कॉलम, आमतौर पर) और इसे वस्तुओं में जोड़ें अनुवाद वेक्टर, फिर अपने अस्थायी मैट्रिक्स को टॉस करें।
जॉन्बेकर्स

15

आपके रोटेशन मैट्रिसेस को प्राप्त करने के लिए उपयोग किए जाने वाले सभी विहित घूर्णी सूत्र मूल के बारे में रोटेशन के लिए हैं। यदि आप एक विशिष्ट बिंदु के चारों ओर उस घुमाव को लागू करने के बजाय करना चाहते हैं, तो आपको पहले मूल को ऑफ़सेट करना होगा - या, समतुल्य रूप से उस ऑब्जेक्ट को ले जाएं, जिससे आप उस बिंदु को घुमाना चाहते हैं जो मूल पर है।

पहले 2 डी मामले पर विचार करें, क्योंकि यह सरल है और तकनीक तराजू है। यदि आपके पास उत्पत्ति पर केंद्रित चौड़ाई 2 का घन है और आप इसके केंद्र के बारे में 45 डिग्री घूमना चाहते हैं, तो यह 2 डी रोटेशन मैट्रिक्स का एक तुच्छ अनुप्रयोग होगा ।

लेकिन अगर इसके बजाय आप इसे ऊपरी दाहिने कोने के चारों ओर घुमाना चाहते थे (स्थित 1,1) तो आपको सबसे पहले इसका अनुवाद करना होगा ताकि मूल में यह कोने हो। इसका अनुवाद के साथ पूरा किया जा सकता है -1,-1। फिर आप ऑब्जेक्ट को पहले की तरह घुमा सकते हैं, लेकिन आपको इसे वापस (अनुवाद करके 1,1) अनुवाद करना होगा । तो सामान्य तौर पर, आपके द्वारा किए जाने वाले बिंदु के Rरोटेशन के लिए रोटेशन मैट्रिक्स को प्राप्त करने के लिए:rP

R = translate(-P) * rotate(r) * translate(P)

क्रमशः कहां translateऔर rotateविहित अनुवाद / रोटेशन मेट्रिसेस हैं। जैसा कि होता है, यह त्रिभुज से 3 डी तक होता है, जो रोटेशन के लिए एक धुरी को आपूर्ति करने के अपवाद के रूप में अच्छी तरह से - आप हमेशा कैनोनिकल एक्स, वाई या जेड अक्ष रोटेशन मेट्रिसेस चुन सकते हैं, लेकिन यह सुस्त होगा। आप मनमाना अक्ष-कोण रोटेशन मैट्रिक्स का उपयोग करना चाहते हैं । R3D में आपका फाइनल इस प्रकार है:

R = translate(-P) * rotate(a,r) * translate(P)

जहां aरोटेशन के अक्ष का प्रतिनिधित्व करने वाली एक इकाई वेक्टर है और Pअब रोटेशन बिंदु का प्रतिनिधित्व करने वाले मॉडल अंतरिक्ष में एक 3D बिंदु है।

जैसा कि होता है, चतुर्धातुक को और उससे परिवर्तित किया जा सकता है मैट्रिक्स अभ्यावेदन , इसलिए आप अपना संघटन कर सकते हैं जिस तरह से आपको चुनना चाहिए। या आप बस सब कुछ छोड़ सकते हैं क्योंकि मैट्रिस (चतुर्भुज के कुछ अच्छे फायदे हैं जैसे कि एक समझदार फैशन में अंतर करना आसान है, लेकिन आपको जरूरत है या नहीं)।

इसके अलावा:

इसलिए मैं इसे एक वेक्टर के बारे में घुमाता हुआ देख रहा हूं, जिसकी पूंछ स्थानीय मूल में नहीं है।

कड़ाई से बोलते हुए, जबकि वैक्टरों को एक मूल से विस्थापन के रूप में विचार करके पदों का प्रतिनिधित्व करने के लिए इस्तेमाल किया जा सकता है, वेक्टर के पास खुद को स्थान नहीं है, इसलिए इस तरह की कल्पना करना थोड़ा असामान्य है।


धन्यवाद, यह एक अच्छा जवाब है। हालांकि यह मेरे सिस्टम की बाधाओं को फिट नहीं करता है। मुझे अपने प्रश्न में शामिल करना चाहिए था, "क्या इन बाधाओं को देखते हुए ऐसा करना संभव है ?," और मुझे लगता है कि इसका उत्तर यह है कि ऐसा नहीं है, क्योंकि इसके लिए दो अनुवादों की आवश्यकता है और मैं केवल एक के लिए प्रदान करता हूं। क्या यह एसक्यूटी के उपयोग को अपरिहार्य परिवर्तनों के प्रतिनिधित्व के रूप में अपरिहार्य है?
नोवेल

यह आपके अवरोधों के भीतर पूरी तरह से फिट बैठता है। मैट्रिक्स R (ट्रांसलेट-रोटेट-ट्रांसलेट-बैक के रूप में निर्मित) आपका रोटेशन मैट्रिक्स है। अपने "SQT" सिस्टम में Q को R से बदलें ताकि आपके पास अधिक सामान्य स्केल-रोटेट-ट्रांसलेशन प्रतिमान हो, और आपका काम हो गया। अंतिम अनुवाद दो मध्यवर्ती अनुवादों से स्वतंत्र है जो वांछित रोटेशन का उत्पादन करते हैं।

आप प्रस्ताव कर रहे हैं कि मैं एक मैट्रिक्स के साथ चतुर्भुज को बदल दूं? वह प्रति वस्तु 12 बाइट्स है (8 यदि मैं इसे 4x3 मैट्रिक्स के रूप में संग्रहीत करता हूं)! मैं आशावादी मुझ पर चुप्पी साधूंगा, हालांकि, और यह एक चक्कर दे। (यह वास्तव में शायद पदचिह्न में 2kb वृद्धि की राशि भी नहीं होगी ...) आपकी प्रतिक्रियाओं के लिए धन्यवाद।
नॉटलेश

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

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