2011-10-29 12 views
10

मेरे पास एक ऑब्जेक्ट है जिसे मैं कुंजी के माध्यम से घूमना चाहता हूं। वस्तु को चिल्लाओ, पिच और रोल चाहिए। बहुत कोशिश करने के बाद, मुझे पता चला कि glRotate इसकी सीमाएं हैं और उस कार्य के साथ ऐसा कुछ लागू करना संभव नहीं होगा।quaternions से OpenGL रोटेशन

मैंने थोड़ी सी शोध की है और quaternion- आधारित रोटेशन के बारे में पता चला है। घूर्णन मैट्रिक्स के माध्यम से घूमना भी संभव होगा, लेकिन लगभग हर कोई quaternions का सबसे अच्छा वर्णन करता है।

मैंने quaternions के बारे में पढ़ा है और उन्हें काफी अच्छी तरह से समझ लिया है, लेकिन मेरे ओपनजीएल कार्यक्रम में उन्हें कैसे कार्यान्वित करना अभी भी एक रहस्य है। क्या किसी को एक छोटा सा उदाहरण पता है? Quaternion वर्ग को कार्यान्वित करने के तरीके नहीं बल्कि इसका उपयोग कैसे करें। मैं चीजों को एक साथ रखने के लिए नहीं मिलता है।

+0

एक समय में एक से अधिक प्रश्न पूछने के लिए सर्वश्रेष्ठ नहीं है। मैंने यहां आपके [नए प्रश्न] से लिंक किया है (http://stackoverflow.com/questions/7939770/rotation-with-quaternion-not-quite-right)। – Kev

उत्तर

4

सबसे महत्वपूर्ण तरीका है कि विधि को कार्यान्वित करना जो quaternion से रोटेशन मैट्रिस का निर्माण करेगा। फिर, जैसा कि आप सामान्य रोटेशन मैट्रिक्स के साथ करेंगे, बस इसे अपने मॉडलव्यू मैट्रिक्स के साथ गुणा करें।

यह एक साधारण उदाहरण है जिसका उपयोग माउस आंदोलन के साथ घन घुमाने के लिए किया जाता था। जैसा कि आप देखते हैं मुझे तीन विधियों को लागू करने की आवश्यकता है: toMatrix, quaternionFromAxis, multiplyWith। यह मानते हुए कि आप quaternions समझते हैं, यह स्पष्ट होना चाहिए कि वे क्या करते हैं।

void display() { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glPushMatrix(); 

    // Multiply quaternion with current modelview matrix  
    glMultMatrixf(cameraQuaternion.toMatrix()); 

    // Some other transformations 
    glTranslatef(-0.5f, -0.5f, -0.5f); 

    // Draw something, i.e. cube 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 

    glPopMatrix(); 
} 

void mouseMoved(float dx, float dy) { 
    float axisY[] = { 0, 1, 0 }, 
      axisX[] = { 1, 0, 0 }; 

    float sensitivity = 0.005f; 
    Quaternion *q1 = Quaternion.quaternionFromAxis(axisY, dx * sensitivity]; 
    Quaternion *q2 = Quaternion.quaternionFromAxis(axisX, dy * sensitivity]; 

    // Multiply two quaternions with camera 
    cameraQuaternion = (q1.multiplyWith(q2)).multiplyWith(cameraQuaternion); 
} 
+0

कैमरा Quaternion के प्रारंभिक मूल्य क्या होना चाहिए? –

9

आप आसानी से build rotation matrices out of unit quaternions कर सकते हैं।

एक इकाई चार का समुदाय को देखते हुए एक + द्वि + CJ + dk, तो आपको निम्न 3x3 मैट्रिक्स का निर्माण कर सकते हैं:

The matrix

अंतिम पंक्ति और स्तंभ पहचान 4x4 मैट्रिक्स, glMultMatrix से लिया जोड़ें और आप कर चुके हैं :)