头文件

#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H#include "QtGui/QOpenGLBuffer"
#include "QtWidgets/QOpenGLWidget"
#include "QtGui/QOpenGLVertexArrayObject"
#include "QtGui/QOpenGLFunctions_4_5_Core"class QOpenGLShaderProgram;class OpenGLWidget: public QOpenGLWidget, protected QOpenGLFunctions_4_5_Core
{
public:/* @接口 默认构造函数* @类名 [OpenGLWidget]* @时间 2021年10月8号*/OpenGLWidget();/* @接口 默认析构* @类名 [OpenGLWidget]* @时间 2021年10月8号*/~OpenGLWidget();/* @接口* @返回* @类名 [OpenGLWidget]* @时间 2021年10月8号*/virtual void paintGL();/* @接口* @返回* @类名 [OpenGLWidget]* @时间 2021年10月8号*/virtual void initializeGL();/* @接口* @类名 [OpenGLWidget]* @时间 2021年10月8号*/virtual void resizeGL(int, int);private:/* @接口* @类名 [OpenGLWidget]* @时间 2021年10月17号*/bool initShader();/* @接口* @类名 [OpenGLWidget]* @时间 2021年10月17号*/void initQTimer();/* @接口* @类名 [OpenGLWidget]* @时间 2021年10月17号*/void updateTimer();private:float m_scale = 1.0;float m_xmove = 0.0;float m_ymove = 0.0;float m_rotate = 0;QTimer *m_timer = NULL;QOpenGLBuffer m_vbo, m_ebo;QOpenGLVertexArrayObject m_vao;QOpenGLShaderProgram *m_shaderProgram;};#endif /*OPENGLWIDGET_H*/

源文件

#include "QtCore/QTimer"
#include "openglwidget.h"
#include "QtGui/QWheelEvent"
#include "QtGui/QMouseEvent"
#include "QOpenGLShaderProgram"const char *vertexShader =
"#version 450 core                                     \n"
"in vec3 vPosition;                                        \n"
"in vec3 vColor;                                       \n"
"out vec4 outColor;                                        \n"
"uniform mat4 gWorld;                                  \n"
"void main() {                                         \n"
"   gl_Position = gWorld * vec4(vPosition * 0.5, 1.0);        \n"
"   outColor = vec4(vColor, 1.0);                     \n"
"}                                                     \n";const char *fragmentShader =
"#version 450 core                                     \n"
"in vec4 outColor;                                     \n"
"out vec4 FragColor;                                   \n"
"void main() {                                         \n"
"   FragColor = outColor;                             \n"
"}                                                     \n";OpenGLWidget::OpenGLWidget(): QOpenGLWidget(), m_vao(), m_ebo(QOpenGLBuffer::IndexBuffer), m_vbo(QOpenGLBuffer::VertexBuffer)
{}OpenGLWidget::~OpenGLWidget()
{}void OpenGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glClearColor(1.0f, 1.0f, 1.0f, 1.0f);QMatrix4x4 gScale; gScale.scale(sin(m_scale));QMatrix4x4 gMove;gMove.translate(sin(m_xmove), cos(m_ymove));QMatrix4x4 gRotate; gRotate.rotate(m_rotate, 1, 1);QMatrix4x4 gWorld = gMove * gRotate * gScale;m_shaderProgram->setUniformValue("gWorld", gWorld);m_vao.bind();glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);m_vao.release();
}bool OpenGLWidget::initShader()
{m_shaderProgram = new QOpenGLShaderProgram;m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader);m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader);if (!m_shaderProgram->link()) return false;return m_shaderProgram->bind();
}void OpenGLWidget::initQTimer()
{m_timer = new QTimer; m_timer->start(1);connect(m_timer, &QTimer::timeout, this, &OpenGLWidget::updateTimer);
}void OpenGLWidget::updateTimer()
{m_scale += 0.01;m_xmove += 0.01;m_ymove += 0.01;m_rotate += 1;repaint();
}void OpenGLWidget::initializeGL()
{initializeOpenGLFunctions(); //初始化OPenGL功能函数glClearColor(0.0f, 1.0f, 1.0f, 1.0f);glClearDepth(1.0);glEnable(GL_DEPTH_TEST);if (!initShader()) return;float vertices[] = {-1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 0.0f,0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f};GLuint indices[] = {0, 3, 1,1, 3, 2,2, 3, 0,0, 1, 2};m_vao.create();m_vao.bind();m_vbo.create();m_vbo.bind();m_vbo.allocate(vertices, 4 * 6 * sizeof(GLfloat));m_ebo.create();m_ebo.bind();m_ebo.allocate(indices, 4 * 3 * sizeof(GLuint));int attr = -1;//顶点属性设置attr = m_shaderProgram->attributeLocation("vPosition");m_shaderProgram->setAttributeBuffer(attr, GL_FLOAT, 0, 3, sizeof(GLfloat) * 6);m_shaderProgram->enableAttributeArray(attr);//颜色属性设置attr = m_shaderProgram->attributeLocation("vColor");m_shaderProgram->setAttributeBuffer(attr, GL_FLOAT, sizeof(GLfloat) * 3, 3, sizeof(GLfloat) * 6);m_shaderProgram->enableAttributeArray(attr);m_vao.release();m_vbo.release();m_ebo.release();initQTimer();
}

