主要是利用Qt中的定时器实现了二维图形的旋转功能:
#ifndef QGLTEST_H
#define QGLTEST_H
#include <QGLWidget>
#include <qgl.h>
#include <QKeyEvent>
#include <GL/GL.H>
#include <GL/GLU.H>
#include <GL/GLUT.H>
class QGLTest : public QGLWidget
{
Q_OBJECT
public:
QGLTest(QWidget* parent = 0, const char* name = 0, bool fs = false);
~QGLTest();
protected:
//初始化窗口组件
void initializeGL();
//绘制OpenGL窗口(只要有更新就会被调用)
void paintGL();
//处理窗口变化的事件
void resizeGL(int width, int height);
//按键按下的触发事件
void keyPressEvent(QKeyEvent *e);
//定时器的使用(函数的重写, 先继承, 后重写)
void timerEvent(QTimerEvent *event);
protected:
bool fullscreen; //是否全屏
GLfloat rTri; //三角形的旋转
GLfloat rQuad; //矩形的旋转
};
#endif // QGLTEST_H
#include "qgltest.h"
//构造函数(对QGLTest下面的有参构造函数进行初始化操作, 而QGLTest这个类本身是继承自QGLWidget)
QGLTest::QGLTest(QWidget* parent, const char* name, bool fs)
: QGLWidget(parent)
{
//设置窗口全屏
fullscreen = fs;
//初始化参数
rTri = 0.0;
rQuad = 0.0;
//设置窗口的位置(左上0,0; 640*480)
setGeometry(0, 0, 640, 480);
//设置窗口的标题
setWindowTitle("Nehe's OpenGL framwork Testing…………");
if (fullscreen)
{
showFullScreen();
}
//这也是成员函数
startTimer(50);
}
//析构函数
QGLTest::~QGLTest()
{
}
//OpenGL窗口创建之后会调用该函数
void QGLTest::initializeGL()
{
setGeometry(300, 150, 640, 480);
//启动阴影平滑(阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑)
glShadeModel(GL_SMOOTH);
//设置清除屏幕的时候使用的颜色(RGBA)
glClearColor(0.0, 0.0, 0.0, 0.5);
//设置深度缓存(深度缓存不断的对物体进入屏幕内部有多深进行跟踪,它的排序决定那个物体先画)
glClearDepth(1.0);
//开启深度测试
glEnable(GL_DEPTH_TEST);
//开启深度测试的类型
glDepthFunc(GL_LEQUAL);
//启用真正精细的透视修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
//重置当前的窗口
void QGLTest::resizeGL(int width, int height)
{
if (0 == height)
{
height = 1;
}
//重置当前的视口
glViewport(0, 0, (GLint)width, (GLint)height);
//选择投影矩阵(透视效果)
glMatrixMode(GL_PROJECTION);
//重置投影矩阵
glLoadIdentity();
//建立透视投影矩阵(视角, 实际窗口纵横比, 相机能看见的最近距离和最远距离)
gluPerspective(45.0, (GLfloat)width / (GLfloat)height, 0.1, 100.0);
//选择模型观察矩阵(模型观察矩阵中存放了我们的物体讯息)
glMatrixMode(GL_MODELVIEW);
//重置模型观察矩阵
glLoadIdentity();
}
//实现我的绘图函数
void QGLTest::paintGL()
{
//清除屏幕和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//重置当前的模型观察矩阵
glLoadIdentity();
//绘制一个矩形和一个三角形
glTranslatef(-1.5, 0.0, -6.0);
//开始旋转
glRotatef(rTri, 0.0, 1.0, 0.0);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f( 0.0, 1.0, 0.0); //上顶点
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0 ); //左下
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 1.0, -1.0, 0.0 ); //右下
glEnd();
//矩形绕着x轴旋转
glLoadIdentity();
glTranslatef(1.5, 0.0, -6.0);
glRotatef(rQuad, 1.0, 0.0, 0.0);
glColor3f(0.5, 0.5, 1.0);
glBegin(GL_QUADS);
glVertex3f(-1.0, 1.0, 0.0);
glVertex3f( 1.0, 1.0, 0.0);
glVertex3f( 1.0, -1.0, 0.0);
glVertex3f(-1.0, -1.0, 0.0);
glEnd();
}
//对按键的处理
void QGLTest::keyPressEvent(QKeyEvent *e)
{
switch (e->key())
{
//按下F2按键全屏
case Qt::Key_F2:
fullscreen = !fullscreen;
if (fullscreen)
{
//开始全屏(只对顶级窗口有效)
showFullScreen();
}
else
{
//设置为顶级窗口模式
showNormal();
//重置窗口(恢复原始窗口)
setGeometry(0, 0, 640, 480);
}
//updateGL()会调用paintGL()实现更新
updateGL();
break;
//按下ESC会退出
case Qt::Key_Escape:
close();
}
}
此时如果直接运行, 效果如下:
发现并没有旋转,几经周折后,添加一个定时器, 即可实现旋转:
//定时器的使用(::表示对一个类的成员函数进行实现)
void QGLTest::timerEvent(QTimerEvent *event)
{
//改变旋转的角度
rTri += 2;
rQuad -= 15;
updateGL();
//开始递归调用
//QGLWidget::timeEvent(event); //error: “timeEvent”: 不是“QGLWidget”的成员
QGLWidget::timerEvent(event);
}