• VS2008集成QT的OpenGL开发(实现二维图形的旋转)


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




  • 相关阅读:
    c#添加托盘图标右键后显示菜单选项
    mysql workbench修改字段报错
    mysql增删改查语句
    连接win7的mysql很慢解决方法
    uvm_cmdline_processor
    cadence help文件库调出指令 :cdnshelp
    设置开机自动运行vncserver
    Vector bit-select and part-select addressing verilog片选写法
    Verilog三段式状态机描述
    同步FIFO学习
  • 原文地址:https://www.cnblogs.com/52tech/p/9325129.html
Copyright © 2020-2023  润新知