在Qt中使用OpenGL(六)

Qt+OpenGL基础教程 基于Qt与OpenGL的UR3机械臂仿真与控制程序的先行文,介绍了如何画出一个可以变换视角的坐标系。 阅读详情

前言

在Qt中使用OpenGL(一)
在Qt中使用OpenGL(二)
在Qt中使用OpenGL(三)
在Qt中使用OpenGL(四)
在Qt中使用OpenGL(五)
在前面的文章中,我们终于实现了自由查看3D世界的功能,现在无论我们之后要创建什么样的3D世界,我们都有能力自由的在其中探索了。
那么,接下来就是需要大家努力思考的问题了:我们要如何构建一个3D世界?
难不成,我们需要手动的为所有我们想要画出来的东西,编写顶点信息和纹理坐标?哪怕我们要画出来1000头牛也要手动进行?
很显然这是不可能的。

模型的基类

一般情况下,构建一个3D世界我们会使用模型这个概念。
一个模型我们就可以理解为一个物体。
比如,一个茶壶,一个人,一个桌子,一张凳子,它们都可以是一个模型。
那么,我们只要指定这些模型的位置和旋转角度,乃至大小,是不是一个简单的3D世界我们就构建出来了?
那么,根据我们之前对于OpenGL的了解,想要画出一个东西出来,我们至少需要两个东西:顶点和纹理。
其中,顶点应该包含位置坐标和纹理坐标,而纹理则是一张图,不,是至少一张图。
之前我们也说过,在OpenGL的世界中,纹理坐标是基于当前激活的纹理来计算的。这也就意味着,我们只需要在绘制前激活不同的纹理,我们就可以在绘制的时候使用不同的纹理来绘制我们的模型。
简单来说,就是茶壶和桌子可以使用不同的纹理。
我们只需要在绘制茶壶的时候激活茶壶纹理,绘制桌子的时候激活桌子纹理就行了。乃至我们可以在绘制茶壶嘴的时候激活一张贴图,绘制茶壶盖的时候激活另一张贴图都是没什么问题的。
好了,那么让我们来总结一下,一个模型中至少应该有哪些东西。

  1. 顶点信息(包括位置坐标和纹理坐标)
  2. 纹理(可以有多个纹理)
  3. 最终在3D世界中的变换(也就是Shader中需要的模型矩阵,可以用来让模型缩放,旋转,平移)

当然,实际情况的模型是会包含更多的内容的,考虑到目前有些东西我们还没有掌握,所以这里就用我们已知的知识来总结。
除了这些数据上的东西,对于要绘制一个模型,我很显然还需要VAO,VBO和Shader。并且,是每一个模型,都需要一个独立的VAO,VBO与Shader。因为我们目前就是这么做的,那么当我们需要画多个物体的时候,重复多次我们之前的行为是一个很正常的操作。
那么,此时你的脑海中是不是就出现了一个类的基本架构了呢?

struct Vertex
{
   
   
	QVector3D pos;
	QVector2D texture;
};

class Model : public QOpenGLExtraFunctions
{
   
   
public:
	Model();
	~Model();
public:
	void setScale(float val) {
   
    m_scale = val; }
	void setRotate(const QVector3D &rotate) {
   
    m_rotate = rotate; }
	void setPos(const QVector3D &pos) {
   
    m_pos = pos; }
public:
	void setVertices(const QVector<Vertex> &vertices) {
   
    m_vertices = vertices; }
	void setTexture(QOpenGLTexture *texture, int index = -1);
	void setShaderProgram(QOpenGLShaderProgram *program) {
   
    m_program = program; }
public:
	QMatrix4x4 model();
public:
	virtual void init();
	virtual void update();
	virtual void paint(const QMatrix4x4 &projection, const QMatrix4x4 &view);
protected:
	QVector3D m_pos{
   
    0,0,0 };
	QVector3D m_rotate{
   
    0,0,0 };
	float m_scale = 1;
	QVector<Vertex> m_vertices;
	QMap<int, QOpenGLTexture *> m_textures;
	QOpenGLVertexArrayObject m_vao;
	QOpenGLBuffer m_vbo;
	QOpenGLShaderProgram *m_program = nullptr;
};

我们的模型继承QOpenGLExtraFunctions是为了方便使用OpenGL的函数。
成员函数与变量都至少是protected是因为我们实际上目前无法知道一个模型绘制的细节,所以我们首先制定好一个模型的核心内容,形成一个基类,然后将实现的细节部分交给继承的类来做。
很容易理解的原因就是,我们没有办法确定,我们在初始化与绘制的时候,具体要使用什么样的Shader,怎么绑定数据,也不知道具体要怎么去绘制三角形,是画两个三角形形成一个矩形然后重复呢?还是只画一个三角形然后重复呢?
所以,我们先只顶下一个框架。
此时我们可以做的事情不多,也就是如何保存纹理以及如何生成模型矩阵。

