欢迎访问宙启技术站
智能推送

使用QOpenGLWidget()实现OpenGL的坐标变换

发布时间:2024-01-02 10:08:45

QOpenGLWidget是Qt中的一个类,继承自QWidget,用于在Qt应用程序中显示OpenGL图形的小部件。它提供了一些函数用于实现OpenGL的坐标变换。

使用QOpenGLWidget类创建一个OpenGL窗口的步骤如下:

1. 创建一个新的Qt应用程序,并在主窗口中添加一个QOpenGLWidget部件。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QOpenGLWidget *glWidget = new QOpenGLWidget(this);
    setCentralWidget(glWidget);
}

2. 在QOpenGLWidget的子类中,重写initializeGL()函数用于初始化OpenGL。

void MyOpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    // 设置OpenGL状态
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置清屏颜色为黑色
    glEnable(GL_DEPTH_TEST); // 启用深度测试
}

3. 在QOpenGLWidget的子类中,重写paintGL()函数用于绘制图形。

void MyOpenGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清屏深度缓冲区

    // 设置视口
    int width = this->width();
    int height = this->height();
    glViewport(0, 0, width, height);

    // 设置投影矩阵
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (double)width / height, 0.1, 100.0);

    // 设置模型视图矩阵
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -5.0f);
    glRotatef(angle, 1.0f, 1.0f, 1.0f);

    // 绘制一个立方体
    glBegin(GL_QUADS);
    // 绘制顶面
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex3f(1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);
    // 绘制底面
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(1.0f, -1.0f, -1.0f);
    // 绘制前面
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, 1.0f);
    // 绘制后面
    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, -1.0f);
    // 绘制左面
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, -1.0f);
    glVertex3f(-1.0f, -1.0f, 1.0f);
    // 绘制右面
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex3f(1.0f, 1.0f, -1.0f);
    glVertex3f(1.0f, 1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, 1.0f);
    glVertex3f(1.0f, -1.0f, -1.0f);
    glEnd();

    // 自动递增旋转角度,实现动画效果
    angle += 1.0f;
    update();
}

在以上代码中,使用glMatrixMode函数设置当前矩阵为GL_MODELVIEW,然后使用glLoadIdentity和glTranslatef函数设置模型视图矩阵,实现坐标变换。使用glRotatef函数实现旋转变换。

以上是一个简单的OpenGL窗口的实现例子,绘制了一个旋转的立方体。运行程序后,可以看到立方体会不断旋转。

这个例子展示了如何使用QOpenGLWidget类来创建一个OpenGL窗口,并通过坐标变换实现旋转的效果。