Qt实现OpenGL的经典教程⑤——矩阵变换

本文介绍了如何在Qt环境中,基于LearnOpenGL教程,通过QMatrix4x4和QVectorND处理数学计算,实现在OpenGL中的顶点坐标变换和动态旋转效果,包括平移、定时更新和优化动画流畅度。
摘要由CSDN通过智能技术生成

本帖将参考LearnOpenGL这一经典教程,使用Qt的原生环境完成教程中所提的所有流程,并尽量和原教程保持一致,如有错误,欢迎评论!

为了方便大家参考,我将项目分享至了gitee,并实时进行更行:Qt实现OpenGL的经典教程: (gitee.com)

教程中文网站:LearnOpenGLCN 

教程原网站:LearnOpenGL

Qt版本:6.7

操作系统:Windows10

Qt自带的数学库

Qt的QMatrix4NxN和QVectorND两个类系列可以解决对数学库glm的依赖问题。

矩形随随时间旋转

修改我们的顶点着色器vertex.vert,让顶点坐标左乘一个变换矩阵,实现坐标变换:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos, 1.0);
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

然后,在PaintGL中更新如下内容:

void MyOpenGLWidget::paintGL()
{
    //由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数
    // render
    // ------
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // bind Texture
    glActiveTexture(GL_TEXTURE0);
    _texture->bind();
    glActiveTexture(GL_TEXTURE1);
    _texture1->bind();

    QMatrix4x4 transform;//创建单位矩阵
    transform.translate(QVector3D(0.5f, -0.5f, 0.0f));//平移变换
    transform.rotate(qRadiansToDegrees(QTime::currentTime().msecsSinceStartOfDay()/1000.0f), 0.0f, 0.0f, 1.0f);//旋转,将角度转化为弧度

    // update shader uniform
    _shaderProgram->bind();
    _shaderProgram->setUniformValue("transform", transform);

    // render the triangle
    _vao->bind();
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}

如上图,我们创建了一个单位矩阵QMatrix4x4 transform,然后进行了平移变换,又让其随时间旋转(运用qRadiansToDegrees将角度转换成了弧度),最后点击运行,能得到以下个结果:

若是你觉得有些卡顿,可以在MainWindow中中将QTimer的计时调低,例如下面这样:

#include "mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    _myOpenGLWidget = new MyOpenGLWidget;
    this->setCentralWidget(_myOpenGLWidget);
    //设置窗口大小
    this->setGeometry(0,0,800,600);
    //创建定时器,定时刷新QOpenGLWidget
    _timer = new QTimer(this);
    connect(_timer, &QTimer::timeout, this, [this]{
        _myOpenGLWidget->update();
    });
    _timer->start(16);//60fps
}

MainWindow::~MainWindow() {
    if(_myOpenGLWidget)delete _myOpenGLWidget;
}

这样你就得到了一个流畅旋转(60fps)的动画了!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt4.8是一个基于C++的开发框架,它提供了一种简化和加速应用程序开发的方式。OpenGL是一种跨平台的图形渲染API,它可以用于创建高性能的3D图形应用程序。Qt4.8中集成了OpenGL模块,使得开发者可以使用Qt的API来创建基于OpenGL的应用程序。 关于Qt4.8的OpenGL教程,可以从以下几个方面进行介绍。 首先,Qt4.8提供了一些类和函数来简化OpenGL的使用。比如,可以使用QGLWidget类来创建一个OpenGL窗口,可以使用QGLFunctions类来访问OpenGL的函数。 其次,Qt4.8提供了一些示例程序和文档来帮助开发者学习和理解OpenGL的使用。在Qt的安装目录下,可以找到一些示例程序,其中包括了一些使用OpenGL的示例。此外,Qt的官方文档中也提供了关于OpenGL的详细介绍和使用方法。 此外,还有一些第三方的教程和示例程序可以帮助开发者学习Qt4.8中的OpenGL模块。例如,可以在网络上搜索一些Qt4.8的OpenGL教程,或者在一些开源项目中找到使用了Qt4.8和OpenGL的示例程序。 总的来说,学习Qt4.8中的OpenGL模块需要掌握基本的Qt编程知识和OpenGL的基础知识。通过阅读文档、学习示例程序和参考第三方教程,开发者可以更好地理解和应用Qt4.8中的OpenGL模块,从而创建出高性能的图形应用程序。 ### 回答2: QT 4.8是一种流行的跨平台应用程序开发框架,而OpenGL是一种强大的图形渲染API。由于QT 4.8具有强大的界面设计和事件处理功能,结合OpenGL可以实现各种复杂的图形和动画效果。 QT 4.8中的OpenGL教程可以帮助开发人员了解如何使用OpenGLQT程序中创建2D和3D图形教程通常从基础开始,介绍OpenGL的基本概念和原理,如顶点缓冲对象、着色器、纹理等等。然后,教程会演示如何在QT程序中集成OpenGL,包括创建一个OpenGL窗口并进行初始化设置。 教程还会介绍如何在QT中使用OpenGL进行各种图形渲染,如绘制基本形状、绘制立方体和球体、应用光照和阴影效果等等。此外,教程还会展示如何处理用户输入和事件,以及如何使图形交互起来,例如通过鼠标或键盘进行旋转、缩放和平移等操作。 值得一提的是,由于QT 4.8使用了信号和槽机制,开发人员可以很方便地与OpenGL渲染循环进行交互,并实时更新图形显示。此外,QT还提供了一些方便的辅助工具和类,例如QGLWidget和QOpenGLFunctions等,可以简化开发过程。 总之,QT 4.8的OpenGL教程可以帮助开发人员快速入门并掌握在QT应用程序中使用OpenGL进行图形渲染的技巧和方法。通过学习这些教程,开发人员可以创建出更具吸引力和互动性的应用程序,从而丰富用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值