OpenGL学习(二)绘制三维图形 固定管线

一.简单步骤

  • 考虑顶点数据
  • 上色
  • 旋转

二.完整代码

myopenglwidget.h

// An highlighted block
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QtNetwork/QHostInfo>
#include <QtNetwork/QHostAddress>
#include <QtNetwork/QNetworkInterface>
#include <QFile>
#include <QDir>
#include <QImage>
#include <QBuffer>
#include <QKeyEvent>
#include <QTimer>
#include <GL/glu.h>
#include <QMouseEvent>class MyOpenGLWidget : public QOpenGLWidget,protected QOpenGLFunctions  // 可直接使用QOpenGLFunctions中的OpenGL函数
{Q_OBJECT
public:explicit MyOpenGLWidget (QWidget * parent = 0);protected:void initializeGL();void paintGL();void resizeGL(int width,int height);void keyPressEvent(QKeyEvent* e) override;  //Qt键盘事件处理函数void mousePressEvent(QMouseEvent *event) override{if (event->button() == Qt::LeftButton){m_lastPos = event->globalPos() - frameGeometry().topLeft();
//            qDebug() << "Clicked at position: " << m_lastPos;}}void mouseMoveEvent(QMouseEvent *event) override{if (event->buttons() & Qt::LeftButton){QPoint newpos = event->globalPos() - m_lastPos;move(newpos);}}private slots:void rotate() {update();}
private:GLfloat angle;double size_t;bool flag=true;bool fullscreen=false;QPoint m_lastPos;};#endif // MYOPENGLWIDGET_H

 

 myopenglwidget.cpp

