参考链接: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=04
周炜的NeHe中文教程 :http://www.owlei.com/DancingWind/
// glwidget.h
#ifndef GLWIDGET_H
#define GLWIDGET_H
#include <QtCore>
#include <QtGui>
#include <QtOpenGL>
class GLWidget : public QGLWidget
{
Q_OBJECT
public:
GLWidget(int timerInterval = 0, QWidget *parent = 0);
protected:
virtual void initializeGL() = 0;
virtual void resizeGL(int width, int height) = 0;
virtual void paintGL() = 0;
virtual void keyPressEvent(QKeyEvent *e);
virtual void timeOut();
protected slots:
virtual void timeOutSlot();
private:
QTimer *m_timer;
};
#endif
// glwidget.cpp
#include "glwidget.h"
GLWidget::GLWidget(int timerInterval, QWidget *parent)
: QGLWidget(parent)
{
if (timerInterval == 0) {
m_timer = 0;
} else {
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
m_timer->start(timerInterval);
}
}
void GLWidget::keyPressEvent(QKeyEvent *e)
{
switch (e->key()) {
case Qt::Key_Escape:
close();
}
}
void GLWidget::timeOut()
{
}
void GLWidget::timeOutSlot()
{
timeOut();
}
// glwidget5.h
#ifndef GLWIDGET5_H
#define GLWIDGET5_H
#include "../glwidget.h"
class GLWidget5 : public GLWidget
{
// Q_OBJECT //! 注意:此处不能有Q_OBJECT
public:
GLWidget5(int timerInterval = 0, QWidget *parent = 0);
protected:
virtual void initializeGL();
virtual void resizeGL( int width, int height );
virtual void paintGL();
virtual void timeOut();
private:
GLfloat rtri, rquad;
};
#endif // GLWIDGET5_H
// glwidget5.cpp
#include "glwidget5.h"
GLWidget5::GLWidget5(int timerInterval, QWidget *parent)
: GLWidget(timerInterval, parent)
{
rtri = rquad = 0.0f;
}
void GLWidget5::initializeGL()
{
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void GLWidget5::resizeGL(int width, int height)
{
height = height?height:1;
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void GLWidget5::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(-1.5f,0.0f,-6.0f); // 相对当前所在的屏幕位置移动
glRotatef(rtri, 0.0f, 1.0f, 0.0f); // 绕y轴旋转金字塔
glBegin(GL_TRIANGLES); // 开始绘制金字塔的各个面
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点(前侧面)
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex3f(-1.0f, -1.0f, 1.0f); // 三角形的左下顶点(前侧面)
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex3f(1.0f, -1.0f, 1.0f); // 三角形的右下顶点(前侧面)
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点(右侧面)
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex3f(1.0f, -1.0f, 1.0f); // 三角形的左下顶点(右侧面)
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex3f(1.0f, -1.0f, -1.0f); // 三角形的右下顶点(右侧面)
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点(后侧面)
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex3f(1.0f, -1.0f, -1.0f); // 三角形的左下顶点(后侧面)
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex3f(-1.0f, -1.0f, -1.0f); // 三角形的右下顶点(后侧面)
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex3f(0.0f, 1.0f, 0.0f); // 三角形的上顶点(左侧面)
glColor3f(0.0f, 0.0f, 1.0f); // 蓝色
glVertex3f(-1.0f, -1.0f, -1.0f); // 三角形的左下顶点(左侧面)
glColor3f(0.0f, 1.0f, 0.0f); // 绿色
glVertex3f(-1.0f, -1.0f, 1.0f); // 三角形的右下顶点(左侧面)
glEnd();
glLoadIdentity(); // 重置模型观察矩阵
glTranslatef(1.5f, 0.0f, -6.0f); // 右移1.5单位,并移入屏幕6.0单位
glRotatef(rquad, 1.0f, 1.0f, 1.0f);
/* 开始画立方体,它由六个四边形组成,所有的四边形都以逆时针顺序绘制
(右上角->左上角->左下角->右下角)
*/
glBegin(GL_QUADS);
glColor3f(0.5f, 0.5f, 1.0f);
glVertex3f(1.0f, 1.0f, -1.0f); // 四边形的右上顶点(顶面)
glColor3f(0.1f, 0.0f, 0.2f);
glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上顶点(顶面)
glColor3f(0.2f, 0.2f, 0.3f);
glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点(顶面)
glColor3f(0.3f, 0.3f, 0.3f);
glVertex3f(1.0f, 1.0f, 1.0f); // 四边形的右下顶点(顶面)
glColor3f(1.0f, 0.5f, 0.0f); // 橙色
glVertex3f(1.0f, -1.0f, 1.0f); // 四边形的右上顶点(底面)
glColor3f(0.2f, 0.4f, 0.4f);
glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的左上顶点(底面)
glColor3f(0.3f, 0.4f, 0.1f);
glVertex3f(-1.0f, -1.0f, -1.0f); // 四边形的左下顶点(底面)
glColor3f(0.5f, 0.2f, 0.4f);
glVertex3f(1.0f, -1.0f, -1.0f); // 四边形的右下顶点(底面)
glColor3f(1.0f, 0.0f, 0.0f); // 红色
glVertex3f(1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面)
glColor3f(0.6f, 0.8f, 0.9f);
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); // 四边形的右上顶点(后面)
glColor3f(0.6f, 0.2f, 0.1f);
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); // 四边形的右上顶点(左面)
glColor3f(0.7f, 0.5f, 0.9f);
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); // 四边形的右下顶点(右面)
*/
glEnd();
}
void GLWidget5::timeOut()
{
rtri += 0.5f;
rquad -= 0.25f;
updateGL();
}
// main.cpp
#include "glwidget5.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GLWidget *w = new GLWidget5(10);
w->show();
return a.exec();
}