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在各种系统之间确保了严格的唯一性,因此即使在大型分布式环境中,也…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
