2011-03-25 12 views
5

पर रेखांश/अक्षांश मुझे एक देशांतर और अक्षांश मिला है और इसे एक quaternion में परिवर्तित करना चाहते हैं और सोच रहा हूं कि मैं यह कैसे कर सकता हूं? मैं इसका उपयोग करना चाहता हूं, क्योंकि मेरे पास एक ऐप है जो पृथ्वी पर एक क्षेत्र पर प्रोजेक्ट करता है और मैं एक स्थान से दूसरे स्थान पर घूमना चाहता हूं।quaternion

बेस्ट!

उत्तर

1

शायद आप देख सकते हैं कि कैसे C++ लाइब्रेरी इसे लागू करता है। (या शायद यह भी इसे का उपयोग) http://www.boost.org/doc/libs/1_46_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions/create.html

देशांतर और lattitude काफी दिगंश (थीटा - [0, 2 * पीआई]) के अनुरूप हैं (? रो [0, पीआई]) और झुकाव गोलाकार निर्देशांक में कोण (त्रिज्या सतह के लिए निश्चित रूप से आर = 1)। बूस्ट में पोस्ट किए गए लिंक में गोलाकार करने के लिए गोलाकार के लिए एक समारोह है।

+0

हाय जोन_डर्कस्टार, इतनी रेखांश फाई है, अक्षांश थाटा है, लेकिन क्या होगा? – rick

+0

इसके फाई तो? मैं भूल गया कि कौन सा = पी गोलाकार निर्देशांक का उपयोग करने के बाद से थोड़ी देर हो गया है। मैं वास्तव में चित्र नहीं कर सकता कि एक तीसरा कोण क्या करेगा। rho बस परिमाण हो सकता है, लेकिन फिर दो Phis क्यों? मैं आपको उस पर इंगित करने से कहीं ज्यादा मदद नहीं कर सकता, शुभकामनाएं –

+0

मैं इसका उपयोग अक्षांश/देशांतर से कार्टेशियन निर्देशांक में परिवर्तित करने के लिए कर रहा हूं: '\t फ्लोट phi = ofDegToRad (ll.lat + 90); \t फ्लोट theta = ofDegToRad (ll.lon - 90); \t एक्स = पाप (फाई) * कोस (थेटा); \t वाई = पाप (फाई) * पाप (थेटा); \t z = cos (phi); ' अब मुझे इसे समन्वय के बजाए घूर्णन में बदलने का एक तरीका चाहिए। रोटेशन धुरी/कोण या quaternion में हो सकता है। – rick

1

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

तो मान लें कि आप क्षेत्र के उत्तर-ध्रुव को ऊपर की तरफ रखना चाहते हैं। उत्तरी ध्रुव और वस्तु की + z अक्ष के साथ गठबंधन किया है, तो 'ऊपर' स्क्रीन पर दुनिया की + y अक्ष के साथ गठबंधन किया है, और फिर आप की सतह पर इतना है कि बिंदु आर क्षेत्र घुमाना चाहते क्षेत्र को सीधे स्क्रीन पर इंगित किया जाता है (जहां आर आपकी टिप्पणी में वर्णित यूक्लिडियन के लिए लैट-लॉन का उपयोग करके पाया जाता है), तो आप निम्नानुसार रोटेशन मैट्रिक्स बनाते हैं।

आप वस्तु की आर से तालमेल करना चाहते हैं दुनिया की + z (एक ओपन की तरह दृश्य-समन्वय प्रणाली कल्पना करते हुए) और आप चाहते हैं वस्तु की + z (दुनिया का + y से तालमेल के रूप में पास के रूप में मुमकिन)। हमें तीसरी अक्ष की आवश्यकता है; इसलिए हम आर को सामान्यीकृत करते हैं और फिर पाते हैं: पी = क्रॉसपी ([0 0 1]^टी, आर)। हम पी सामान्यीकृत करते हैं और फिर दूसरी अक्ष पर ऑर्थोगोनलिटी लागू करते हैं: क्यू = क्रॉसपी (आर, पी)। अंत में, क्यू सामान्य करें। अब हमारे पास 3 ऑर्थोगोनल वैक्टर पी, क्यू, आर है कि हम क्रमशः दुनिया के x, y, z के साथ संरेखित करना चाहते हैं।

