2014-09-18 6 views
8

कुछ परिप्रेक्ष्य परिवर्तनों को लागू करने के लिए मुझे QMatrix4x4 के माध्यम से QML आइटम्स में हेरफेर करने की आवश्यकता है। असल में, मैं कक्षा QML आइटमक्यूटी ट्रांसफॉर्म मैट्रिक्स

class Transform : public QQuickTransform{ 
Q_OBJECT 

Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix NOTIFY matrixChanged) 

public: 
explicit Transform(QQuickItem *parent = 0); 

QMatrix4x4 matrix() const; 
void setMatrix(QMatrix4x4 matrix); 

virtual void applyTo(QMatrix4x4 *matrix) const; 

signals: 
     void matrixChanged(); 

private: 
     QMatrix4x4 m_matrix; 

}; 

के क्षेत्र को बदलने के लिए तर्क के रूप में एक वस्तु QMatrix4x4 उपयोग करने के लिए रूपांतरण परिभाषित जहां

void Transform::applyTo(QMatrix4x4 *matrix) const { 
     *matrix *= m_matrix; 
     matrix->optimize(); 
} 

हालांकि, ऐसा लगता है कि QML "को परिभाषित" नहीं है शास्त्रीय तरीके से परिप्रेक्ष्य मैट्रिक्स। मैंने मुख्य रूप से घूर्णन (http://en.wikipedia.org/wiki/Rotation_matrix) पर अपने परीक्षणों पर ध्यान केंद्रित किया है। चलो कहते हैं कि मैं एक्स में एक QML मद करते हैं: 200, वाई: 200 और मैं बदलना लागू

transform: [Transform{matrix:mytra},Rotation { axis { x: 1; y: 0; z: 0 } angle: 90 } ] 

जहां mytra पहचान मैट्रिक्स है। विधि applyTo() (रोटेशन) मैट्रिक्स

 1 -0.195312   0  200   
    0 -0.195312   0  200   
    0   0   1   0   
    0 -0.000976562   0   1 

लेकिन "शास्त्रीय" एक होना चाहिए

 1 0   0  200   
    0 0  -1  200   
    0 1   0   0   
    0 0   0   1 

मुझे समझ नहीं आता, जहां इस मैट्रिक्स के लिए अपने मैट्रिक्स अनुकूल करने के लिए से और कैसे आता है प्राप्त करता है क्यूटी। सहायता के लिए धन्यवाद।

उत्तर

13

गणित क्यूटी प्रदर्शन कर रहा है सही है, लेकिन संदर्भ का फ्रेम जो क्यूटी का उपयोग कर रहा है, वह जो भी आप सोच रहे हैं उससे मेल नहीं खाता है।

मैट्रिक्स गणित:

enter image description here

तो घटकों आप गणित में देख रहे हैं एक्स और छवि के y दिशाओं में कतरनी जोड़ रहे हैं।

लेकिन क्यूटी जो रोटेशन करता है वह उन अक्षों में से एक है। इसलिए यदि आप मानक 2 डी रोटेशन करना चाहते हैं, बिना कतरन के, आपको या तो अक्ष निर्दिष्ट नहीं करना है या आप z अक्ष निर्दिष्ट करते हैं।

धुरी घूमने के लिए अक्ष। एक बिंदु के चारों ओर सरल (2 डी) रोटेशन के लिए, आपको अक्ष निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि डिफ़ॉल्ट अक्ष z अक्ष (axis { x: 0; y: 0; z: 1 }) है।

http://qt-project.org/doc/qt-5/qml-qtquick-rotation.html

y अक्ष के बारे में रोटेशन इस तरह दिखता है:

enter image description here

आशा है कि मदद करता है।

+0

धन्यवाद ... हालांकि मुझे समझ में नहीं आता कि 4x4 मैट्रिक्स का बिंदु क्या है। क्या यह जेड समन्वय का प्रबंधन करने के लिए है? – lorenzolightsgdwarf

+2

हां। एक 3x3 मैट्रिक्स एक्स और वाई में रोटेशन का ट्रैक रख सकता है और एक्स और वाई में अनुवाद (pos) और स्केल रख सकता है। एक 4x4 मैट्रिक्स एक्स, वाई, और जेड रोटेशन, स्केल, और अनुवाद (उर्फ पॉज़, या स्थिति) का ट्रैक रख सकता है। रोबोटिक्स 4x4 मैट्रिक्स का बहुत उपयोग करता है। ग्राफिक्स कार्ड पर 3 डी प्रतिपादन भी 4x4 मैट्रिक्स का उपयोग करता है। यदि आप OpenGL में देखते हैं, तो यह पूरे स्थान पर इसका उपयोग करता है। – phyatt

+0

हम जेड अक्ष के साथ एक क्यूएमएल आयताकार का अनुवाद कैसे करते हैं? – trusktr

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