主要是利用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);
}

VS2008集成QT的OpenGL开发(实现二维图形的旋转)的更多相关文章

  1. Qt移动应用开发(二):使用动画框架

    Qt移动应用开发(二):使用动画框架 上一篇博客介绍了怎样使用Qt的QML来对屏幕分辨率大小进行适应,其实,不同分辨率的适应是一个很棘手的问题,除了分辨率不同外,宽高比(aspect ratio)也不 ...

  2. Android开发 QRCode二维码开发第三方框架

    前言 Android开发里二维码开发经常用到,这里简单的介绍下Android开发里的二维码. 最广泛使用的二维码库zxing zxing是最广泛的二维码库各个平台都可以适用它,但是Android平台使 ...

  3. 【转载】ArcBall二维控制三维旋转

    原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...

  4. 通过Matrix进行二维图形仿射变换

    Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来 ...

  5. matlab绘制二维图形

    常用的二维图形命令: plot:绘制二维图形 loglog:用全对数坐标绘图 semilogx:用半对数坐标(X)绘图 semilogy:用半对数坐标(Y)绘图 fill:绘制二维多边填充图形 pol ...

  6. 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换

    原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...

  7. 二维图形的矩阵变换(二)——WPF中的矩阵变换基础

    原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...

  8. 3ds max学习笔记(十五)-- 二维图形的操作

    (二维图形的创建) 1,在命令面板的[新建],单击第二个按钮: 从中选择对象名称,在视图种单击拖动进行创建,特殊:线:摁[shift]限制水平,垂直方向: 2,二维对象参数: 在渲染中启用:显示二维线 ...

  9. VC、OpenGL、ArcGIS Engine开发的二维三维结合的GIS系统

    一.前言 众所周知,二维GIS技术发展了近四十年,伴随着计算机软硬件以及关系型数据库的飞速发展,二维GIS技术已日臻完善.在对地理信息的分析功能上有着无可比拟的优势.一些宏观的地理信息,一维的地理信息 ...

随机推荐

  1. 苦酒入喉心作痛,红酒入鹅鹅想哭——震惊!勒索病毒想哭靠wine感染了Ubuntu16.04

    都说linux能免疫win的病毒来着…… 今天作死,逛贴吧时好奇下载了一个想哭2.0 (http://pan.baidu.com/share/link?shareid=1393367320&u ...

  2. I - Tunnel Warfare

    I - Tunnel Warfare HDU - 1540 思路:原来以为自己已经完全理解了线段树,现在发现其实还差一些火候,做题的时候太拘泥于格式,思路不是很能放开. #include<cst ...

  3. HDU 1115

    题意很明白要求多边形重心.方法已在上篇讲过了. #include <iostream> #include <cstdio> #include <cstring> # ...

  4. Justinmind使用教程(1)——概述部分

    Justinmind(http://www.justinmind.com/),类似于Axure的一个原型设计工具.就眼下而言,最适合移动端进行原型设计的工具,预计抛开Axure几条街了,可是眼下国内站 ...

  5. spring中abstract bean的使用方法

    什么是abstract bean?简单来说.就是在java中的继承时候,所要用到的父类. 案例文件结构: 当中Person类为父类.Student类为子类,其详细类为: package com.tes ...

  6. [2-SAT] poj 3207 Ikki&#39;s Story IV - Panda&#39;s Trick

    题目链接: id=3207">http://poj.org/problem? id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1 ...

  7. java封装AES加密算法

    在实际coding中会常常遇到往数据库存入密码时加密.URL传參时的加密.由此简单封装了下java中的AES加密算法. 0.import类 import java.security.SecureRan ...

  8. Intel Media SDK安装步骤

    !!!(gcc/g++版本要在4.8以上,本人使用的是5.4版本) 要先安装依赖,按以下步骤依次执行 1.LIBVA git clone https://github.com/intel/libva. ...

  9. 在linux下怎么安装.bin的文件

    *.bin文件安装方法: 1.运行终端到文件目录下2.在终端输入:sudo chmod +x *.bin3.再输入:sudo ./*.bin可安装到任意目录,./*.bin可安装到当前用户有权限的目录

  10. Kafka .NET操作

    Kafaka .NET连接 Kafka目前主流在用的.NET客户端有两个:一个是kafka-net,另外一个是Confluent.Kafka,这里给出使用示例: kafka-net示例: public ...