第二,Qt 对 OpenGL 的支持在于它提供了一个用于显示 OpenGL 渲染结果的 widget,即 QGLWidget,如果我们需要显示 OpenGL 的渲染结果,我们就应该继承 QGLWidget,然后实现它三个方法:initializeGL() 用于初始化 OpenGL,通常设置一些前期的背景色、光照等等;paintGL() 用于渲染整个场景;resizeGL() 用于在 widget 大小变化的时候产生合理的 view。
第三,如果需要设置动画效果,本质上是在 paintGL() 过程中加入某些变化的参数,这样每次调用 paintGL() 的时候产生不同的渲染结果。实现动画需要调用 QTimer 之类的定时器,而这些对象并不能访问前面的这些方法(因为是 protected 的),因此一般调用含有 updateGL() 方法的 slot,将 QTimer 的某些 signal 与之 connect 即可。
第四,如果需要加入鼠标和键盘的操作,应该设置 mousePressEvent()、mouseMoveEvent() 等事件,将需要的方法绑定到对应的事件中。
总而言之,OpenGL 的使用并不神秘,只是我们需要进一步理解其中的一些基本概念。下面是一个简单的 OpenGL 程序,可以看到前面第二点里面所说的三个要素,我们在后面的分析中会逐步加深。下面是继承 QGLWidget 类的声明
#ifndef GLWIDGET_H #define GLWIDGET_H #include <QGLWidget> #include <QVector> #include <gl.h> class GLWidget : public QGLWidget { public: GLWidget( QWidget* = NULL, const QGLWidget* = NULL, Qt::WindowFlags = Qt::Widget ) ; protected: void initializeGL(); void paintGL(); void resizeGL(int width, int height); private: QVector<GLuint> stars ; } ; #endif下面是相关实现,
#include "glwidget.h" GLWidget::GLWidget( QWidget* parent, const QGLWidget* shared, Qt::WindowFlags flags) : QGLWidget( parent, shared, flags ), stars(1) { } void GLWidget::initializeGL() { QGLWidget::initializeGL() ; glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth( 1.0 ) ; } void GLWidget::paintGL() { glClearColor( 0.0, 0.0, 0.0, 0.0 ) ; glClear (GL_COLOR_BUFFER_BIT); glLoadIdentity() ; glColor3f (1.0, 1.0, 1.0); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); glBegin(GL_POLYGON); glVertex3f( 0.25, 0.25, .0 ) ; glVertex3f( 0.75, 0.25, .0 ) ; glVertex3f( 0.75, 0.75, .0 ) ; glVertex3f( 0.25, 0.75, .0 ) ; glEnd(); glFlush(); } void GLWidget::resizeGL(int w, int h ) { glViewport( 0, 0, w, h ) ; glMatrixMode( GL_PROJECTION ) ; glLoadIdentity() ; }我想后面我们应该会更关注 OpenGL 本身,而不仅仅在 Qt 上。
No comments:
Post a Comment