2010-11-30 14 views
7

मैं अपने शौक गेम इंजन में घूर्णन के लिए अक्ष-कोण वैक्टर का उपयोग कर प्रयोग कर रहा हूं। यह रेडियंस में घूर्णन की लंबाई के साथ रोटेशन की धुरी के साथ एक 3-घटक वेक्टर है। मैं उन्हें पसंद है क्योंकि:संयोजन रोटेशन एक्सिस वेक्टर

  • quats या रोटेशन मैट्रिक्स के विपरीत, मैं वास्तव में संख्या देख सकते हैं और मेरे मन
  • में रोटेशन कल्पना वे quaternions या मैट्रिक्स की तुलना में थोड़ा कम स्मृति हो सकता है।
  • मैं (यह महत्वपूर्ण है कि अगर मैं एक कोणीय वेग की दुकान) पाई के लिए -Pi की श्रेणी से बाहर मान

हालांकि प्रतिनिधित्व कर सकते हैं, मैं एक तंग पाश है कि मेरी वस्तुओं की सभी के रोटेशन (अद्यतन करता है दसियों हजारों) उनके कोणीय वेग के आधार पर। वर्तमान में, दो रोटेशन अक्ष वैक्टरों को गठबंधन करने का एकमात्र तरीका उन्हें quaternions में परिवर्तित करना है, उन्हें गुणा करना है, और फिर परिणाम को अक्ष/कोण में परिवर्तित करना है। प्रोफाइलिंग के माध्यम से, मैंने इसे एक बाधा के रूप में पहचाना है। क्या कोई और अधिक सरल दृष्टिकोण जानता है?

+0

कि मतलब यह है कि 3 मूल्यों 3 ओर्थोगोनल अक्ष के बारे में अनुक्रमिक रोटेशन का प्रतिनिधित्व करते हैं? असल में, यूलर कोण जैसे कि '[फाई, पीएसआई, थेटा] 'आरएक्स (फाई) * आरवाई (पीएसआई) * आरजेड (थेटा)' का प्रतिनिधित्व कर सकता है। यदि ऐसा है तो आपको 3x3 रोटेशन मैट्रिक्स बनाने का तरीका ढूंढने की आवश्यकता है, और धुरी-कोण को खींचें। – ja72

+0

नहीं, मैं यूलर कोण का उपयोग नहीं कर रहा हूं। यह धुरी कोण है जहां वेक्टर की लंबाई कोण है। – Dwayne

उत्तर

2

आप प्रतिनिधित्व quaternion rotation के बराबर है, बशर्ते आपके घूर्णन वैक्टर इकाई लंबाई हों। यदि आप कुछ डिब्बाबंद quaternion डेटा संरचना का उपयोग नहीं करना चाहते हैं तो आपको बस यह सुनिश्चित करना चाहिए कि आपके रोटेशन वैक्टर यूनिट की लंबाई के हैं, और उसके बाद कुल रोटेशन निर्धारित करने के लिए quaternion multiplications/reciprocal computation के बराबर काम करें। आप गुणा या जोड़ों की संख्या को कम करने में सक्षम हो सकते हैं।

यदि आपका कोण एकमात्र चीज है जो बदल रहा है (यानी रोटेशन की धुरी स्थिर है), तो आप आसानी से कोण की रैखिक स्केलिंग का उपयोग कर सकते हैं, और यदि आप चाहें तो इसे संशोधित करें रेंज [0, 2 π)।

θ (टी: तो, आप समय टी पर प्रति सेकंड α raidans, θ की एक आरंभिक कोण से शुरू करने की एक रोटेशन दर है, तो समय टी में अंतिम रोटेशन कोण द्वारा दिया जाता है) = θ + α (टीटी) आधुनिक 2 π

फिर आप सिर्फ वैक्टर की अपने संग्रह में है कि रोटेशन लागू होते हैं।

यदि इनमें से कोई भी आपके प्रदर्शन में सुधार नहीं करता है, तो आपको एक डिब्बाबंद क्वाटरनियन लाइब्रेरी का उपयोग करने पर विचार करना चाहिए क्योंकि ऐसी चीजें पहले से ही आपके द्वारा चुने गए एप्लिकेशन के लिए अनुकूलित हैं।

+0

