Neptune 3 UI - 3D集成

在Neptune 3 UI中,有两个包含3D元素的app

  • "com.theqtcompany.cluster" - 仪表盘应用,管理仪表和指示器;此应用可以显示平面或3D仪表。3D仪表实体是通过Qt 3D Studio创建的,它提供了一个场景创建的合成工具。Qt 3D Studio运行时提供了QML API来将场景集成到Qt应用程序中。
  • "com.luxoft.vehicle" - 一个内置应用,包含两个不同的3D子部分。这两个部分都实现了相似的3D实体:车辆。第一部分包含由Qt 3D渲染的3D场景。Qt 3D为近实时模拟系统提供功能,支持Qt C++和Qt Quick应用程序的2D和3D渲染。第二部分基于Qt 3D Studio

这些app支持一个流行的用例:使用3D可视化来改善用户在与与物理对象相关的功能交互时的体验。每个应用都以不同的方式使用Qt中的3D

  • 一个是通过直接使用Qt 3D,这需要额外的代码来正确构造整个渲染管线。
  • 另一个是使用Qt 3D Studio的运行时,这极大地简化了app的代码,但也限制3D功能仅限于Qt 3D Studio支持的功能。

下文部分突出了与上述应用程序相关的3D支持在Qt中的一些主题。

3D建模

通常,一个3D框架提供绘制3D形状、移动它们以及移动相机的方法。这是一个基本情况;通常还包括额外的功能

  • 网格:一系列顶点和边,通常是三角形化的;描述物体在3D空间中的形状。
  • 材质:一组系数,定义了应该如何应用光照到模型以及它与表面如何交互。
  • 着色器:一个可编程的着色器,用于应用不同级别的黑暗,以产生图像中适当的颜色级别,产生特殊效果或后期处理视频。
  • 纹理:通常用于图像来装饰3D模型,但它也可以用于存储多种不同的数据。
  • 相机:显示当前场景,从当前激活的相机的视点看到。要投影场景的屏幕,我们需要将3D坐标转换为2D坐标。然后,为了指定投影,3D场景中的点在虚拟屏幕空间中使用。然而,投影的参数并不是直接输入的;而是配置和放置了一个虚拟相机。
  • 动画:通过改变物体的位置来阐述物体的运动。

Qt 3D

Qt 3D 提供了现代3D渲染的相关功能,它依托OpenGL在Qt支持的所有平台上的性能。Qt 3D不仅允许开发者可视化3D内容,还允许通过内置的材质或提供自定义的OpenGL着色语言(GLSL)着色器自由地自定义和控制每个对象的的外观。这些控件也可以通过QML来访问,以扩展创建3D用户界面的能力。此外,QML的Scene3D组件使得将2D和3D内容集成成为可能。

Qt 3D是一个实体组件系统(ECS),这是在游戏开发中广泛使用的一种架构模式。基于ECS模式的应用程序包括:

  • 实体:一个容器,可以添加任何组件,通常是层级化的。实体代表着具有组件的对象,但本身并没有任何特定的行为或特征。实体还可以有子实体。
  • 组件:一组可以通过它们向实体添加行为和数据。每个组件都是对象类型行为的一个垂直切片。

附加了组件的实体告诉系统需要渲染以及如何进行渲染。每个实体的组件可以包括材质、网格或变换。这些组件应作为特定实体的部分进行定义,并为每个组件分配一个标识。一个材质组件可以包含包含渲染技术的效果。反过来,在渲染技术内部,可以指定着色器程序。这些着色器程序可以是外部着色器文件或直接在QML中编写。3D模型可能包含纹理,3D模型和纹理之间的连接可以通过着色器绑定,包括具有此材质效果的材质组件和网格组件相同的实体。有关ECS的更多信息,请参阅Qt 3D概述

Qt 3D Studio与3D仪表集成