void Model::setTexture(QOpenGLTexture *texture, int index)
{
   
   
	if (index == -1)
	{
   
   
		if (m_textures.isEmpty())
		{
   
   
			index = 0;
		}
		else
		{
   
   
			index = m_textures.keys().last() + 1;
		}
	}
	m_textures.insert(index, texture);
}

QMatrix4x4 Model::model()
{
   
   
	QMatrix4x4 _mat;
	_mat.setToIdentity();
	_mat.translate(m_pos);
	_mat.rotate(m_rotate.x(), 1, 0, 0);
	_mat.rotate(m_rotate.y(), 0, 1, 0);
	_mat.rotate(m_rotate.z()
Qt OpenGL(二十二)——Qt OpenGL 核心模式-VAO和VBO 你只需要记住现在这些步骤就行。在调用VAO的时候,使用的函数glVertexAttribPointer函数,Attrib就是属性的意思,这个函数就是指定输入数据的哪一个部分对应顶点着色器的哪一个顶点属性。所以,VBO的作用就是在CPU和GPU之间充当一个桥梁的作用,当我们把顶点数据存到VBO,VBO就会把数据自动的送到GPU,我们不需要关心他怎么送过去的,我们只要负责往VBO中送数据就行了(使用函数实现)。上面是我们需要绘制的顶点,同时也包含顶点颜色数据,也有可能会包含纹理数据,这个以后会介绍。 阅读详情

相关推荐

在QT中使用OpenGL的方法

打开QT Creator,选择"新建项目",然后选择"QT Widgets应用程序"。在"类"选项卡中,确保选择了"Main Window"类,然后点击"下一步"。本文将详细介绍在QT中使用OpenGL的方法,并提供相应的源代码示例。这里我们创建了一个名为"MainWindow"的类,继承自QOpenGLWidget。在MainWindow类中添加了一个名为"glWidget"的成员变量,用于显示OpenGL窗口。在构造函数中,我们创建了一个MainWindow类的实例,并将其设置为主窗口的中央部件。

EctProcessgroup的博客 1921

Qt5与OpenGL实现六轴机械臂三维仿真:从运动学建模到渲染交互

在工业自动化与机器人开发领域,三维可视化技术正从辅助展示演变为调试刚需。通过图形渲染管线与数学模型结合,开发者能够在虚拟环境中验证运动学算法与轨迹规划,从而降低实体调试风险。Qt5作为跨平台桌面应用框架,凭借其成熟的控件系统与QOpenGLWidget组件,为机械臂上位机软件提供了高效的集成方案。借助DH参数建模与齐次变换矩阵,六轴机械臂的正运动学计算可被精确映射至三维场景;同时,合理的相机控制、透视投影与光照设置能显著提升仿真真实感。该技术路径广泛应用于机器人示教、离线编程及自动化设备调试场景。本文基于实

weixin_42548816的博客 274

基于Qt5与OpenGL的六轴机械臂三维仿真实现

三维可视化技术是现代工业仿真与上位机开发的重要基础,而机械臂的运动模拟则依赖于严谨的运动学建模。在工程实践中,如何轻量地实现六轴机械臂的轨迹验证与交互展示,是许多开发者关注的问题。Qt5与OpenGL的组合提供了一套无需重型引擎的解决方案:OpenGL负责高效的渲染与交互,Qt5则提供成熟的界面框架与事件处理机制。通过引入DH参数模型,开发者可以建立机械臂各关节的坐标系变换关系,进而完成正运动学计算,准确控制末端执行器的位置与姿态。这种技术路线不仅降低了底层图形开发的复杂度,还便于集成到现有的上位机系统中,

weixin_29029995的博客 339

Qt5+OpenGL六轴机械臂三维仿真:从环境搭建到运动学实现

六轴机械臂三维仿真是机器人算法验证与示教界面开发中的常见需求。面对工业仿真软件笨重、跨平台集成困难的问题,基于 Qt 与 OpenGL 构建轻量级可视化框架成为可行路径。其原理是通过 Qt 负责窗口、事件与交互控件,OpenGL 负责渲染机械臂连杆模型,再结合 Denavit-Hartenberg 参数完成坐标变换与正逆运动学解算,从而实时呈现关节角变化与末端位姿。工程实践中,环境配置是关键一环,例如选用 Qt5.9.4/msvc2017_64 工具链并正确设置 CMAKE_PREFIX_PATH,可避免常

weixin_42632434的博客 297

Qt5 OpenGL六轴机械臂三维仿真:从DH参数到碰撞预警

三维仿真在机器人工程中用于验证运动学与碰撞检测,其原理基于OpenGL渲染管线和DH参数建模。通过Qt5的QOpenGLWidget和着色器,实现六轴机械臂的实时可视化与交互,技术价值在于低成本离线编程和教学演示。应用场景包括产线验证、奇异位形分析和碰撞预警。本文以Qt5和OpenGL为例,详细讲解六轴机械臂三维仿真的实现,涵盖环境搭建、运动学建模、渲染交互及避坑技巧。

weixin_29159127的博客 126

基于Qt5与OpenGL的六轴机械臂三维仿真实现与调试指南

六轴机械臂的运动控制开发中,三维可视化是验证运动学算法与调试上位机逻辑的重要环节。通过图形学渲染,将连杆坐标系、关节角变化与末端轨迹直观呈现,能显著降低开发风险。OpenGL作为跨平台图形接口,搭配Qt5的QOpenGLWidget组件,可高效构建实时仿真窗口。实现的关键在于理解嵌套坐标系的矩阵变换顺序,以及正确初始化OpenGL上下文并驱动定时刷新。这种仿真方案广泛应用于机器人算法验证、课程设计与工程预研,能有效衔接理论计算与实体调试。本文从渲染原理与工程实践出发,结合常见问题排查,系统讲解六轴机械臂三维

weixin_29168153的博客 239

4090显卡实测:PointPillars在KITTI数据集上的3D目标检测复现全流程(附避坑指南)

本文详细记录了在NVIDIA RTX 4090显卡上,从环境搭建、数据处理到模型训练与评估,完整复现PointPillars算法在KITTI数据集上进行3D目标检测的全流程。重点分享了版本配置、数据预处理、性能调优及常见问题的避坑指南,帮助开发者高效利用硬件资源,成功跑通并理解这一经典3D检测项目。

purple的博客 914

基于Openrouter的API调用免费大模型

Openrouter 是一个 AI 模型聚合平台,整合了全球 200 多种主流 AI 模型,包括 GPT-4、Claude、Gemini 等,以及国产通义千问、DeepSeek 等。其核心优势是统一的 API 设计,开发者仅需少量代码即可与多个模型交互,还支持自动路由与回退机制。用户可通过 OpenAI SDK 或 LangChain 调用 Openrouter 中的模型。

MurphyStar的博客 6206

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道

本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。

weixin_30296405的博客 87

XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD

XC95144XL-10TQG144I 属于 Xilinx 的 XC9500XL 高性能 CPLD 家族,是一颗面向 3.3V 低电压系统的可编程逻辑器件。该器件以小封装、高速响应和良好的系统兼容性为设计目标,常用作系统控制/ glue-logic、I/O 缓冲、状态机、总线桥接与接口协议前端等场景中的可重编程逻辑单元。产品支持现场(in-system)编程与 IEEE-1149.1 JTAG 边界扫描,能在系统板上直接更新逻辑。

2403_90082736的博客 1060

编译原理实验二:LL(1)分析法(附C/C++完整代码)

本文讲述了LL(1)文法的原理及如何用C语言实现。并在给出的代码中实现了消除文法的左递归,First集,Follow集,select集的输出,构造预测分析表并输出,和对任意输入字符串的分析。程序总流程为:从文件读取文法 -> 输出文法信息 -> 消除左递归并输出消除后的文法 -> 计算First集并输出 -> 计算Follow集并输出 ->计算select集并输出 -> 判断是否是LL(1)文法 -> 构造预测分析表并输出 ->手动输入要分析的字符串 -> 输出分析过程和结果读取文件。

W_Wmwmwm的博客 6193

Simulink单相桥式有源逆变电路仿真:从器件选型到波形分析(MATLAB 2018a实战)

本文基于MATLAB 2018a的Simulink平台,详细演示了单相桥式有源逆变电路的完整仿真流程。从Simscape/Power Systems库的器件选型、参数配置,到触发脉冲设置与电路连接,逐步指导搭建仿真模型。通过调整触发角α,直观展示了电路从整流到有源逆变的工作状态切换,并深入分析了负载电压、电流波形,以及逆变颠覆现象的产生条件与特征。

cake8的博客 1160

Windows沙盒神器Sandboxie Plus保姆级教程:从安装到实战测试可疑软件

本文详细介绍了Windows沙盒神器Sandboxie Plus的安装、配置与实战应用,帮助用户安全测试可疑软件。从系统要求、安装步骤到核心功能如多沙盒管理、文件共享和快照恢复,全面解析了这款轻量级沙盒工具的优势与使用技巧,特别适合需要隔离运行未知程序的用户。

weixin_29323049的博客 1157

基于 Simulink 的 PV 光伏阵列功率发电系统仿真 Matlab

其中直流侧电压需要与光伏电池组件匹配,交流侧电压则需要与配电系统匹配,开关频率一般在几千赫兹左右,需要保证在一定范围内。根据实际需求,我们还可以通过增加负载,以及调节光照强度等方式,模拟不同的情况下系统的响应和性能表现。经过设置参数和各部分之间的传递和控制后,我们可以开始进行模型仿真。在仿真前,我们需要确定仿真时间和步长,并对整体模型进行编译。在建立完毕整体模型框架后,我们需要为每个组件设置参数,并进行传递和控制。首先,我们需要建立一个整体的模型框架,包括各个组件之间的关系和控制器的作用。

学习使你进步。 1129

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 在Qt中使用OpenGL(五)
下一篇: 在Qt中使用OpenGL(七)
Ninsun Closear
博客等级 码龄12年 321粉丝 22原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值