应用于对象几何描述并改变它的位置、方向或大小的操作成为几何变换(geometric transformation)。一个三维位置在齐次坐标中表示为四元列向量。因此,每一次几何变换操作表示成一个从左边去乘坐标向量的4*4矩阵。
在三维齐次坐标表示中,任意点P=(x,y,z)经过几何变换到位置P‘
在OpenGL的核心库中,每一种基本的几何变换都有一个独立的函数。由于OpenGL是作为三维图形应用编程接口来设计的,所有的变换都在三维空间中定义。在内部,所有坐标均使用4元素列向量表示,而所有变换均使用4*4矩阵来表示。基本的OpenGL几何变换函数
首先在myQGLWidget.h头文件中,添加一个控制三角形旋转角度的私有变量。
#ifndef MY_QGLWIDGET_H
#define MY_QGLWIDGET_H
#include
class MyQGLWidget : public QGLWidget
{
Q_OBJECT
public:
MyQGLWidget(QWidget *parent = 0);
protected:
void initializeGL();
void resizeGL(int width, int height);
void paintGL();
private:
void drawTriangles();
GLfloat rotateAngle_;
};
#endif
在drawTriangles函数中使用glRotatef函数,让三角形对象绕着某个某个轴旋转
void MyQGLWidget::drawTriangles()
{
glRotatef(rotateAngle_, 0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); //设置当前色为红色
glVertex3f(0.0f, 1.0f, -6.0f);
glColor3f(0.0f, 1.0f, 0.0f); //设置当前色为绿色
glVertex3f(-1.0f,-1.0f, -6.0f);
glColor3f(0.0f, 0.0f, 1.0f); //设置当前色为蓝色
glVertex3f(1.0f,-1.0f, -6.0f);
glEnd();
rotateAngle_ += 0.5f;
}
为了使三角形旋转起来,我们使用定时器,每隔10ms调用updateGL()函数。
MyQGLWidget::MyQGLWidget(QWidget *parent)
: QGLWidget(parent),rotateAngle_(0.0f)
{
setFormat(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer));
QTimer *timer = new QTimer(this); //创建一个定时器
connect(timer, SIGNAL(timeout()), this, SLOT(updateGL())); //将定时器的计时信号与updateGL()绑定
timer->start(10); //以10ms为一个计时周期
}
代码下载
OpenGL学习系列导航