1 #ifndef MYGLWIDGET_H
2 #define MYGLWIDGET_H
3
4 #include <QWidget>
5 #include <QGLWidget>
6
7 class MyGLWidget : public QGLWidget
8 {
9 Q_OBJECT
10 public:
11 explicit MyGLWidget(QWidget *parent = 0);
12 ~MyGLWidget();
13
14 protected:
15 //对3个纯虚函数的重定义
16 void initializeGL();
17 void resizeGL(int w, int h);
18 void paintGL();
19
20 void keyPressEvent(QKeyEvent *event); //处理键盘按下事件
21
22 private:
23 bool fullscreen; //是否全屏显示
24
25 GLfloat m_xRot; //绕x轴旋转的角度
26 GLfloat m_yRot; //绕y轴旋转的角度
27 GLfloat m_zRot; //绕z轴旋转的角度
28
29 QString m_FileName; //图片的路径及文件名
30 GLuint m_Texture; //储存一个纹理
31 };
32
33 #endif // MYGLWIDGET_H
1 MyGLWidget::MyGLWidget(QWidget *parent) :
2 QGLWidget(parent)
3 {
4 fullscreen = false;
5 m_xRot = 0.0f;
6 m_yRot = 0.0f;
7 m_zRot = 0.0f;
8 m_FileName = "D:/QtOpenGL/QtImage/Nehe.bmp"; //应根据实际存放图片的路径进行修改
9
10 QTimer *timer = new QTimer(this); //创建一个定时器
11 //将定时器的计时信号与updateGL()绑定
12 connect(timer, SIGNAL(timeout()), this, SLOT(updateGL()));
13 timer->start(10); //以10ms为一个计时周期
14 }
然后这次我们需要对initializeGL()函数作一定的修改了,具体代码如下:
1 void MyGLWidget::initializeGL() //此处开始对OpenGL进行所以设置
2 {
3 m_Texture = bindTexture(QPixmap(m_FileName)); //载入位图并转换成纹理
4 glEnable(GL_TEXTURE_2D); //启用纹理映射
5
6 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //黑色背景
7 glShadeModel(GL_SMOOTH); //启用阴影平滑
8
9 glClearDepth(1.0); //设置深度缓存
10 glEnable(GL_DEPTH_TEST); //启用深度测试
11 glDepthFunc(GL_LEQUAL); //所作深度测试的类型
12 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //告诉系统对透视进行修正
13 }
1 void MyGLWidget::paintGL() //从这里开始进行所以的绘制
2 {
3 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存
4 glLoadIdentity(); //重置模型观察矩阵
5 glTranslatef(0.0f, 0.0f, -5.0f); //移入屏幕5.0单位
6 glRotatef(m_xRot, 1.0f, 0.0f, 0.0f); //绕x轴旋转
7 glRotatef(m_yRot, 0.0f, 1.0f, 0.0f); //绕y轴旋转
8 glRotatef(m_zRot, 0.0f, 0.0f, 1.0f); //绕z轴旋转
9
10 glBindTexture(GL_TEXTURE_2D, m_Texture); //选择纹理
11 glBegin(GL_QUADS); //开始绘制立方体
12 glTexCoord2f(1.0f, 1.0f);
13 glVertex3f(1.0f, 1.0f, -1.0f); //右上(顶面)
14 glTexCoord2f(0.0f, 1.0f);
15 glVertex3f(-1.0f, 1.0f, -1.0f); //左上(顶面)
16 glTexCoord2f(0.0f, 0.0f);
17 glVertex3f(-1.0f, 1.0f, 1.0f); //左下(顶面)
18 glTexCoord2f(1.0f, 0.0f);
19 glVertex3f(1.0f, 1.0f, 1.0f); //右下(顶面)
20
21 glTexCoord2f(0.0f, 0.0f);
22 glVertex3f(1.0f, -1.0f, 1.0f); //右上(底面)
23 glTexCoord2f(1.0f, 0.0f);
24 glVertex3f(-1.0f, -1.0f, 1.0f); //左上(底面)
25 glTexCoord2f(1.0f, 1.0f);
26 glVertex3f(-1.0f, -1.0f, -1.0f); //左下(底面)
27 glTexCoord2f(0.0f, 1.0f);
28 glVertex3f(1.0f, -1.0f, -1.0f); //右下(底面)
29
30 glTexCoord2f(1.0f, 1.0f);
31 glVertex3f(1.0f, 1.0f, 1.0f); //右上(前面)
32 glTexCoord2f(0.0f, 1.0f);
33 glVertex3f(-1.0f, 1.0f, 1.0f); //左上(前面)
34 glTexCoord2f(0.0f, 0.0f);
35 glVertex3f(-1.0f, -1.0f, 1.0f); //左下(前面)
36 glTexCoord2f(1.0f, 0.0f);
37 glVertex3f(1.0f, -1.0f, 1.0f); //右下(前面)
38
39 glTexCoord2f(0.0f, 0.0f);
40 glVertex3f(1.0f, -1.0f, -1.0f); //右上(后面)
41 glTexCoord2f(1.0f, 0.0f);
42 glVertex3f(-1.0f, -1.0f, -1.0f); //左上(后面)
43 glTexCoord2f(1.0f, 1.0f);
44 glVertex3f(-1.0f, 1.0f, -1.0f); //左下(后面)
45 glTexCoord2f(0.0f, 1.0f);
46 glVertex3f(1.0f, 1.0f, -1.0f); //右下(后面)
47
48 glTexCoord2f(1.0f, 1.0f);
49 glVertex3f(-1.0f, 1.0f, 1.0f); //右上(左面)
50 glTexCoord2f(0.0f, 1.0f);
51 glVertex3f(-1.0f, 1.0f, -1.0f); //左上(左面)
52 glTexCoord2f(0.0f, 0.0f);
53 glVertex3f(-1.0f, -1.0f, -1.0f); //左下(左面)
54 glTexCoord2f(1.0f, 0.0f);
55 glVertex3f(-1.0f, -1.0f, 1.0f); //右下(左面)
56
57 glTexCoord2f(1.0f, 1.0f);
58 glVertex3f(1.0f, 1.0f, -1.0f); //右上(右面)
59 glTexCoord2f(0.0f, 1.0f);
60 glVertex3f(1.0f, 1.0f, 1.0f); //左上(右面)
61 glTexCoord2f(0.0f, 0.0f);
62 glVertex3f(1.0f, -1.0f, 1.0f); //左下(右面)
63 glTexCoord2f(1.0f, 0.0f);
64 glVertex3f(1.0f, -1.0f, -1.0f); //右下(右面)
65 glEnd(); //立方体绘制结束
66
67 m_xRot += 0.6f; //x轴旋转
68 m_yRot += 0.4f; //y轴旋转
69 m_zRot += 0.8f; //z轴旋转
70 }