Qt变换矩阵

时间:2014-09-18 17:59:04

标签: qt 3d qml qt-quick

我需要通过QMatrix4x4操作QML项目,以便应用一些透视变换。基本上,我将类Transform定义为使用对象QMatrix4x4作为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;

};

,其中

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

然而,似乎QML没有以经典方式“定义”透视矩阵。我把我的测试主要集中在旋转(http://en.wikipedia.org/wiki/Rotation_matrix)上。 假设我在x:200,y:200中有一个QML项目,我应用了变换

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  

我不明白这个矩阵的来源以及如何使我的矩阵适应qt。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:16)

数学Qt的表现是正确的,但Qt正在使用的参考框架并不符合您的想法。

Matrix Math:

enter image description here

因此,您在数学中看到的组件是在图像的x和y方向上添加剪切。

但Qt所做的旋转是关于其中一个轴的。因此,如果您想要进行标准的2D旋转而不进行剪切,则需要不指定轴或指定z轴。

  

绕轴旋转。对于围绕点的简单(2D)旋转,您不需要指定轴,因为默认轴是z轴(axis { x: 0; y: 0; z: 1 })

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

围绕y轴的旋转如下所示:

enter image description here

希望有所帮助。