Qt变换矩阵

lor*_*arf 8 3d qt 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;

};
Run Code Online (Sandbox Code Playgroud)

哪里

void Transform::applyTo(QMatrix4x4 *matrix) const {
      *matrix *= m_matrix;
       matrix->optimize();
}
Run Code Online (Sandbox Code Playgroud)

然而,似乎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 } ]
Run Code Online (Sandbox Code Playgroud)

其中mytra是单位矩阵.方法applyTo()接收(旋转)矩阵

     1    -0.195312         0       200         
     0    -0.195312         0       200         
     0            0         1         0         
     0 -0.000976562         0         1  
Run Code Online (Sandbox Code Playgroud)

但应该是"经典"的

     1    0         0       200         
     0    0        -1       200         
     0    1         0         0         
     0    0         0         1  
Run Code Online (Sandbox Code Playgroud)

我不明白这个矩阵来自何处以及如何使我的矩阵适应qt.谢谢您的帮助.

phy*_*att 18

数学Qt表现正确,但Qt正在使用的参考框架与您的想法不符.

矩阵数学:

在此输入图像描述

因此,您在数学中看到的组件是在图像的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轴的旋转如下所示:

在此输入图像描述

希望有所帮助.

  • 是.3x3矩阵可以跟踪x和y中的旋转以及x和y中的平移(pos)和比例.4x4矩阵可以跟踪x,y和z旋转,缩放和平移(也就是位置或位置).Robotics大量使用4x4 matricies.显卡上的3D渲染也可以使用4x4 matricies.如果你研究OpenGL,它会在整个地方使用它. (4认同)