2008-11-25 20 views
14

इसलिए मैंने नए प्रोग्रामर की ओर उन्मुख क्वाटरनियन आधारित 3 डी कैमरा लिखा है, इसलिए उनके लिए एकीकृत करना और उपयोग करना शुरू करना बेहद आसान है।Quaternion आधारित 3 डी कैमरे Quaternions या यूलर कोण जमा करना चाहिए?

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

लेकिन मैंने देखा कि इस विधि में कोई समस्या थी। जितना मैंने इसका इस्तेमाल किया, भले ही मैं केवल एक यूलर कोण पर घूम रहा था, यॉ कहता हूं, कुछ पुनरावृत्तियों में, दूसरे में खून बहने लगेंगे, पिच कहें। यह मामूली था, लेकिन काफी अस्वीकार्य था।

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

तो क्या किसी भी स्टैक ओवरफ्लो सदस्यों को इस समस्या में कोई अंतर्दृष्टि है? क्या यह चीजों को करने का एक उचित तरीका है?

उत्तर

12

घुमावदार क्वाटरनियंस फ़्लोटिंग-पॉइंट राउंडऑफ मुद्दों के संचय से पीड़ित होने जा रहा है (यहां तक ​​कि 45 डिग्री जैसे सरल कोण भी सटीक नहीं होंगे)। यह घूर्णन को मिश्रित करने का एक शानदार तरीका है, लेकिन आपके प्रत्येक quaternion घटकों की सटीकता समय के साथ ड्रॉप-ऑफ होने जा रही है। ब्लीड-थ्रू एक साइड-इफेक्ट है, एक दृष्टि से बदतर है हालांकि आपका quaternion स्केल फैक्टर को शामिल करना शुरू कर सकता है - इसे पुनर्प्राप्त करने के लिए, आपको किसी भी मामले में यूलर कोणों पर वापस जाना होगा। एक निश्चित बिंदु यूलर कोण राउंडऑफ जमा करने वाला नहीं है।

क्वाटरनियन प्रति-फ्रेम का पुनर्मूल्यांकन न्यूनतम है। मैं इसे अनुकूलित करने की कोशिश करने से परेशान नहीं होगा। सटीकता प्राप्त करने के लिए आप Renormalized से पहले आप कुछ quaternions जमा करने की अनुमति दे सकता है, लेकिन यह वास्तव में प्रयास के लायक नहीं है।

+0

वही मैट्रिक्स दृष्टिकोण को बदलने के लिए जाता है और यह यूलर कोण आधारित क्वाटरनियन क्लास (केवल कुछ पंक्तियों) में संचालन के कुछ काउंटर जोड़ने के लिए इतना प्रयास नहीं है। बीटीडब्ल्यू मैं अक्सर सामान्यीकृत करने की अनुशंसा नहीं करता क्योंकि यह आपके वांछित परिवर्तन प्रभावों के साथ थोड़ा गड़बड़ कर सकता है। मैं आमतौर पर हर 64-128 ऑपरेशन – Spektre

+0

_ को सामान्य करने के लिए सामान्य करता हूं, "किसी भी मामले में आपको यूलर कोणों पर वापस जाना होगा" _ - यह बिल्कुल सही नहीं है - पैमाने की कारक को मापकर स्केल फैक्टर को पुनर्प्राप्त किया जा सकता है चार का समुदाय – Eric

1

मैंने दोनों के लिए तर्क दिया है। मुझे लगता है कि वास्तविक प्रश्न जो आपको सौदा करना होगा, वह आपके कैमरे सिस्टम में लाइन के नीचे लचीलापन है; आईएमओ यॉ आमतौर पर तीसरे व्यक्ति के दृश्य में अधिक दिलचस्प होता है (क्योंकि आप चरित्र के लंबवत धुरी के बारे में घूमने जा रहे हैं)। जबकि आप तर्कसंगत रूप से पहले व्यक्ति के दृश्य में ऊर्ध्वाधर के आसपास "yaw" कर सकते हैं, मुझे यकीन नहीं है कि यह वास्तव में वही बात है।

हालांकि, मुझे लगता है कि यह आपके quaternions प्रति फ्रेम को फिर से समझने के लिए एक कचरा है। शायद आपके फ्रेम को इनपुट प्राप्त होने पर नवीनतम quaternions को स्टोर करना और उन्हें गंदे चिह्नित करना बेहतर होगा?

+0

तो हो सकता है कि दोनों यूलर कोण और Quaternions दोनों स्टोर करें, और केवल Quaternion को अपडेट करें आवश्यक, या इससे भी बेहतर, रोटेशन मैट्रिक्स को स्टोर करें, और चीजों को अपडेट किए जाने पर केवल इसे एक नए क्वाटरनियन के माध्यम से अपडेट करें। ऑब्जेक्ट्स के घूर्णन के लिए यह अधिक महत्वपूर्ण है, हालांकि, बी/सी कैमरा अक्सर बदल जाएगा। – Adam

4

संचय एक अतुलनीय प्रक्रिया है। वृद्धिशील घूर्णन के बहुत सारे जमा करना राउंडऑफ त्रुटि जमा करेगा चाहे आप quaternions या matrices के साथ करते हैं।

मुझे ऐसा कुछ कल्पना है: आपको अपना कोड मिल गया है और चल रहा है, लेकिन ध्यान दिया कि नेविगेशन की एक निश्चित मात्रा के बाद आपका कैमरा परेशान हो रहा था - एक ऐसे आविष्कार का उल्लंघन करना जिसे आपने पहले से नहीं सोचा था। प्रभावी रूप से, आपको एहसास हुआ है कि रोटेशन जमा करने के लिए नहीं चाहते हैं; इसके बजाय आप कुछ और करना चाहते हैं।

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

यहां बमर यह है कि quaterions अनावश्यक हो जाते हैं (कम से कम इस विशेष उपयोग के लिए)। आप अभी भी quaternions चाहते हैं, हालांकि - कच्चे पिच/यो/रोल कोण के साथ interpolating बदसूरत हो सकता है। फिर, यह एक इंटरफ़ेस डिज़ाइन प्रश्न है: आपको यह पता लगाने की आवश्यकता है कि आपको quaternions की आवश्यकता होगी, और उन्हें कैसे और बाहर निकालना है ...

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

  • कोई संबंधित समस्या नहीं^_^