博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VS2008集成QT的OpenGL开发(实现二维图形的旋转)
阅读量:4942 次
发布时间:2019-06-11

本文共 3343 字,大约阅读时间需要 11 分钟。

主要是利用Qt中的定时器实现了二维图形的旋转功能:

#ifndef QGLTEST_H#define QGLTEST_H#include 
#include
#include
#include
#include
#include
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);}

转载于:https://www.cnblogs.com/52tech/p/9325129.html

你可能感兴趣的文章
php 数据处理--合并,拆分,追加,去重
查看>>
AX2012 学习自动生成编码
查看>>
JAVA获取服务器路径的方法
查看>>
安装Jaspersoft Studio
查看>>
友盟消息推送UPush
查看>>
关于kinect的一些想法
查看>>
工作的时候 用到了 获取时间 DateTime 整理了一下
查看>>
微信公众号开发 [04] 模板消息功能的开发
查看>>
第七章 consul docker集群
查看>>
数据库分库分表
查看>>
一个可以参考的JVM内存分配
查看>>
解决页面<textarea>初始焦点显示位置不正确的问题
查看>>
Caffe2的安装
查看>>
山东济南站见面会完美收官
查看>>
[LeetCode] 33. Search in Rotated Sorted Array
查看>>
LightOJ - 1032 数位DP
查看>>
np.array()和np.mat()区别
查看>>
用汉堡包的方式评价一下自己的合作伙伴
查看>>
P1550 [USACO08OCT]打井Watering Hole
查看>>
myeclipse上SVN代码合并详细步骤图解
查看>>