QOpenGLWidget 第三篇(旋转平移缩放)
头文件
#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 第三篇(旋转平移缩放)相关推荐
- 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
CAD+VBA 实现图块的旋转平移缩放和拼接 前言 一.需求 二.实现步骤 1.识别文件中的正确的坐标信息 2.选择图块上的角点,计算正确坐标信息与正确角点坐标之间的平移旋转参数,并进行平移旋转,加入 ...
- PAOGD个人作业3——OpenGL,实现模型自身的旋转,平移,缩放
中山大学数据科学与计算机学院本科生实验报告 (2019年春季学期) 课程名称 PAOGD 任课老师 郑贵锋 年级 16 专业(方向) 软件工程(计算机应用方向) 学号 16340132 姓名 梁颖霖 ...
- openGL-读取off、stl、obj文件并旋转平移缩放操作
说明 很多朋友反馈,加载完毕后是一片空白-不用担心.我认为你很大程度上已经配置成功.这时候你可以试一试点击数字1.2.3进行查看. 此外我建议你使用点面数目规模较小的模型例如bunny等而不是使用ki ...
- opengl加载和绘制STL模型+旋转 平移 缩放 光照
一.开发环境说明 操作系统:windows 开发软件:Visual Studio 2017 编程语言:基于控制台下的opengl 用到的库: glut opengl环境配置查看博客 二.STL文件介绍 ...
- matlab坐标旋转平移缩放,MATLAB实现RGB图像的平移、缩放和旋转
Func的1 2 3分别对应平移.旋转.缩放功能 function []=transition(func,I) if func==1 delta_x=str2double(inputdlg('请输入向 ...
- 【OpenGL学习笔记⑥】——3D变换【旋转的正方体 实现地月系统 旋转+平移+缩放】
✈️ 文章目录 零. 成果预览图 一.3D立方体的顶点数组 二.纹理旋转 三.纹理缩放 四.画n个3D图形 五.轨道的数学公式 六.深度缓冲(Z 缓冲) 七.完整代码 八.参考附录: 神器的正方体 ☁ ...
- 【目标检测-YOLO】YOLOv5-5.0v-数据处理(第三篇)
前文链接: YOLOv5-v5.0-yolov5s网络架构详解(第一篇)_星魂非梦的博客-CSDN博客 YOLOv5-5.0v-yaml 解析(第二篇)_星魂非梦的博客-CSDN博客 1. ...
- OpenGL着色器透视变换实例-通过旋转平移调试着色器
OpenGL 着色器新手样例 带透视变换和旋转平移缩放 OpenGL着色器样例 - 最简单的顶点着色器 + 片元着色器 头文件和宏定义 全局变量部分 读取着色器 从文本中读取着色器代码 初始化着色器 ...
- three.js之访问几何体数据与几何体的旋转平移
文章目录 访问几何体数据 简介 例子 BoxGeometry PlaneBufferGeometry 旋转.缩放.平移变换 注意 专栏目录请点击 访问几何体数据 简介 一般我们在开发项目的时候,可能会 ...
最新文章
- 深度学习最常用的10个激活函数
- OSChina 周三乱弹 ——相亲妹子说了一句让我肾疼的话
- 力扣:1两数之和(python)-------->双向取值
- 信息学奥赛一本通(1030:计算球的体积)
- 2016-02-24 获取设备 通知开关
- JavaWeb入门之简单分页查询功能实现
- 瑞幸咖啡考虑重回纳斯达克上市 官方回应:报道不实
- Windows定时开机 命令 自动开机
- JDK、J2EE、J2SE、J2ME的区别(转-2021-04-30)
- python七巧板拼图代码_为什么代码都是用英文来写的,将来会有用中文写代码的那天吗?...
- python在输出中间加空行_python输出空行
- 《12个工作的基本》读书分享
- 浅谈上溢overflow和下溢underflow
- 牛B学生上课气死老师
- 微信企业支付(一)注意
- Values in v:2 index key pattern cannot be of type object
- linux 设置每天定时重启
- 同质化游戏做出不同点在于背景音乐
- Tensorboard可视化神经网络详细教程
- Element UI表格行拖拽功能
热门文章
- iTunes for win(苹果同步软件) v11.2.0.115 官方正式版
- 快递查询软件,设置自动跟踪提醒,一键查询物流信息
- springboot启动图标_自定义 SpringBoot 启动Logo
- HealthKit 从健康app中获取步数信息
- IPv4、IPv6详解
- Segmentation of retinal vessels based on MRANet
- 古老计算机的显卡,老电脑换卡还能战三年 低价位显卡盘点
- 在c语言中1和0的意思,C语言里的0x0和0x1是什么意思啊
- Java操作MongoDB增删改查的基本操作
- leaflet 图层的建立