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())
}
相关文章:

OpenGL学习(二)绘制三维图形 固定管线
一.简单步骤 考虑顶点数据上色旋转 二.完整代码 myopenglwidget.h // An highlighted block #ifndef MYOPENGLWIDGET_H #define MYOPENGLWIDGET_H #include <QOpenGLWidget> #include <QOpenGLFunctions> #include <QOpenGLShaderProgram> #include <Q…...

微信小程序游戏:移动游戏市场的新兴力量
随着移动互联网的迅猛发展,微信小程序游戏已经成为现代数字娱乐领域的一股不可忽视的力量。这些游戏通过融入微信这一广泛使用的社交平台,为用户带来了全新的游戏体验。本文探讨了微信小程序游戏的特点、发展现状和未来趋势。 微信小程序游戏最大的特点之…...

Netflix Mac(奈飞客户端)激活版软件介绍
Netflix Mac(奈飞客户端)是一款流行的视频播放软件,专为Mac用户设计。它提供了大量的高质量电影、电视剧、纪录片和动画片资源,让用户可以随时随地观看自己喜欢的内容。 首先,Netflix Mac(奈飞客户端)以其简洁直观的用户界面而闻名。用户可以…...

【Docker】进阶之路:(十)Docker日志管理
【Docker】进阶之路:(十)Docker日志管理 查看引擎日志查看容器日志清理容器日志日志驱动程序日志驱动程序概述local日志驱动json-file 日志驱动syslog 日志驱动日志驱动的选择 Docker 容器日志分为两类:引擎日志和容器日志。Docke…...

Lcss算法介绍与应用演示
Lcss算法介绍 LCSS(最长公共子序列,Longest Common Subsequence)算法是一种用于比较两个序列相似度的方法。它寻找两个序列中的最长子序列,这个子序列不需要在原始序列中连续,但必须保持原有序列中元素的相对顺序。LC…...

【SpringBoot】从入门到精通的快速开发指南
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《SpringBoot》。🎯🎯 &…...

每日一练【长度最小的子数组】
一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 二、题目解析 经…...

HTML 块级元素与行内元素有哪些以及注意、总结
行内元素和块级元素是HTML中的两种元素类型,它们在页面中的显示方式和行为有所不同。 块级元素(Block-level Elements): 常见的块级元素有div、p、h1-h6、ul、ol、li、table、form等。 块级元素会独占一行,即使没有…...

SpringBoot热部署
SpringBoot热部署 借鉴链接🔗:SpringBoot中的热部署 添加devtools依赖和pom插件 <!-- devtools 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId&…...

Jmeter入门
一、下载jmeter 官网下载 下载之后解压,在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图,选择语言为中文,可以修改测试计划的名称。如下右图,添加线程组 添加线程组 添加http请求 路径传参方式 …...