以前,仪表组中的应用程序中使用2D图形资产来实现仪表。从版本5.13开始,仪表组应用程序可以使用Qt 3D Studio运行时来显示3D仪表,并且还包括使用Qt 3D Studio创建的新仪表。旧的实施方式仍然得到支持,并且在运行时可以通过 Companion App启用。下面的图显示了仪表组的结构图;颜色元素演示了集成的主要点

所有3D实体(用红色显示)都由设计师提供,或使用任何3D编辑器(如Blender)创建;其中一些实体是来自Qt 3D Studio示例的重用。绿色显示的Qt 3D Studio项目是用Qt 3D Studio工具维护的。该项目作为一个资产存储,像图片一样。整个3D场景通过一个展示 .uip文件导入到一个.qml文件中;展示是Qt 3D Studio项目的一部分,描述了场景中的层结构。所有的变换,如旋转、移动和缩放等,都是通过数据输入实现的。有关更多详细信息,请参阅Qt 3D Studio

注意:您必须安装Qt 3D Studio,并且您的Qt安装必须支持OpenGL ES。有关更多详细信息,请参阅使用Qt 3D Studio运行时

使用Qt 3D进行3D车辆模型集成

下面的图显示了使用Qt 3D构建的车辆应用程序子部分当前的结构

车辆的每一部分都有自己的实体,包含所有必要的组件,如网格、变换和材质。这些实体定制为整个3D场景的根实体。

Neptune 3 UI 拥有自带的定制基于物理的材质,采用 Cook-Torrance GGX 分布,因为 Qt 3D 不提供针对 OpenGL ES 2.0 的材质。这个材质是必需的,因为应用使用了基于微面理论的光照,这为汽车增添了更真实的光照效果。汽车模型大多采用单色涂装,以简化光照计算。此外,大多数模型现在都是基于物理渲染(PBR)材质来建模的,这使得模型导入更加容易。

车辆应用中的动画主要包含矩阵变换。例如,车门动画是这样实现的:将车门移动到另一个原点,旋转它,然后将其转换回来。因此,车门不是绕其自身的轴旋转。

Qt 3D Studio 中的 3D 模型集成了 Vehicle 3D 模型

由 Qt 3D Studio 构建的另一个子部分的集成方案与3D 表盘与 Qt 3D Studio 集成相似。下面的图解进一步说明了这一点

修改设置使用车辆应用的 3D

车辆应用有一个设置部分,您可以在此更改使用的模型复杂度并切换基于 Qt 3DQt 3D Studio 的实现。

使用 Qt 3D Studio 运行时

基于 Qt 3D Studio 运行时的实现需要在桌面或嵌入式目标上安装。如果已安装,但您的 3D 内容在 Neptune 3 UI 中未显示,这意味着您在构建 Qt 时没有为 Linux 和 macOS 使用 -opengl es2 选项。在这种情况下,Neptune 3 UI 只在这些平台上以单进程模式显示 3D 内容,前提是在 .yaml 配置文件中设置了 OpenGL ES 3.0 的要求。有关详细信息,请参阅Qt 应用程序管理器

如果您通过在线安装程序安装了 Qt Automotive Suite,则您的安装可能不包含 Qt 3D Studio。在这种情况下,为了确保一切正常运转,请从源代码构建和安装所需组件。

要构建使用 Qt 3D Studio 运行时的自定义 Neptune 3 UI,请执行以下操作

注意:由于与配置 Qt 5.13.0 和 -opengl es2" 相关的问题,目前无法在 macOS Mojave 上使用 Qt 3D Studio 运行时配合 Neptune 3 UI。

©2019 Luxoft Sweden AB. 本文档中的文档贡献是各自所有者的版权。
提供的文档在 Free Software Foundation 发布的 GNU 自由文档许可证版本 1.3 条件下进行许可。
Qt 和相应的标志是芬兰 Qt 公司和/或全球其他国家的商标。所有其他商标均为其各自所有者的财产。