Qt OpenGL初探 - 画坐标轴

Qt OpenGL初探 - 画坐标轴

  • 引言
  • 一、过程详解
    • 1.1 项目创建
    • 1.2 实现细节
  • 二、核心代码
  • 三、官方文档
    • 3.1 官网地址
    • 3.2 官方手册的使用

引言

在这里插入图片描述
Qt OpenGL模块可以很方便地将OpenGL应用在Qt程序中,本文使用其画了一个3D坐标轴(见上图),并详细讲解了具体的编码过程与官方手册的使用。

OpenGL是业界采用最广泛的二维和三维图形API。它独立于窗口系统和操作系统,并且网络透明。OpenGL使软件开发人员能够在CAD、内容创建、能源、娱乐、游戏开发、制造、医疗和虚拟现实等市场中创建高性能、视觉吸引力强的图形软件应用程序。但是OpenGL只处理3D渲染,对于GUI编程并不友好。OpenGL应用程序的用户界面必须使用另一个工具包创建,比如MFC或Qt

一、过程详解

1.1 项目创建

    1. 创建一个MainWindow项目,便于后续显示,在pro文件需添加以下内容:
      QT += opengl
      win32:LIBS += -lOpengl32 -lglu32
      unix:LIBS += -lglut -lGLU
    1. 创建QopenGLDemo 类,继承QOpenGLWidget
      class QopenGLDemo : public QOpenGLWidget
    1. 在MainWindow构造函数中添加如下代码,将创建的3D窗口添加到主窗口中,用于显示
      QopenGLDemo *m_gl = new QopenGLDemo(this);
      this->setCentralWidget(m_gl);
    1. 在QopenGLDemo.cpp中实现三个虚函数即可显示,initializeGLresizeGLpaintGL,后续有三个函数的完整代码

1.2 实现细节

核心为paintGL函数的实现

    1. 先画三条直线
      在这里插入图片描述
    // 初始化glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存glLoadIdentity();  // 重置glTranslatef(0, 0, -30);    // 调整绘图坐标// 坐标轴float axis_length = 10;glLineWidth(5);glBegin(GL_LINE_STRIP);glColor3f(1, 0, 0);glVertex3f(0, 0, 0);glVertex3f(axis_length, 0, 0);glEnd();glFlush();glBegin(GL_LINE_STRIP);glColor3f(0, 1, 0);glVertex3f(0, 0, 0);glVertex3f(0, axis_length, 0);glEnd();glFlush();glBegin(GL_LINE_STRIP);glColor3f(0, 0, 1);glVertex3f(0, 0, 0);glVertex3f(0, 0, axis_length);glEnd();glFlush();

glTranslatef(0, 0, -30);一定要有,根据投影矩阵:绘制的图形的Z轴坐标 >=0的话屏幕就不会显示。上图由于角度问题,并没有显示z轴…

    1. 调整角度,让其显示z轴
      在这里插入图片描述
	glTranslatef(0, 0, -30);    // 调整绘图坐标glRotatef(45.0, 0, -1, 0);  // 绕y轴旋转45度glRotatef(45.0, 1, 0, -1);  // 绕向量(1,0,-1) 旋转45度

增加两行旋转代码,感觉有那么点立体的意思了

    1. 画坐标轴的箭头
      在这里插入图片描述
    // 坐标轴箭头  参考官方文档: https://registry.khronos.org/OpenGL-Refpages/gl4/GLUquadricObj *objCylinder = gluNewQuadric();glPushMatrix();glColor3f(0, 0, 1);glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();glPushMatrix();glColor3f(1, 0, 0);glRotatef(90, 0, 1, 0);      // 沿着y轴转90度 使得x轴对着原z轴方向glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();glPushMatrix();glColor3f(0, 1, 0);glRotatef(-90, 1, 0, 0.0);   // 沿着x轴转90度 使得y轴对着原z轴方向glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();

由于gluCylinder这个函数只能在原点处冲着z轴正向画圆柱(锥),想要在x轴和y轴上画,需要先将这两个轴旋转到z轴位置,并且进行平移。其中glPushMatrix即保存现场,直接glPopMatrix就会使得原点回到旋转和平移之前的位置。

    1. 最后增加一个原点
    // 画原点 - 白色glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(1, 1, 1);glVertex3f(0, 0, 0);glEnd();glFlush();

二、核心代码