1. मेरे वैक्टर इकाई लंबाई नहीं हैं। उनकी लंबाई रेडियंस में घूर्णन का कोण है। 2. मैं एक quaternion डेटा संरचना का उपयोग करें। 3. कई मामलों में, मेरा कोण एकमात्र चीज़ नहीं बदल रहा है, लेकिन यह एक अच्छा अनुकूलन जांच होगी। – Dwayne

+0

"कुल घूर्णन निर्धारित करने के लिए समकक्ष quaternion गुणा/पारस्परिक गणना का काम करते हैं" क्या यह अक्ष-कोण से quaternion में परिवर्तित करने के रूप में और फिर वापस समान है? मेरा वर्तमान कार्यान्वयन मैट्रिक्स और क्वाटरनियन एफएक्यू से है (http://www.j3d.org/matrix_faq/matrfaq_latest.html) – Dwayne

1

आपको अपने घूर्णन का प्रतिनिधित्व करने के लिए स्केल किए गए वैक्टरों की बजाय इकाई quaternions का उपयोग करना चाहिए। यह दिखाया जा सकता है (मेरे द्वारा नहीं) कि तीन मानकों का उपयोग करके घूर्णन का कोई भी प्रतिनिधित्व किसी बिंदु पर समस्याओं (यानी एकवचन है) में चला जाएगा। आपके मामले में ऐसा होता है जहां आपके वेक्टर की लंबाई 0 (यानी पहचान) होती है और 2 पीआई, 4 पीआई आदि की लंबाई होती है। इन मामलों में प्रतिनिधित्व एकवचन बन जाता है। यूनिट quaternions और रोटेशन matrices इस समस्या नहीं है।

आपके विवरण से, ऐसा लगता है कि आप संख्यात्मक एकीकरण के परिणामस्वरूप अपने घूर्णन स्थिति को अपडेट कर रहे हैं। इस मामले में आप अपनी घूर्णन दर (\ omega) को quaternion दर (q_dot) में परिवर्तित करके अपने रोटेशन स्थिति को अपडेट कर सकते हैं।हम के रूप में अपने चार का समुदाय का प्रतिनिधित्व करते हैं q = [Q0 Q1 Q2 Q3] जहां Q0 तो अदिश हिस्सा है:

q_dot = E*\omega 

जहां

[ -q1 -q2 -q3 ] 
E = [ q0 -q3 q2 ] 
    [ q3 q0 -q1 ] 
    [ -q2 q1 q0 ] 

फिर अपने अद्यतन

q (k + 1 हो जाता है) = क्यू (के) + q_dot * डीटी

सरल एकीकरण के लिए। यदि आप चुनते हैं तो आप एक अलग इंटीग्रेटर चुन सकते हैं।

+0

घूर्णन के लिए एकवचन बनने का क्या अर्थ है, और यह किस प्रकार की समस्या लाएगा? – Dwayne

+1

यह किसी समस्या का कारण हो सकता है या नहीं। इसका मतलब है कि उन स्थानों पर आप प्रभावी ढंग से स्वतंत्रता की डिग्री खो देते हैं। इसका मतलब यह है कि यदि आप अपने प्रतिनिधित्व और दूसरे के बीच दरों को बदलना चाहते हैं (quaternions कहें) रूपांतरण मैट्रिक्स (यानी जैकोबियन) एकवचन है (उलटा नहीं जा सकता है)। – Commodore63

2

आप उन्हें कोण अक्ष मानों के रूप में रख सकते हैं।

कोण अक्ष मूल्य (x,y,z) का उपयोग करके क्रॉस-उत्पाद (anti-symmetric) मैट्रिक्स बनाएं और कोण मान द्वारा उन्हें गुणा करके इस मैट्रिक्स के तत्वों को वज़न दें। अब इन सभी क्रॉस-उत्पाद मैट्रिस (one for each angle axis value) को समेटें और मैट्रिक्स घातीय का उपयोग करके अंतिम रोटेशन मैट्रिक्स पाएं।

मैट्रिक्स A इस पार उत्पाद मैट्रिक्स (कोण एक्सिस मूल्य से निर्मित) का प्रतिनिधित्व करता है तो,

exp(A) रोटेशन मैट्रिक्स R(i.e., equivalent to your quaternion in matrix form) के बराबर है।

इसलिए

,

exp (A1 + A2) = R1 * R2 

शायद अंत में एक और अधिक महंगी calucation ...

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