Qt开发笔记:Qt3D三维开发笔记(一):Qt3D三维开发基础概念介绍

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140059315

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:开发技术(点击传送门)

上一篇:无
下一篇:敬请期待…


前言

  Qt3D是qt的三维,Q3D是Qt的三维图表,Qt3D是qt的自带的三维开发框架,Qt的3D开发分为opengl、Qt3D然后是第三方三维框架(OSG、vtk等等)多个技术流。
  本篇描述Qt3D的基础概念,有一个基本知识。


个人经验,仅供参考(持续更新)

  通过深入研究和实践,从中长期看采取第三方三维框架是比较好的方式,如osg,一学多用,如果用Qt就被限制住了,而且学习成本也不低,关键是不同版本更新会有些更改迭代跟Qt版本绑定。
  进一步通过深入研究发现,其本质上的模式类似于OSG的模式,也是采用结点的模式,添加组件嵌套的模式实现各种功能。

  • 采取节点模式:每一个物体、场景都是一个结点,结点套结点
  • 采取组件模式:每一个属性如材质、光照都是附加给欸结点
  • 采取摄像头模式:三维的视口,其跟osg的函数都差不多
  • 采取控制器模式:这里的控制器其实就是osg的漫游器
  • 采取输入控制模式:这部分就是类似于上面的单独控制器,既受场景漫游器的影响,又可以单独
  • 显示优化方面:qt3D需要自己控制优化处理,但是osg他本身就做了内存和探测深度的优化,其性能已经优化了一个层级。
  • 其他:Qt3D可以随Qt安装,Qt的opengl的3D开发又太过基础,只适合做小三维开发,第三方框架就涉及了编译和迁移,笔者就经常遇到被人问arm上编译通不过osg的问题。

  Qt3D就是与osg类似的一套框架,在细节处理上osg更加灵活但是相对开发过程也会难,反过来qt3D虽然稍微简单点,但是就存在限制灵活性,学习成本,只能依附与Qt。
  还有一点就是qt很多一些功能提及都是谈到其后续会逐步添加-_-!!!
  (以上,是现阶段研究的对比,会随着qt3D的研究推进,加深理解,会回到本篇及时更新两者的差异,如果不同看法,请留言,共同探讨学习进步)。


Qt3D

概述

  Qt 3D提供了一个完全可配置的渲染器,使开发人员能够快速实现他们需要的任何渲染管道。此外,Qt 3D为渲染之外的近实时模拟提供了通用框架。
  Qt 3D被清晰地分为一个核心和任何数量的方面,这些方面可以实现他们想要的任何功能。这些方面与组件和实体交互以提供一些功能。方面的例子包括物理、音频、碰撞、人工智能(AI)和路径查找。

基本三维功能

  Qt 3D是一个3D框架,可以绘制3D形状并移动它们,以及移动相机。它支持以下基本功能:
用于C++和Qt Quick应用程序的2D和3D渲染

  • 网格和几何体
  • 材质
  • 着色器
  • 阴影贴图
  • 环境闭塞
  • 高动态范围
  • 延迟渲染
  • 纹理化
  • 实例化渲染
  • 统一缓冲区对象
  • 提示

材质

  Qt 3D拥有强大且非常灵活的材质系统,可实现多个级别的定制。它适用于不同平台或OpenGL版本上的不同渲染方法,支持具有不同状态集的多个渲染过程,提供在不同级别覆盖参数的机制,并允许轻松切换着色器。所有这些都来自C++或使用QML属性绑定。
材质类型的特性可以很容易地映射到GLSL着色器程序中的统一变量,该程序本身在引用的效果特性中指定。
有关使用材质的示例,请参见以下示例:

  • Qt 3D: Simple Custom Material QML Example
  • Qt 3D: Advanced Custom Material QML Example
  • Qt 3D: PBR Materials QML Example

着色器

  Qt 3D支持所有OpenGL可编程渲染管道阶段:顶点、镶嵌控制、镶嵌评估、几何体和片段着色器。计算着色器计划在未来发布。