void QopenGLDemo::initializeGL(){glClearColor(0.0f, 0.0f, 0.0f, 1.0f);  // rgbaglShadeModel(GL_SMOOTH);               // 平滑着色  GL_FLAT 单调着色
}
void QopenGLDemo::resizeGL(int w, int h){glViewport(0, 0, w, h);           //重置当前的视口// glMatrixMode() 用以指定当前要操作的矩阵  GL_MODELVIEW(模型视图,默认值),GL_PROJECTION(投影),GL_TEXTURE(纹理),GL_COLOR(颜色)glMatrixMode(GL_PROJECTION);      //选择投影矩阵glLoadIdentity();                 //重置投影矩阵 为 单位矩阵gluPerspective(60.0, double(w) / h, 0.1, 1000.0);  //建立透视投影glMatrixMode(GL_MODELVIEW);       //选择模型矩阵glLoadIdentity();                 //重置模型矩阵 为 单位矩阵}
void QopenGLDemo::paintGL(){// 初始化glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存glLoadIdentity();  // 重置glTranslatef(0, 0, -30);    // 调整绘图坐标glRotatef(45.0, 0, -1, 0);  // 绕y轴旋转45度glRotatef(45.0, 1, 0, -1);  // 绕向量(1,0,-1) 旋转45度// 坐标轴float axis_length = 10;glLineWidth(5);glBegin(GL_LINE_STRIP);glColor3f(1, 0, 0);glVertex3f(0, 0, 0);glVertex3f(axis_length, 0, 0);glEnd();glFlush();glBegin(GL_LINE_STRIP);glColor3f(0, 1, 0);glVertex3f(0, 0, 0);glVertex3f(0, axis_length, 0);glEnd();glFlush();glBegin(GL_LINE_STRIP);glColor3f(0, 0, 1);glVertex3f(0, 0, 0);glVertex3f(0, 0, axis_length);glEnd();glFlush();// 坐标轴箭头  参考官方文档: https://registry.khronos.org/OpenGL-Refpages/gl4/GLUquadricObj *objCylinder = gluNewQuadric();glPushMatrix();glColor3f(0, 0, 1);glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();glPushMatrix();glColor3f(1, 0, 0);glRotatef(90, 0, 1, 0);      // 沿着y轴转90度 使得x轴对着原z轴方向glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();glPushMatrix();glColor3f(0, 1, 0);glRotatef(-90, 1, 0, 0.0);   // 沿着x轴转90度 使得y轴对着原z轴方向glTranslatef(0, 0, axis_length);gluCylinder(objCylinder, 0.3, 0.0, 0.3, 100, 1);  // gluCylinder绘制一个沿z轴定向的圆柱体glPopMatrix();// 画原点 - 白色glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(1, 1, 1);glVertex3f(0, 0, 0);glEnd();glFlush();
}

三、官方文档

3.1 官网地址

官网:https://www.opengl.org/
官方手册(进官网点 Documentation),如下图:

在这里插入图片描述

3.2 官方手册的使用

官方手册好像是没有搜索功能的…
OpenGL 4 Reference Pages中的gluCylinder函数为例:https://registry.khronos.org/OpenGL-Refpages/gl4/

    1. 进入OpenGL 4 Reference Pages手册地址,glu开头的函数点击下图箭头处链接:
      在这里插入图片描述
    1. 继续点击下图箭头处链接,跳转到glu开头的函数:
      在这里插入图片描述
    1. 下滑找到gluCylinder函数点击即可看到其具体的参数:
      在这里插入图片描述

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

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

相关文章

Python+requests+unittest+excel搭建接口自动化测试框架

一、框架结构 工程目录【文末有配套视频和资料免费领取】 代码:基于python2编写 二、Case文件设计 三、基础包 base 3.1 封装get/post请求(runmethon.py) import requests import json class RunMethod:def post_main(self,url,data,heade…

道路拆除的题解

目录 原题描述: 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 题目大意: 主要思路: 至于dis怎么求? 代码code: 原题描述: 题目描述 …

爬虫之牛刀小试(四):爬取B站番剧的简介

今天爬取的是b站。 如何爬取b站中的番剧呢? 首先我们来到番剧索引中,随便点开一部动漫,检查代码。 每个作品对应一个链接: https://www.bilibili.com/bangumi/play/ss…(ss后面的数字称为ss号) 发现关于动漫的信息…

uniapp中uview组件库丰富的CountTo 数字滚动使用方法

目录 #平台差异说明 #基本使用 #设置滚动相关参数 #是否显示小数位 #千分位分隔符 #滚动执行的时机 #API #Props #Methods #Event 该组件一般用于需要滚动数字到某一个值的场景,目标要求是一个递增的值。 注意 如果给组件的父元素设置text-align: cente…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 2

在 Part 1 中,我们一起了解了什么是 Prometheus 和 Grafana,以及使用这些工具的前提条件和优势。在本部分,将继续带您学习如何安装 Helm 以及如何使用 Prometheus Helm Charts。 开始使用 Helm 和 Helm Chart ArtifactHub 为 Helm Chart 提供…

uniapp 开发小程序的时候使用自定义 tabbar 时出现切换页面闪烁的情况

问题:在使用自定义组件的时候可以看到页面切换明显的闪烁, 这种体验是很不好的, 当然最好的方式就是使用原生导航栏, 不要搞花里胡哨的东西。 来看下体验不好的效果 优化调整 先说思路,就是仍然设置原生 tabbar, 在应用启动的时候主动隐藏原生 tabba…

vue3hooks的使用

在 Vue 3 中,hooks 是用于封装组件逻辑的方法,类似于 Vue 2 中的 mixins。 使用 Hooks 可以提高代码的可维护性、可读性、可复用性和可测试性,降低代码之间的耦合度,使得组件的状态更加可控和可预测。 要使用 hooks,…

半小时实现GPT纯血鸿蒙版

仅需半小时,即可实现纯血鸿蒙版本的ChatGPT! 废话少说,先看效果图: 如上图所示,这个小Demo实现了AI智能问答。靠右加粗的文本是用户点击底部提交按钮后出现的;后面靠左对齐的普通文本是来自AI的回答内容。当…

Blazor中使用impress.js

impress.js是什么? 你想在浏览器中做PPT吗?比如在做某些类似于PPT自动翻页,局部放大之类,炫酷无比。 官方示例直接放到Blazor中是不可用的。几经尝试,用以下方法可以实现。 (写文不易,请点赞、…

C语言宏定义小技巧

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、定义一年多少秒(除闰年)举例运行结果出现的问题原因 二、定义整型数据要避免的坑举例运行结果原因解决方法 三 、未完待续 前言 提…

统计学-R语言-4.3

文章目录 前言直方图茎叶图箱线图练习 前言 本篇介绍的是数值型数据怎么进行数据可视化,本篇介绍的有直方图、茎叶图、箱线图。 直方图 直方图(Histogram)用于描述连续型变量的频数分布,实际应用中常用于考察变量的分布是否对称…

通过代理连接sftp

通过nginx代理连接sftp 1.问题描述2.代码实现3.nginx配置3.1 创建sftp.stream文件3.2 修改nginx配置 4.重启nginx生效 1.问题描述 问题是这样的。我们现在需要在微服务所在内网的A机器连接到外网的sftp,但是网络又不能直接到达。然后A机器到B机器是通过的&#xff…

怎么找微信服务器的IP地址

首先,让微信客户端在PC端运行,在任务管理器->详细信息中,找到WeChat.exe的进程,找到PID 就是微信进程的ID号,如下图所示: 打开一个命令行窗口,cmd或者powershell窗口都可以,输入…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器(源码),好奇下,试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格(数据来自网络,如果发现有误请联系QQ149…

Qt6安装教程

由于QT在5.14版本后不再有离线安装版本,均需要通过在线安装 1.下载exe安装包 打开Open Source Development | Open Source License | Qt,往下拉,找到红框所示的按钮 点进去后点击Download即可 2 安装 下载完成后可得到qt-unified-windows…

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

【抓包教程】BurpSuite联动雷电模拟器——安卓高版本抓包移动应用教程

前言 近期找到了最适合自己的高版本安卓版本移动应用抓HTTP协议数据包教程,解决了安卓低版本的问题,同时用最简单的办法抓到https的数据包,特此进行文字记录和视频记录。 前期准备 抓包工具:BurpSuite安卓模拟器:雷…

Docker之数据卷的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Docker之数据卷的使用》。🎯&#x…

SSM框架学习笔记04 | SpringMVC

文章目录 一、SpringMVC简介二、 请求与响应1. 请求映射路径2. get请求与post请求3. 响应 二、REST风格1.简介 三、 SSM整合四、拦截器1. 定义拦截器2.配置拦截器3.拦截器执行顺序4.拦截器参数5.多个连接器工作流程分析6.拦截器链的运行顺序 一、SpringMVC简介 SpringMVC技术与…