运行结果:

QOpenGLWidget 第二篇 EBO、VBO、VAO 绘制三棱锥

QOpenGLWidget 第四篇 透视投影

QOpenGLWidget 第三篇(旋转平移缩放)相关推荐

  1. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接

    CAD+VBA 实现图块的旋转平移缩放和拼接 前言 一.需求 二.实现步骤 1.识别文件中的正确的坐标信息 2.选择图块上的角点,计算正确坐标信息与正确角点坐标之间的平移旋转参数,并进行平移旋转,加入 ...

  2. PAOGD个人作业3——OpenGL,实现模型自身的旋转,平移,缩放

    中山大学数据科学与计算机学院本科生实验报告 (2019年春季学期) 课程名称 PAOGD 任课老师 郑贵锋 年级 16 专业(方向) 软件工程(计算机应用方向) 学号 16340132 姓名 梁颖霖 ...

  3. openGL-读取off、stl、obj文件并旋转平移缩放操作

    说明 很多朋友反馈,加载完毕后是一片空白-不用担心.我认为你很大程度上已经配置成功.这时候你可以试一试点击数字1.2.3进行查看. 此外我建议你使用点面数目规模较小的模型例如bunny等而不是使用ki ...

  4. opengl加载和绘制STL模型+旋转 平移 缩放 光照

    一.开发环境说明 操作系统:windows 开发软件:Visual Studio 2017 编程语言:基于控制台下的opengl 用到的库: glut opengl环境配置查看博客 二.STL文件介绍 ...

  5. matlab坐标旋转平移缩放,MATLAB实现RGB图像的平移、缩放和旋转

    Func的1 2 3分别对应平移.旋转.缩放功能 function []=transition(func,I) if func==1 delta_x=str2double(inputdlg('请输入向 ...

  6. 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】

    ✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...

  7. 【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)

    前文链接: YOLOv5-v5.0-yolov5s网络架构详解(第一篇)_星魂非梦的博客-CSDN博客 YOLOv5-5.0v-yaml 解析(第二篇)_星魂非梦的博客-CSDN博客 ​​​​​​1. ...

  8. OpenGL着色器透视变换实例-通过旋转平移调试着色器

    OpenGL 着色器新手样例 带透视变换和旋转平移缩放 OpenGL着色器样例 - 最简单的顶点着色器 + 片元着色器 头文件和宏定义 全局变量部分 读取着色器 从文本中读取着色器代码 初始化着色器 ...

  9. three.js之访问几何体数据与几何体的旋转平移

    文章目录 访问几何体数据 简介 例子 BoxGeometry PlaneBufferGeometry 旋转.缩放.平移变换 注意 专栏目录请点击 访问几何体数据 简介 一般我们在开发项目的时候,可能会 ...

最新文章

  1. 深度学习最常用的10个激活函数
  2. OSChina 周三乱弹 ——相亲妹子说了一句让我肾疼的话
  3. 力扣:1两数之和(python)-------->双向取值
  4. 信息学奥赛一本通(1030:计算球的体积)
  5. 2016-02-24 获取设备 通知开关
  6. JavaWeb入门之简单分页查询功能实现
  7. 瑞幸咖啡考虑重回纳斯达克上市 官方回应:报道不实
  8. Windows定时开机 命令 自动开机
  9. JDK、J2EE、J2SE、J2ME的区别(转-2021-04-30)
  10. python七巧板拼图代码_为什么代码都是用英文来写的,将来会有用中文写代码的那天吗?...
  11. python在输出中间加空行_python输出空行
  12. 《12个工作的基本》读书分享
  13. 浅谈上溢overflow和下溢underflow
  14. 牛B学生上课气死老师
  15. 微信企业支付(一)注意
  16. Values in v:2 index key pattern cannot be of type object
  17. linux 设置每天定时重启
  18. 同质化游戏做出不同点在于背景音乐
  19. Tensorboard可视化神经网络详细教程
  20. Element UI表格行拖拽功能

热门文章

  1. iTunes for win(苹果同步软件) v11.2.0.115 官方正式版
  2. 快递查询软件,设置自动跟踪提醒,一键查询物流信息
  3. springboot启动图标_自定义 SpringBoot 启动Logo
  4. HealthKit 从健康app中获取步数信息
  5. IPv4、IPv6详解
  6. Segmentation of retinal vessels based on MRANet
  7. 古老计算机的显卡,老电脑换卡还能战三年 低价位显卡盘点
  8. 在c语言中1和0的意思,C语言里的0x0和0x1是什么意思啊
  9. Java操作MongoDB增删改查的基本操作
  10. leaflet 图层的建立