#include "myopenglwidget.h"MyOpenGLWidget::MyOpenGLWidget(QWidget *parent): QOpenGLWidget(parent)
{setGeometry(1550,0,100,100);               //设置窗口大小、位置resize(50,50);// 去掉当前窗口的标题栏setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//隐藏标题栏并且设置窗口悬浮在所有程序之上setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
//    setWindowFlags(Qt::WindowStaysOnTopHint);angle = 0;size_t=0;QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(rotate()));timer->start(20);foreach(const QHostAddress& hostAddress,QNetworkInterface::allAddresses())//对于所有检测到的地址if ( hostAddress != QHostAddress::LocalHost && hostAddress.toIPv4Address() )//如果格式为IPv4则输出qDebug()<<hostAddress.toString();}void MyOpenGLWidget::initializeGL()
{initializeOpenGLFunctions();//    glClearColor(0.5, 0.5, 0.5, 0.0);glClearDepth(1.0);  //设置深度缓存glEnable(GL_DEPTH_TEST);    //启动深度测试glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glDepthFunc(GL_LEQUAL); //所作深度测试的类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  //真正精细的透视修正,告诉OPenGL我们希望进行最好的透视修正,这会十分轻微的影响性能,但使得透视图看起来好一点
}void MyOpenGLWidget::paintGL()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//用于清除颜色缓冲区和深度缓冲区,以便开始绘制新的帧。glLoadIdentity();//用于将当前矩阵重置为单位矩阵,即将模型视图矩阵设置为初始状态。glScalef(size_t,size_t,size_t);//进行缩放变换,将物体的大小缩小为原来的0.2倍。glRotatef(angle, 0.0f, 1.0f, 0.0f);//是进行旋转变换,围绕Y轴旋转angle度。其中,angle是一个变量,可以控制旋转的角度。// 启用混合glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);// 启用Alpha测试glEnable(GL_ALPHA_TEST);glAlphaFunc(GL_GREATER, 0.0f);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, 1.0);    //左下顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);     //右下顶点//前侧面下glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, -1.0, 1.0);    //左下顶点glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, -3.0, 0.0);      //下顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);     //右下顶点//右侧面glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, 1.0, 0.0);      //上顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);     //左下顶点glColor3f(0.0, 1.0, 0.0);glVertex3f(1.0, -1.0, -1.0);    //右下顶点//右侧面下glColor3f(0.0, 0.0, 1.0);glVertex3f(1.0, -1.0, 1.0);     //左下顶点glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, -3.0, 0.0);      //上顶点glColor3f(0.0, 1.0, 0.0);glVertex3f(1.0, -1.0, -1.0);    //右下顶点//后侧面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, -1.0);    //左下顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, -1.0);   //右下顶点//后侧面下glColor3f(0.0, 1.0, 0.0);glVertex3f(1.0, -1.0, -1.0);    //左下顶点glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, -3.0, 0.0);      //上顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, -1.0);   //右下顶点//左侧面glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, 1.0, 0.0);      //上顶点glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, -1.0);   //左下顶点glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, -1.0, 1.0);    //右下顶点//左侧面下glColor3f(0.0, 0.0, 1.0);glVertex3f(-1.0, -1.0, -1.0);   //左下顶点glColor3f(1.0, 0.0, 0.0);glVertex3f(0.0, -3.0, 0.0);      //上顶点glColor3f(0.0, 1.0, 0.0);glVertex3f(-1.0, -1.0, 1.0);    //右下顶点glEnd();if(size_t>=0.5){flag=false;}else if(size_t==0){flag=true;}angle += 2;if(flag){size_t+=0.001;}else{size_t-=0.001;}
}void MyOpenGLWidget::resizeGL(int w, int h)
{glViewport(0, 0, w, h);//使用当前屏幕的宽和高来设置视口glMatrixMode(GL_PROJECTION);glLoadIdentity();glMatrixMode(GL_MODELVIEW);glLoadIdentity();}
void MyOpenGLWidget::keyPressEvent(QKeyEvent* e)
{switch (e->key()) {case Qt::Key_Q: {fullscreen = !fullscreen;if(fullscreen) {showFullScreen();}else {showNormal();setGeometry(500,500,640,480);}update();break;}//case Qt::Key_Qcase Qt::Key_Escape: {close();}//Qt::Key_Escape}//switch (e->key())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年福建省职业院校技能大赛中职组“网络安全”赛项规程含竞赛样题

2023年福建省职业院校技能大赛 中职组“网络安全”赛项规程 目录 一、赛项名称 二、竞赛目的 三、竞赛内容 四、竞赛方式 五、竞赛试题 六、竞赛规则 七、竞赛环境 八、技术规范 九、技术平台 十、成绩评定 十一、申诉与仲裁 十二、竞赛观摩 十三、竞赛视频 十…

如何批量给文件名加相同字段?

如何批量给文件名加相同字段&#xff1f;文件名批量修改是一项蕴藏了非常多知识的电脑操作技能&#xff0c;批量修改文件名称不仅仅是修改名称这么简单&#xff0c;有时候我们还可能需要批量王文件名称中添加一些相同的文字字段&#xff0c;批量操作注重的是高效率&#xff0c;…

docker 搭建 redis 主从节点

拉取 redis 镜像&#xff0c;比如拉取 redis v6.0.6 版本 docker pull redis:6.0.6docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE redis 6.0.6 7f7ce731b26f 4 weeks ago 158MB在你的工作目录下面创建 redis/write 和 redis/read 目…

Ubuntu(WSL)卸载与安装指定版本的 openssl

卸载 openssl 1&#xff09;查找并删除 openssl 关联的目录与文件 whereis opensslwhich opensslrm -rf /a/b/c/ // 使用 rm 命令删除所有 openssl 相关目录 2&#xff09;删除软件安装包 apt-get purge openssl 3&#xff09;删除配置文件 rm -rf /etc/ssl 安装 ope…

《Vue.js设计与实现》—Vue3响应系统的原理

一、响应式数据与副作用函数 1. 副作用函数 1-1 指令材料 在JavaScript中&#xff0c;副作用函数是指在执行过程中对外部环境产生可观察的变化或影响的函数。这种函数通常会修改全局变量、修改传入的参数、执行I/O操作&#xff08;如读写文件或发送网络请求&#xff09;、修…

论文阅读《Learning Adaptive Dense Event Stereo from the Image Domain》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/html/Cho_Learning_Adaptive_Dense_Event_Stereo_From_the_Image_Domain_CVPR_2023_paper.html 概述 事件相机在低光照条件下可以稳定工作&#xff0c;然而&#xff0c;基于事件相机的立体方法在域迁移时性…

【教程】开始使用ipaguard进行代码加固混淆

开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过…

springMVC 学习总结(三) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

NGINX高性能服务器与关键概念解析

目录 1 NGINX简介2 NGINX的特性3 正向代理4 反向代理5 负载均衡6 动静分离7 高可用8 结语 1 NGINX简介 NGINX&#xff08;“engine x”&#xff09;在网络服务器和代理服务器领域备受推崇。作为一款高性能的 HTTP 和反向代理服务器&#xff0c;它以轻量级、高并发处理能力以及…

2-1基础算法-枚举/模拟

文章目录 1.枚举2.模拟 1.枚举 [例1] 特别数的和 评测系统 #include <iostream> using namespace std; bool pa(int x) {while (x) {if (x % 10 2 || x % 10 1 || x % 10 0 || x % 10 9) {return true;}else {x x / 10;}}return false; } int main() {int sum0;i…

【pytest】单元测试文件的写法

前言 可怜的宾馆&#xff0c;可怜得像被12月的冷雨淋湿的一条三只腿的黑狗。——《舞舞舞》 \;\\\;\\\; 目录 前言test_1或s_test格式非测试文件pytest.fixture()装饰器pytestselenium test_1或s_test格式 要么 test_前缀 在前&#xff0c;要么 _test后缀 在后&#xff01; …

Java 项目中引入jar包、Maven中打包第三方jar包

文章目录 前言方式一 项目中引入jar包步骤1 导入jar包步骤2 添加第三方jar包的引用步骤3 maven编译的时候能将第三方包编入方式二 Maven中打包第三方jar包步骤1 安装jar包到Maven仓库步骤2 项目中引入依赖前言 在Java项目中,我们经常需要引入第三方的jar包来扩展项目的功能。…

低压无功补偿在分布式光伏现场中的应用

摘要&#xff1a;分布式光伏电站由于建设时间短、技术成熟、收益明显而发展迅速&#xff0c;但光伏并网引起用户功率因数异常的问题也逐渐凸显。针对分布式光伏电站接入配电网后功率因数降低的问题&#xff0c;本文分析了低压无功补偿装置补偿失效的原因&#xff0c;并提出了一…

HTTP响应状态码有哪些?

提起http响应状态码&#xff0c;大家都不陌生&#xff0c;最常见的200&#xff0c;还有404&#xff0c;还有服务器异常500错误&#xff0c;具体http有哪些响应码&#xff0c;我们来具体看一下。 状态码是一个十进制的数字&#xff0c;RFC 标准把状态码分成了五类&#xff0c;用…

如何配置phpmyadmin,使它打开后自动登陆(不需要输入用户名和密码)

首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php&#xff08;如果已经存在 config.inc.php 文件&#xff0c;则直接修改该文件即可&#xff09;。打开config.inc.php 找到 $cfg[Servers][$i][auth_type]&#xff0c;将 1 $cfg[Servers][$i][auth_type…

代码随想录算法训练营第46天| 139.单词拆分 多重背包

JAVA代码编写 139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s &…

Java - JVM内存模型及GC(垃圾回收)机制

JVM内存模型 JVM堆内存划分&#xff08;JDK1.8以前&#xff09; JVM堆内存划分&#xff08;JDK1.8之后&#xff09; 主要变化在于&#xff1a; java8没有了永久代&#xff08;虚拟内存&#xff09;&#xff0c;替换为了元空间&#xff08;本地内存&#xff09;。常量池&#…

arXiv学术速递笔记12.8

文章目录 一、GSGFormer: Generative Social Graph Transformer for Multimodal Pedestrian Trajectory Prediction&#xff08;GSGFormer&#xff1a;用于多通道行人轨迹预测的产生式社会图转换器&#xff09;二、AnimateZero: Video Diffusion Models are Zero-Shot Image An…

数据库中常用的锁

目录 1、数据库中常用的锁类型 2、常见的数据库 3、以MySQL为例 3.1 MySQL的事务 3.2 MySQL事务的四大特性 1. 原子性&#xff08;Atomicity&#xff09; 2. 一致性&#xff08;Consistency&#xff09; 3. 隔离性&#xff08;Isolation&#xff09; ⭐mysql中的事务隔…

《C++新经典设计模式》之第12章 状态模式

《C新经典设计模式》之第12章 状态模式 状态模式.cpp 状态模式.cpp #include <iostream> #include <memory> using namespace std;// 用类表示状态, 一般用于有限状态机 // 状态机3部分组成&#xff1a;状态&#xff08;State&#xff09;、事件&#xff08;Event…