有关使用着色器的示例:

  • Simple Shader Example
  • Qt 3D: Shadow Map QML Example,
  • Qt 3D: Wireframe QML Example
  • Qt 3D: Wave QML Example.

阴影贴图

  OpenGL不直接支持阴影,但有无数的技术可以用来生成阴影。阴影贴图很容易用于生成好看的阴影,同时具有非常小的性能成本。
  阴影映射通常使用两次渲染来实现。在第一次渲染中,生成阴影信息。在第二个过程中,使用特定的渲染技术生成场景,同时使用第一个过程中收集的信息绘制阴影。
  阴影贴图背后的想法是,只有最靠近灯光的片段才会被照亮。其他碎片后面的碎片被遮挡,因此处于阴影中。
  因此,在第一个过程中,场景是从灯光的角度绘制的。所存储的信息只是这个光空间中最近的碎片的距离。用OpenGL的术语来说,这相当于有一个帧缓冲区对象(FBO),上面附着了一个深度纹理。事实上,离眼睛的距离就是深度的定义,OpenGL进行的默认深度测试实际上只存储最近碎片的深度。
  甚至不需要颜色纹理附件,因为不需要对碎片进行着色,只需要计算它们的深度。
  下图显示了具有自阴影平面和三叶结的场景:
  在这里插入图片描述

  下图显示了场景的夸张阴影贴图纹理:
  在这里插入图片描述

  该图像指示从灯光角度渲染场景时存储的深度。较深的颜色表示较浅的深度(即更靠近摄影机)。在该场景中,灯光放置在场景中对象上方的某个位置,相对于主摄影机位于右侧(将其与第一张屏幕截图进行比较)。这与玩具飞机比其他对象更靠近摄影机的事实相匹配。
  生成阴影贴图后,将完成第二次渲染过程。在第二个过程中,使用法线场景的摄影机进行渲染。任何效果都可以在此处使用,例如Phong着色。在片段着色器中应用阴影贴图算法是很重要的。也就是说,最靠近光线的片段被绘制为亮的,而其他片段被绘制在阴影中。
  在第一遍中生成的阴影图提供了关于碎片到光的距离的必要信息。然后,在光空间中重新映射片段就足够了,从而从光的角度计算其深度,以及其坐标在阴影贴图纹理上的位置。然后可以在给定坐标处对阴影贴图纹理进行采样,并且可以将片段的深度与采样结果进行比较。如果碎片离得更远,那么它就在阴影中;否则它被点亮。

实例化渲染

  实例化是一种让GPU绘制基础对象的多个副本(实例)的方法,每个副本都会以某种方式发生变化。通常,在位置、方向、颜色、材料属性、比例等方面。Qt 3D提供类似于Qt Quick Repeater元素的API。在这种情况下,委托是基本对象,模型提供每个实例的数据。因此,带有Mesh组件的实体最终会转换为对glDrawElements的调用,而带有实例化组件的实体则会转换为glDrawElementsInstanced的调用。
  实例化渲染计划在将来发布。

统一缓冲区对象

  统一缓冲区对象(UBO)可以绑定到OpenGL着色器程序,以使大量数据随时可用。UBO的典型用例是针对材质或照明参数集。

提示

  在这个页面上可以找到一些非常有用的3D渲染编程技巧:Qt 3D Render Pro技巧。

可配置渲染器

  为了将对C++和QML API的支持与具有完全可配置的渲染器相结合,引入了帧图的概念。虽然场景图是对渲染内容的数据驱动描述,但帧图是对如何渲染的数据驱动的描述。
  框架图使开发人员能够在简单的前向渲染器(包括z填充过程)和使用延迟渲染器(例如)之间进行选择。它还让他们可以控制何时渲染任何透明对象等等。由于这一切都是纯粹根据数据配置的,因此即使在运行时动态修改也非常容易,而无需接触任何C++代码。可以通过创建自己的实现自定义渲染算法的框架图来扩展Qt 3D。

