VS2008集成QT的OpenGL开发(实现二维图形的旋转)
来源:互联网 发布:mac 照片很大 找不到 编辑:程序博客网 时间:2024/05/18 03:09
主要是利用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_OBJECTpublic: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);}
阅读全文
1 0
- VS2008集成QT的OpenGL开发(实现二维图形的旋转)
- 二维图形旋转的实现
- 二维图形旋转的实现
- 二维图形旋转的实现
- 如何编程实现二维图形的旋转
- Qt的二维图形
- 计算机图形学Opengl实现二维图形的…
- 计算机图形学Opengl实现二维图形的…
- 用VS2008集成Qt 4.7.3开发环境的方法
- 二维图形旋转公式的推导
- 二维图形旋转公式的推导
- openGL 旋转的图形 矩阵操作
- perl-opengl基本图形操作-缩放,二维旋转,二维平移
- 关于Qt的图形旋转问题
- OpenGL旋转立方体的实现
- android studio | openGL es 3.0增强现实(AR)开发 (4) 绘制简单的2D图形、显示、旋转
- VC++调用OpenGL实现3维图形的旋转,平移和缩放
- 二维图形学的变换-平移、旋转、缩放 OpenGL
- Python的列表推导
- ASC 03 题解
- GROMACS运行参数之npt.mdp文件详解
- TCP/IP(八)之总结TCP/IP四层模型
- 第三章遇到的问题&搜到的解释1
- VS2008集成QT的OpenGL开发(实现二维图形的旋转)
- 黑客无处不在:知名清理软件CCleaner也被感染
- 奇偶个数
- 秋招机器学习面试题问题总结
- 通过SQL脚本导入数据到不同数据库避免重复导入三种方式
- 汉诺塔问题 java实现
- 第四周项目三__单链表应用(1)
- 51nod1284 容斥原理
- GROMACS运行参数之md.mdp文件详解