使用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窗口,并通过坐标变换实现旋转的效果。