三维扩展

  除了在屏幕上显示3D内容的要点之外,Qt 3D还具有足够的可扩展性和灵活性,可以作为与3D对象相关的以下类型的扩展的主机:

  • 物理模拟
  • 碰撞检测
  • 3D位置音频
  • 刚体、骨骼和变形目标动画
  • 路径查找和其他人工智能
  • 拣货
  • 粒子
  • 对象生成

表演

  Qt 3D被设计为性能良好,并随着可用CPU内核的数量而增加,因为现代硬件通过增加内核数量而不是基本时钟速度来提高性能。使用多个核心效果很好,因为许多任务彼此独立。例如,路径查找模块执行的操作与渲染器执行的任务不会强烈重叠,除非可能是在渲染调试信息或统计信息时。

Qt 3D架构

  Qt3D的主要用例是近实时模拟对象,并将这些对象的状态渲染到屏幕上。Space Invaders示例包含以下对象:
  在这里插入图片描述

  • 玩家的地面大炮
  • 地面
  • 防守盖帽
  • 敌人的太空入侵者飞船
  • 敌人老板飞碟
  • 敌人和玩家射出的子弹

  在传统的C++设计中,这些类型的对象通常被实现为在某种继承树中排列的类。继承树中的各个分支可能会为根类的功能添加附加功能,例如:

  • 接受用户输入
  • 播放声音
  • 已设置动画
  • 与其他对象碰撞
  • 在屏幕上绘制
      “太空入侵者”示例中的类型可以根据这些特征进行分类。然而,为这样一个简单的例子设计一个优雅的继承树并不容易。
      这种方法和继承的其他变体存在许多问题:
  • 深入而广泛的继承层次结构很难理解、维护和扩展。
  • 继承分类法是在编译时确定的。
  • 类继承树中的每个级别只能根据单个标准或轴进行分类。
  • 随着时间的推移,共享功能往往会使类层次结构膨胀。
  • 无法预测开发人员想要做什么。
      扩展深度和广度的继承树通常需要理解并同意原作者使用的分类法。因此,Qt3D将重点放在聚合上,而不是将继承作为将功能赋予对象实例的手段。具体而言,Qt 3D实现了实体组件系统(ECS)。

使用ECS

  在ECS中,实体表示模拟对象,但其本身没有任何特定的行为或特征。通过使实体聚合一个或多个组件,可以将附加行为移植到实体上。每个组件都是对象类型行为的垂直切片。
  在“Space Invaders”示例中,地面是一个带有附加组件的实体,该组件“告诉”系统该实体需要渲染以及需要什么类型的渲染。敌方太空入侵者飞船是另一个带有附加组件的实体,这些组件可以对飞船进行渲染,但也可以使其发出声音、与之碰撞、设置动画,并由简单的人工智能控制。
  玩家的地面大炮实体与敌方太空入侵者飞船的组件大多相似,只是它没有AI组件。在它的位置上,大炮有一个输入组件,使玩家能够移动它并发射子弹。

ECS后端

  在这里插入图片描述

  Qt 3D的后端以方面的形式实现了ECS范式的系统部分。一个方面实现由实体的一个或多个聚合组件的组合提供给实体的功能的特定垂直切片。
  例如,渲染器方面查找具有网格、材质和可选变换组件的实体。如果呈现器方面找到这样一个实体,它知道如何获取这些数据并从中提取一些好的东西。如果一个实体没有这些组件,呈现器方面会忽略它。
  Qt 3D通过聚合提供附加功能的组件来构建自定义实体。Qt 3D引擎使用方面来处理和更新具有特定组件的实体。
  例如,物理方面寻找具有某种碰撞体积分量的实体,以及指定此类模拟所需的其他特性(如质量、摩擦系数等)的另一个分量。发出声音的实体具有指定其为声音发射器的组件,以及指定何时播放以及播放哪些声音。
  因为ECS使用聚合而不是继承,所以可以通过添加或删除组件来动态更改对象在运行时的行为。
  例如,为了使玩家能够在通电后突然穿过墙壁,可以暂时移除该实体的碰撞体积分量,直到通电超时。没有必要为PlayerWhoRunsThroughWalls创建一个特殊的一次性子类。

