首页 > 解决方案 > 如何在 QT OPENGL 中使用 QMatrix4x4 旋转模型

问题描述

我是 OPENGL 的新手,我在 GIT 上下载了一个项目 https://github.com/schult/qt-gles-demo.git

该程序包含一个可以调整模型 Z 轴的滑块。我继续添加另外两个滑块来调整 X 和 Y 轴。代码如下:

void GlWidget::setModelAngle(int degrees)
{
    m_modelMatrix = QMatrix4x4();
    m_modelMatrix.rotate(degrees, 0.0f, 0.0f, 1.0f);
    update();
}

void GlWidget::setModelAngleX(int degrees)
{
    m_modelMatrix = QMatrix4x4();
    m_modelMatrix.rotate(degrees, 1.0f, 0.0f, 0.0f);
    update();
}


void GlWidget::setModelAngleY(int degrees)
{
    m_modelMatrix = QMatrix4x4();
    m_modelMatrix.rotate(degrees, 0.0f, 1.0f, 0.0f);
    update();
}

奇怪的是,调整一个轴再调整其他轴后,模型会回到原来的状态进行调整,例如调整X轴旋转50°,然后调整Y轴。这时候X轴会自动归零,好像X轴的调整被覆盖了

再次修改代码 m_modelMatrix = QMatrix4x4(); 放入 GlWidget 的构造函数中,似乎离成功又近了一步,但是,无论是向左还是向右移动滑块,模型都会不规则地旋转。我想将滑块向左移动以沿一个方向旋转,而将滑块向右移动,模型将沿相反方向旋转。

简单的说,像MAYA或者Blender一样旋转模型,怎么办?

标签: qtopengl

解决方案


尝试这个:

void GlWidget::setModelAngle(int degrees)
{
    QMatrix4x4 rotation = QMatrix4x4();
    rotation.rotate(degrees, 0.0f, 0.0f, 1.0f);
    m_modelMatrix = m_modelMatrix * rotation;
    update();
}

void GlWidget::setModelAngleX(int degrees)
{
    QMatrix4x4 rotation = QMatrix4x4();
    rotation.rotate(degrees, 1.0f, 0.0f, 0.0f);
    m_modelMatrix = m_modelMatrix * rotation;
    update();
}


void GlWidget::setModelAngleY(int degrees)
{
    QMatrix4x4 rotation = QMatrix4x4();
    rotation.rotate(degrees, 0.0f, 1.0f, 0.0f);
    m_modelMatrix = m_modelMatrix * rotation;
    update();
}

问题:

在您的代码中,您说m_modelMatrix = QMatrix4x4()。这会将您的矩阵设置回单位矩阵(除了从左上角到右下角的对角线之外,所有 4 x 4 单元格为零)通过创建一个新矩阵(旋转)并将其乘以模型矩阵,您不会丢失信息关于模型的方向/位置。

接下来您应该了解的是:

m_modelMatrix = m_modelMatrix * rotation;

m_modelMatrix = rotation * m_modelMatrix;

从右到左可以看到矩阵乘法。这意味着通过将多个矩阵相乘,有时结果会有点令人困惑。


推荐阅读