当前位置: 首页 > news >正文

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())
}

相关文章:

  • HTML5 基础总结
  • 【Deeplearning4j】小小的了解下深度学习
  • 使用OkHttp上传本地图片及参数
  • c++ map
  • Database: Text数据转化为向量. (高维往低维映射)
  • 串口通信(1)-硬件知识
  • 深度学习还可以从如下方面进行创新!!
  • SQL Server 2017数据库window server服务器改名操作
  • vue3快速上手
  • LED透镜粘接UV胶是一种特殊的UV固化胶
  • 14:00面试,14:06就出来了,问的问题有点变态。。。
  • Could not resolve all dependencies for configuration ‘:app:androidApis‘.
  • 【1day】金和OA某接口存在未授权访问漏洞
  • 【华为数据之道学习笔记】1-2华为数字化转型与数据治理
  • Red Hat Satellite - 导入订阅清单
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • DataBase in Android
  • JavaScript异步流程控制的前世今生
  • MySQL用户中的%到底包不包括localhost?
  • PHP 的 SAPI 是个什么东西
  • rc-form之最单纯情况
  • spark本地环境的搭建到运行第一个spark程序
  • springboot_database项目介绍
  • vue:响应原理
  • WePY 在小程序性能调优上做出的探究
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 分布式事物理论与实践
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 使用 Xcode 的 Target 区分开发和生产环境
  • Semaphore
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #Ubuntu(修改root信息)
  • ( 10 )MySQL中的外键
  • (2)(2.10) LTM telemetry
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C#)获取字符编码的类
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (回溯) LeetCode 131. 分割回文串
  • (三分钟)速览传统边缘检测算子
  • (算法)求1到1亿间的质数或素数
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (自用)交互协议设计——protobuf序列化
  • .bat文件调用java类的main方法
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 中viewstate的原理和使用
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET单元测试
  • @PostConstruct 注解的方法用于资源的初始化