Qt 3D ECS实现

  Qt3D将ECS实现为一个简单的类层次结构。Qt 3D基类是Qt3DCore::QNode,它是QObject的一个子类。Qt3DCore::QNode为QObject添加了自动将属性更改传递到方面和在整个应用程序中唯一的ID的能力。方面存在于附加线程中,Qt3DCore::QNode简化了面向用户的对象和方面之间的数据传输。
  通常,Qt3DCore::QNode的子类提供组件引用的额外支持数据。例如,QShaderProgram类指定在呈现一组实体时要使用的GLSL代码。
  在这里插入图片描述
  Qt 3D中的组件是通过子类化Qt3DCore::QComponent并添加相应方面完成其工作所需的数据来实现的。例如,渲染器方面使用网格组件来检索应发送到OpenGL管道的逐顶点数据。
  最后,Qt3DCore::QEntity只是一个可以聚合零个或多个Qt3DCore::QComponent实例的对象。

扩展Qt 3D

  为Qt 3D添加功能,无论是作为Qt的一部分,还是特定于您自己的应用程序,以从多线程后端获益,都包括以下任务:

  • 识别并实施任何必要的组件和支持数据。
  • 向QML引擎注册组件(仅当您使用QML API时)。
  • 子类QAbstractAspect并实现子系统功能。

基于Qt三维任务的引擎

  在Qt 3D中,在每一帧中要求各方面执行一组任务以及它们之间的依赖关系。任务由调度器分布在所有配置的内核上,以提高性能。

Qt 3D的方面

  默认情况下,Qt 3D提供Qt3DRender和Qt3DInput方面。这些方面提供的组件和其他支持类在这些模块的文档中进行了讨论。
  更多功能在Qt 3D的未来版本中添加。(汗颜)


上一篇:无
下一篇:敬请期待…


本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140059315

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

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

相关文章

来自Claude官方的提示词库,支持中文!建议收藏!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

多元时间序列分析——VAR(向量自回归模型)

VAR模型主要是考察多个变量之间的动态互动关系,从而解释各种经济冲击对经济变量形成的动态影响。这种动态关系可通过格兰杰因果关系、脉冲响应以及方差分解来进一步明确和可视化。VAR模型主要研究内生变量之间的关系,内生变量就是参与模型并由模型体系内…

通天星CMSV6车载监控平台CompanyList信息泄露漏洞

1 漏洞描述 通天星CMSV6车载视频监控平台是东莞市通天星软件科技有限公司研发的监控平台,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。通天星科技应用于公交车车载、校车车载、大巴车车载、物流车载、油品运输车载、警车车…

推荐一款程序员的搞钱神器

你是不是经常为开发环境的搭建而头疼?有没有遇到过因为接口开发而焦头烂额的情况?作为一名程序员,特别是独立开发者,这些问题是不是常常让你觉得心力交瘁?别担心,现在有一个神器,能让你摆脱这些…

2024HVV最新POC/EXP,目前有8000+个POC/EXP

点击"仙网攻城狮”关注我们哦~ 不当想研发的渗透人不是好运维 让我们每天进步一点点 简介 都是网上收集的POC和EXP,最新收集时间是2024年五月,需要的自取。 表里没有的可以翻翻之前的文章,资源比较零散没有整合起来。 文件链接&#xff…

阿里云智能编程助手的安装使用

https://help.aliyun.com/document_detail/2590613.html 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&a…

洞察数据资产的奥秘:深入剖析数据资产在企业运营中的核心作用,提出一套全面、系统的数据资产解决方案,帮助企业实现数据资产的最大化利用和增值

一、引言 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。数据资产不仅记录了企业的历史运营轨迹,更蕴含着指导未来决策的智慧。然而,如何有效管理、利用这些数据资产,使其转化为企业的竞争优势和利润增长点&#xff0…

