我需要通过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。 谢谢你的帮助。
答案 0 :(得分:16)
数学Qt的表现是正确的,但Qt正在使用的参考框架并不符合您的想法。
Matrix Math:
因此,您在数学中看到的组件是在图像的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轴的旋转如下所示:
希望有所帮助。