4.OpenGL学习之几何变换

来源:互联网 发布:上海云计算公司 编辑:程序博客网 时间:2024/06/05 16:34

几何变换

  应用于对象几何描述并改变它的位置、方向或大小的操作成为几何变换(geometric transformation)。一个三维位置在齐次坐标中表示为四元列向量。因此,每一次几何变换操作表示成一个从左边去乘坐标向量的4*4矩阵。
在三维齐次坐标表示中,任意点P=(x,y,z)经过几何变换到位置P‘
这里写图片描述

其中:
这里写图片描述

几何变换函数

  在OpenGL的核心库中,每一种基本的几何变换都有一个独立的函数。由于OpenGL是作为三维图形应用编程接口来设计的,所有的变换都在三维空间中定义。在内部,所有坐标均使用4元素列向量表示,而所有变换均使用4*4矩阵来表示。基本的OpenGL几何变换函数

  • glTranslate*(tx, ty, tz); //平移参数tx、ty和tz可以为任意的实数值。
  • glRoate*(theta, vx, vy, vz) //参数theta表示旋转角度数,向量v = (vx, vy, vz)用于定义通过坐标原点的旋转轴的方向。
  • glScale*(sx, sy, sz); //缩放参数可以为任意实数值。
    备注:*或者是f(浮点)或者d(双倍长浮点)

旋转三角形

首先在myQGLWidget.h头文件中,添加一个控制三角形旋转角度的私有变量。

#ifndef MY_QGLWIDGET_H#define MY_QGLWIDGET_H#include <QGLWidget>class MyQGLWidget : public QGLWidget{    Q_OBJECTpublic:    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学习系列导航

原创粉丝点击