龙空技术网

OPenGL笔记--多边形旋转

QT教程 130

前言:

此刻咱们对“mfc多边形边缘填充算法”大体比较关注,各位老铁们都需要分析一些“mfc多边形边缘填充算法”的相关内容。那么小编也在网摘上网罗了一些关于“mfc多边形边缘填充算法””的相关内容,希望朋友们能喜欢,你们快快来学习一下吧!

一、前置知识

OPenGL中使用​glRotatef(Angle, Xvector, Yvector, Zvector)​​来让对象绕某个轴旋转

Angle:通常是个变量,导表对象转过的角度;

Xvector, Yvector, Zvector:共同决定对象旋转的方向;

(1,0,0)表示绕着X轴旋转、 (0,1,0)表示绕着Y轴旋转、 (0,0,1)表示绕着Z轴旋转;

二、运行效果

QT学习基地:C/C++项目实战/Qt5/C语言/c++/数据库/OpenCV/MFC/QT项目-学习视频教程-腾讯课堂

三、关键代码

void GL_Test::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); //绕Y轴旋转rTri度//开始绘制三角形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();//绘制三角形结束//-----------------------------------------glLoadIdentity(); //重置当前的模型观察矩阵glTranslatef(-1.5, 0.0, -6.0);glRotatef(rQuad, 1.0, 0.0, 0.0); //绕X轴旋转rQuad度//开始绘制正方形glTranslatef(3.0, 0.0, 0.0);glBegin(GL_QUADS);glColor3f(1.0, 0.0, 0.0);glVertex3f(-1.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); //右下顶点glColor3f(1.0, 1.0, 0.0);glVertex3f(-1.0, -1.0, 0.0); //左下顶点glEnd();//绘制正方形结束//-----------------------------------------rTri += 5;rQuad += 5;}
四、完整代码
#ifndef GL_TEST_H#define GL_TEST_H#include <qgl.h> //因为QGLWidget类被包含在qgl.h头文件中#include <glut.h> //使用glut库中的API#include <QKeyEvent>#include <QTimer>//继承QGLWidget得到OPenGL窗口部件类class GL_Test : public QGLWidget{public:GL_Test(QWidget* parent = 0, bool fs = false);~GL_Test();protected:/*************************************************************************************************QGLWidget 类已经内置了对 OpenGL 的处理,就是通过对 initializeGL()、 paintGL()和 resizeGL()这个三个函数实现*************************************************************************************************/void initializeGL() override; //用来初始化OPenGL窗口,可以在里面设定一些有关选项void paintGL() override; //用来绘制OPenGL的窗口,只要有更新发生,这个函数就会被调用void resizeGL(int w, int h) override; //用来处理窗口大小变换这一事件,resizeGL()在处理完后会自动刷新屏幕void keyPressEvent(QKeyEvent* e) override; //Qt键盘事件处理函数protected:bool fullscreen; //用来保存窗口是否处于全屏状态的变量GLfloat rTri; //用来旋转三角形GLfloat rQuad; //用来旋转正方形};#endif // GL_TEST_H

#include "gl_test.h"GL_Test::GL_Test(QWidget* parent, bool fs): QGLWidget(parent){fullscreen = fs;rTri = 0.0;rQuad = 0.0;setGeometry(500,500,640,480); //设置窗口大小、位置setWindowTitle("The first OpenGL Window"); //设置窗口标题if(fullscreen) {showFullScreen();}QTimer* timer = new QTimer(this);connect(timer,&QTimer::timeout,[=]{updateGL();});timer->start(50);}GL_Test::~GL_Test(){}void GL_Test::initializeGL(){glShadeModel(GL_SMOOTH); //启用smooth shading(阴影平滑)glClearColor(0.0, 0.0, 0.0, 0.0); //清除屏幕时所用的颜色,rgba【0.0(最黑)~1.0(最亮)】glClearDepth(1.0); //设置深度缓存glEnable(GL_DEPTH_TEST); //启动深度测试glDepthFunc(GL_LEQUAL); //所作深度测试的类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); //真正精细的透视修正,告诉OPenGL我们希望进行最好的透视修正,这会十分轻微的影响性能,但使得透视图看起来好一点}void GL_Test::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); //绕Y轴旋转rTri度//开始绘制三角形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();//绘制三角形结束//-----------------------------------------glLoadIdentity(); //重置当前的模型观察矩阵glTranslatef(-1.5, 0.0, -6.0);glRotatef(rQuad, 1.0, 0.0, 0.0); //绕X轴旋转rQuad度//开始绘制正方形glTranslatef(3.0, 0.0, 0.0);glBegin(GL_QUADS);glColor3f(1.0, 0.0, 0.0);glVertex3f(-1.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); //右下顶点glColor3f(1.0, 1.0, 0.0);glVertex3f(-1.0, -1.0, 0.0); //左下顶点glEnd();//绘制正方形结束//-----------------------------------------rTri += 5;rQuad += 5;}void GL_Test::resizeGL(int w, int h){if(h == 0) { //防止h为0h = 1;}glViewport(0, 0, (GLint)w, (GLint)h); //重置当前的视口(Viewport)glMatrixMode(GL_PROJECTION); //选择投影矩阵glLoadIdentity(); //重置投影矩阵gluPerspective( 45.0, (GLfloat)w/(GLfloat)h, 0.1, 100.0 ); //建立透视投影矩阵glMatrixMode(GL_MODELVIEW); //选择模型观察矩阵glLoadIdentity(); //重置模型观察矩阵}void GL_Test::keyPressEvent(QKeyEvent* e){switch (e->key()) {case Qt::Key_Q: {fullscreen = !fullscreen;if(fullscreen) {showFullScreen();}else {showNormal();setGeometry(500,500,640,480);}updateGL();break;}//case Qt::Key_Qcase Qt::Key_Escape: {close();}//Qt::Key_Escape}//switch (e->key())}

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:Qt资料领取(视频教程+文档+代码+项目实战)

标签: #mfc多边形边缘填充算法