2012-02-17 24 views
5

मैं अपने विट्स पर अंत में हूं! मैं अपने पहले व्यक्ति शूटर में अंतराल पर काम कर रहा हूं, और अब यह कुछ एक्सट्रापोलेशन जोड़ने का मामला है। मैं स्थिति को extrapolate कर सकते हैं; पिछले दो पदों और उनसे वेग प्राप्त करना, फिर मौजूदा स्थिति (* डेल्टा समय) में वेग जोड़ना। हालांकि, मैं रोटेशन के लिए ऐसा नहीं कर सकता। डिफ़ॉल्ट रूप से, कोण यूलर होते हैं, लेकिन मैं उन्हें (और करते हैं) उन्हें quaternions में परिवर्तित कर सकते हैं क्योंकि वे गिंबल लॉक पीड़ित कर सकते हैं। मैं 2 पिछली ओरिएंटेशन से एक नया अभिविन्यास कैसे निकालेगा? मेरे पास पैकेट, 2 पैकेट और वर्तमान अभिविन्यास के बीच समय है।मैं दो पिछले पैकेट से एक नया quaternion रोटेशन कैसे extrapolate कर सकते हैं?

उत्तर

1

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

तब आप स्केलर वेग की गणना करते समय एक कोणीय वेग की गणना कर सकते हैं, और पहले निर्धारित अक्ष के चारों ओर एक्स्ट्राप्रोलेटेड रोटेशन की गणना करने के लिए इसका उपयोग कर सकते हैं।

+0

आपको बहुत बहुत धन्यवाद –

4

मैं यहाँ एक अच्छा जवाब मिला: http://answers.unity3d.com/questions/168779/extrapolating-quaternion-rotation.html

मैं अपने आवश्यकताओं के कोड अनुकूलित और यह काफी अच्छी तरह से काम करता है!

दो quaternions qa, qb के लिए, यह आपको एक ही सूत्र का उपयोग करके इंटरपोलेशन और एक्सट्रापोलेशन देगा। टी इंटरपोलेशन/एक्सट्रापोलेशन की मात्रा है, क्यूए-> क्यूबी, टी = -1 -> क्यूए-> क्यूबी बैक आदि से एक पूरे चरण को निकालने के लिए 0.1 = 0.1 - टी मैंने स्वयं लिखने वाले कार्यों का उपयोग किया opencv सीवी साथ quaternions/axisAngle के उपयोग :: चटाई लेकिन मैं शायद के लिए है कि बजाय

Quat qc = QuaternionMultiply(qb, QuaternionInverse(qa)); // rot is the rotation from qa to qb  
AxisAngle axisAngleC = QuaternionToAxisAngle(qc); // find axis-angle representation 

double ang = axisAngleC.angle; //axis will remain the same, changes apply to the angle 

if (ang > M_PI) ang -= 2.0*M_PI; // assume rotation to take the shortest path 
ang = fmod(ang * t,2.0*M_PI); // multiply angle by the interpolation/extrapolation factor and remove multiples of 2PI 

axisAngleC.angle = ang; 

return QuaternionMultiply(AxisAngleToQuaternion(axisAngleC),qa); // combine with first rotation 
+0

हाय Eigen का चयन करेंगे, खेद इस तरह के एक पुराने धागा ressurect करने के लिए। मैं इसी समस्या से जूझ रहा हूं (Eigen :: Quaterniond से कोणीय वेग प्राप्त करना, और इसे वर्तमान क्वाट + VelocityQuat * समय के साथ जोड़ना)। क्या आपने कभी इसका इस्तेमाल सी ++/ईजिन के साथ किया था? उपरोक्त में 'fmod' क्या है? धन्यवाद! – anti

+0

हाय, हाँ मैंने इसे सी ++ के तहत उपयोग किया लेकिन ईजिन के साथ नहीं (दिनों में अपनी कक्षाओं का उपयोग किया)। @fmod: http://www.cplusplus.com/reference/cmath/fmod –