python--基础篇--正则表达式--py脚本--题目解答

文章目录 验证输入用户名和QQ号是否有效并给出对应的提示信息从一段文字中提取出国内手机号码替换字符串中的不良内容拆分长字符串 验证输入用户名和QQ号是否有效并给出对应的提示信息 """ 验证输入用户名和QQ号是否有效并给出对应的提示信息要求:用…

扎克伯格抨击闭源人工智能竞争对手试图“创造上帝”

Meta 首席执行官马克-扎克伯格(Mark Zuckerberg)在周四发表的一篇访谈中谈到了他对人工智能未来的看法,他深信"不会只有一种人工智能"。扎克伯格强调了开源的价值,即把人工智能工具交到许多人手中,他还不忘贬…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天,抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力,还能有效提升品牌的知名度和用户黏性。然而,想要充分利用这一营销工具,关键在于如何高效地追踪广告数…

springboot中使用springboot cache

前言&#xff1a;SpringBoot中使用Cache缓存可以提高对缓存的开发效率 此图片是SpringBootCache常用注解 Springboot Cache中常用注解 第一步&#xff1a;引入依赖 <!--缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId…

STM32第十一课:ADC采集光照

文章目录 需求一、ADC概要二、实现流程1.开时钟&#xff0c;分频&#xff0c;配IO2.配置ADC工作模式3.配置通道4.复位校准5.数值的获取 三、需求的实现总结 需求 通过ADC转换实现光照亮度的数字化测量&#xff0c;最后将实时测量的结果打印在串口上。 一、ADC概要 ADC全称是A…

手机数据恢复篇:如何在Android手机上查找和恢复已删除的文件

移动设备中的回收站已成为 Android 用户的一项基本功能&#xff0c;它提供了防止意外删除的安全网。与计算机一样&#xff0c;移动回收站会临时存储已删除的文件&#xff0c;允许用户在需要时检索它们。此功能在当今的数字时代特别有用&#xff0c;因为只需轻轻一按&#xff0c…

SEO与AI的结合:如何用ChatGPT生成符合搜索引擎优化的内容

在当今数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已成为每个网站和内容创作者都必须掌握的一项技能。SEO的主要目标是通过优化内容&#xff0c;使其在搜索引擎结果页面&#xff08;SERP&#xff09;中排名更高&#xff0c;从而吸引更多的流量。然而&#xf…

硬件实用技巧:刚挠板pcb是什么

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140060334 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

elasticsearch导出和导入数据

这里我使用的是离线操作的方式&#xff0c; 前提&#xff1a;安装了node, 安装elasticdump命令&#xff1a; npm install elasticdump -g 安装成功后进入elasticdump所在的目录&#xff1a; cd /usr/local/nodejs/lib/node_modules/elasticdump/bin 导出目标索引的映射结构…

深入浅出:npm 常用命令详解与实践

在现代的前端开发流程中&#xff0c;npm&#xff08;Node Package Manager&#xff09;已经成为了不可或缺的一部分。它不仅帮助我们有效地管理项目中的依赖包&#xff0c;还提供了一系列强大的命令来优化开发体验。在这篇博客中&#xff0c;我们将深入探讨 npm 的常用命令&…

高频面试题基本总结回顾1(含笔试高频算法整理)

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

【FFmpeg】avformat_write_header函数

FFmpeg相关记录&#xff1a; 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用ffmpeg库进行SDL2解码后渲染 流程分析&#xff1a; 【FFmpeg】编码链路上主要函数的简单分…

GPT-4o首次引入!全新图像自动评估基准发布!

目录 01 什么是DreamBench&#xff1f; 02 与人类对齐的自动化评估 03 更全面的个性化数据集 04 实验结果 面对层出不穷的个性化图像生成技术&#xff0c;一个新问题摆在眼前&#xff1a;缺乏统一标准来衡量这些生成的图片是否符合人们的喜好。 对此&#xff0c;来自清华大…