qt - 如何在 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一样旋转模型,怎么办?
解决方案
尝试这个:
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;
从右到左可以看到矩阵乘法。这意味着通过将多个矩阵相乘,有时结果会有点令人困惑。
推荐阅读
- python - Python:在两个文件中查找字符串并打印所有行
- javascript - 如何预览像这个 logo.png 这样的文件名?
- azure - Azure Policy 类似架构的评估
- spring-boot - 由 CORS 阻止的 Spring Boot 自定义响应标头
- windows - 跨 Windows 版本的 HANDLE_TYPE_PROCESS
- java - 未调用 onCreateOptionsMenu
- java - 如何使用用户事务使用 Java 锁定 Postgres SQL 表显式
- javascript - Reactjs - 通过在自动完成组件(材料 UI)中的每个输入更改上点击 API 来更新选项
- python - 在特定指标处分块故事
- javascript - 每个周末午夜运行一个函数?