2014-09-18 29 views
8

Ho bisogno di manipolare elementi QML tramite QMatrix4x4, al fine di applicare alcune trasformazioni prospettiche. Fondamentalmente, ho definito la classe Transform utilizzare un QMatrix4x4 oggetto come argomento per il campo trasformare del QML articoloMatrice di trasformazione Qt

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; 

}; 

dove

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

Tuttavia, sembra che QML non "definisce" la matrice prospettica nel modo classico. Ho focalizzato i miei test principalmente sulle rotazioni (http://en.wikipedia.org/wiki/Rotation_matrix). Diciamo che ho un QML elemento in x: 200, y: 200 e applico la trasformazione

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

dove mytra è la matrice identità. Il metodo applyTo() riceve il (rotazione) a matrice

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

ma il "classico" uno dovrebbe essere

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

non capisco dove questa matrice proviene e come adattare la mia matrice qt. Grazie per l'aiuto.

risposta

13

La matematica che Qt sta eseguendo è corretta, ma il quadro di riferimento che Qt sta usando non corrisponde a quello che stai pensando.

Matrix Math:

enter image description here

Quindi i componenti che state vedendo nella matematica sono l'aggiunta di taglio nel direzioni x ed y di immagine.

Ma la rotazione che Qt fa è circa uno di quegli assi. Quindi, se si desidera eseguire una rotazione 2D standard, senza tranciatura, è necessario non specificare un asse o specificare l'asse z.

L'asse da ruotare. Per una rotazione (2D) semplice attorno a un punto, non è necessario specificare un asse, poiché l'asse predefinito è l'asse z (axis { x: 0; y: 0; z: 1 }).

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

La rotazione intorno all'asse y assomiglia a questo:

enter image description here

Speranza che aiuta.

+0

Grazie ... tuttavia non capisco qual è il punto della matrice 4x4. Gestisce la coordinata z? – lorenzolightsgdwarf

+2

Sì. Una matrice 3x3 può tenere traccia delle rotazioni in xey e le traduzioni (pos) e la scala in xey. Una matrice 4x4 può tenere traccia delle rotazioni di x, yez, della scala e della traduzione (ovvero pos o posizione). La robotica sfrutta molto le matrici 4x4. Il rendering 3D sulle schede grafiche utilizza anche le matrici 4x4. Se si guarda in OpenGL, lo usa dappertutto. – phyatt

+0

Come si traduce un rettangolo QML lungo l'asse Z? – trusktr

Problemi correlati