मैं यह सोचते हैं रहा है कि पी, क्यू, और आर स्तंभ वैक्टर कर रहे हैं; इसलिए एक रूपांतरण मैट्रिक्स बनाने के लिए, हम बस एक साथ चिपके रहते हैं: एम = [पी क्यू आर]। अब एम मैट्रिक्स है जो ऑब्जेक्ट निर्देशांक में विश्व निर्देशांक में एक बिंदु को बदल देगा। विपरीत दिशा में जाने के लिए, हम एम के विपरीत पाते हैं। सौभाग्य से, जब मैट्रिक्स के कॉलम ऑर्थोनॉर्मल होते हैं, तो उलटा ट्रांसपोज़ जैसा ही होता है। तो हम पाते हैं:

   [ P^T ] 
M^-1 = M^T = [ Q^T ] 
      [ R^T ] 

कि से, अगर आप की जरूरत है, तो आप एक चौका matrix to quaternion conversion का उपयोग कर पा सकते हैं। और फिर आप स्लर्प या अपनी पसंद की विधि का उपयोग करके quaternions के बीच interpolate कर सकते हैं।

0

this numpy implementation के समान मैट्रिस या वैक्टर का उपयोग किए बिना इसके बारे में जाने का कोई तरीका है। हम रेखांश/अक्षांश के बारे में सोच सकते हैं क्योंकि दो क्वाटरनीयन रोटेशन एक साथ रचित हैं।

चलो एक ज़ेड-अप दाहिनी ओर समन्वय प्रणाली के साथ काम करते हैं। आइए रेखांश φ और अक्षांश θ, और दोनों बिंदुओं (φ, θ) के रूप में प्रतिनिधित्व बिंदु को कॉल करें। दृश्य के लिए, लाल अक्ष एक्स से मेल खाती है, वाई के लिए हरे, और जेड

करने के लिए नीले हम चार का समुदाय से रोटेशन का प्रतिनिधित्व (0, 0), लाल रंग में, करने के लिए (एक खोजना चाहते हैं, ), हरे रंग में:

Sphere with origin and destination points

हम अनुदैर्ध्य रोटेशन के पहले एक संयोजन के रूप में इस रोटेशन का प्रतिनिधित्व कर सकते हैं, तो अक्षांशीय रोटेशन की, तो जैसे:

First rotation Second rotation

सबसे पहले, हम एक जेड अक्ष के साथ है, जो एक्स बदल देती है और Y अक्ष तक घुमाया। फिर, हम नए स्थानीय वाई अक्ष के साथ बी द्वारा घुमाए गए। इस प्रकार, हम इस घूर्णन के लिए अक्ष/कोण जानकारी के दो सेट जानते हैं।

सौभाग्य से, अक्ष/कोण से quaternions में रूपांतरण पहले ही ज्ञात है। यह देखते हुए एक कोण α और एक धुरी वेक्टर ω, जिसके परिणामस्वरूप चार का समुदाय है:

(cos(α/2), ω.x*sin(α/2), ω.y*sin(α/2), ω.z*sin(α/2)) 

तो सबसे पहले रोटेशन के साथ (0, 0, 1) अक्ष एक डिग्री रोटेशन का प्रतिनिधित्व करती है, दे रही है हमें:

q1 = (cos(a/2), 0, 0, sin(a/2)) 

दूसरे रोटेशन हमें दे रही है, तब्दील (0, 1, 0) अक्ष के साथ डिग्री के ख एक रोटेशन का प्रतिनिधित्व करती है:

q2 = (cos(b/2), 0, sin(b/2), 0) 

हम इन दो quaternions गुणा हमें (0 0,) से (एक, ) से इस यौगिक रोटेशन का प्रतिनिधित्व करने के लिए एक एकल चौका देने के लिए कर सकते हैं। Quaternion गुणा के लिए सूत्र थोड़ा लंबा है, लेकिन आप इसे here पा सकते हैं। परिणाम:

q2*q1 = (cos(a/2)cos(b/2), -sin(a/2)sin(b/2), cos(a/2)sin(b/2), sin(a/2)cos(b/2)) 

ऐसा नहीं है कि यह बहुत मायने रखता है, लेकिन हम पुष्टि कर सकते हैं कि यह सूत्र numpy पहले उल्लेख किया है कार्यान्वयन के रूप में ही है।

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

आशा है कि इससे मदद मिलती है!


संपादित करें: ध्यान दें कि यह अनिवार्य रूप से 2 यूलर कोणों के साथ काम करने जैसा ही है। तो इस रूपांतरण को उलट करने के लिए, आप किसी भी quaternion का उपयोग यूलर कोण रूपांतरण में कर सकते हैं, बशर्ते कि रोटेशन ऑर्डर समान हो।

संबंधित मुद्दे