go集成nacos
1,go集成nacos 注册实例与注销实例 package mainimport ("fmt""github.com/nacos-group/nacos-sdk-go/clients""github.com/nacos-group/nacos-sdk-go/clients/naming_client""github.com/nacos-group/nacos-sdk-go/common/constant"…...

NLP项目实战01--电影评论分类
介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的、负面的。 展示: 训练展示如下…...

Linux vmstat命令:监控系统资源
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。此命令的基本格式有如下 2 种: [rootlocalhost ~]# vmstat [-a…...

php爬虫规则与robots.txt讲解
在进行网页爬虫时,有一些规则需要遵守,以避免违反法律,侵犯网站隐私和版权,以及造成不必要的麻烦。以下是一些常见的PHP爬虫规则: 1. 尊重网站的使用条款:在开始爬取之前,请确保你阅读并理解了…...

Ray使用备注
Ray使用备注 框架介绍 Ray是一种python分布式任务调度框架其支持 无状态的任务并发执行,也支持 有状态的任务按照一定顺序执行其支持 分布式调度器,在一个节点上创建的任务先给本节点的局部调度器,并让本节点自己处理,当资源不够时,再将任务发给全局调度器供其他节点处理其支…...

个人介绍以及毕业去向
CSDN陪伴我从大一到大四,后面也会接着用 写一点大学四年的总结 #总结#理工科#留学 211大学 弃保出国 智能科学与技术 均分88.9 EI论文一篇 数学竞赛和数学建模均为省二 大创评为国家级 全国大学生计算机设计大赛国家三等奖 百度Paddle、大疆RoboMaster、Phytium Te…...

原创度检测,在线文章原创度检测
原创度检测,作为数字时代中内容创作者和学术界广泛关注的话题,正逐渐成为保障知识产权、促进创新发展的不可或缺的工具。今天,我们将深入介绍原创度检测的定义、意义、技术原理、应用领域以及未来趋势。 一、什么是原创度检测? 原…...

windows下安装git中文版客户端
下载git Windows客户端 git客户端下载地址:Git - Downloads 我这里下载的是Git-2.14.0-64-bit.exe版本 下载TortoiseGit TortoiseGit客户端下载地址:Download – TortoiseGit – Windows Shell Interface to Git TortoiseGit客户端要下载两个&#…...

短视频怎么批量添加水印logo
在现代数字化时代,视频内容已经成为我们日常生活中不可或缺的一部分。然而,当我们辛辛苦苦制作的视频在网络上分享时,常常会遇到被他人盗用或未经授权使用的情况。为了保护我们的创作成果,给视频添加水印logo成为了一种常见的手段…...

一文入门 UUID
UUID简介 UUID代表Universally Unique Identifier,译为全局一标识符。它是一种由软件构建的标准化身份验证方案,用于确保跨多个上下文中的对象都具有唯一性。UUID在各种系统之间确保了严格的唯一性,因此即使在大型分布式环境中,也…...

kafka学习笔记--broker工作流程、重要参数
本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…...

多合一iPhone 解锁工具:iMyFone LockWiper iOS
多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备,包括最新的 iOS 17 和 iPhone 1…...

在设计和考虑建造室外雨水收集池时需要注意的因素
在设计和建造室外雨水收集池时,需要考虑以下因素: 地质条件:建造雨水收集池需要考虑到地质条件,例如土壤类型、地基承载能力等。这些因素可能对水池的建造和结构产生影响。 气候条件:不同地区的降雨量、湿度、气温等…...

C_5练习题答案
一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 下列叙述中错误的是(D)。A.计算机不能直接执行用C语言编写的源程序 B.C程序经C编译程序编译后,生成扩展名为obj的文件是一个二…...

使用 Axios 进行网络请求的全面指南
使用 Axios 进行网络请求的全面指南 本文将向您介绍如何使用 Axios 进行网络请求。通过分步指南和示例代码,您将学习如何使用 Axios 库在前端应用程序中发送 GET、POST、PUT 和 DELETE 请求,并处理响应数据和错误。 准备工作 在开始之前,请…...

已解决java.lang.exceptionininitializererror异常的正确解决方法,亲测有效!!!
已解决java.lang.exceptionininitializererror异常的正确解决方法,亲测有效!!! 文章目录 报错问题解决思路解决方法交流 报错问题 java.lang.exceptionininitializererror 解决思路 java.lang.ExceptionInInitializerError 是一…...

深度学习 Day10——T10数据增强
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU(如果使用的是CPU可以忽略这步)3.导入数据4.查…...

ky10 x86 一键安装wvp gb28181 pro平台
下载代码 git clone https://gitcode.net/zengliguang/ky10_x86_wvp_record_offline_install.gitfinalshell mobaxterm 修改服务器ip 查看服务器ip ip a 在脚本文件中修改服务器ip 执行安装脚本 切换到root用户 sudo su cd ky10_x86_wvp_record_of...
FPGA时序分析与约束(0)——目录与传送门
一、简介 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭,似乎只有理解了时序约束才能算是真正入门了FPGA,对于FPGA从业者或者未来想要从事FPGA开发的工程师来说,时序约束可以说是一道躲不过去的坎,所以这个系列我们会详细介…...

Linux 驱动开发需要掌握哪些编程语言和技术?
Linux 驱动开发需要掌握哪些编程语言和技术? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&a…...