如何在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();
}

奇怪的是,在调整一个轴,然后调整其他轴后,模型会返回到原始状态进行调整E.g调整X轴旋转50°,然后调整Y轴。此时,X轴将自动归零,并且似乎X轴的调整被覆盖

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

简单地说,像MAYA或Blender一样旋转模型,我应该怎么做?

试试这个:

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((。这会将矩阵设置回单位矩阵(除了从左上角到右下角的对角线为1之外,所有4乘4的单元格都为零(通过创建一个新的矩阵(旋转(并将其乘以模型矩阵,您不会丢失有关模型方向/位置的信息。

接下来你应该理解的是之间的区别

m_modelMatrix = m_modelMatrix * rotation;

m_modelMatrix = rotation * m_modelMatrix;

矩阵乘法可以从右到左看到。通过乘以多个矩阵,有时会有点混淆结果。

最新更新