乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - QT(v6.3,Beta) 支持新3D粒子(3D Particles)功能
2021年4月16日,介绍一下Qt Quick 3D粒子
https://www.qt.io/blog/introducing-qt-quick-3d-particles
你可能已经看到或听说,Qt Quick 3D在Qt 6.1中引入了对3D粒子的支持。与实例渲染类似,3D粒子模块也是Qt 6.1中的一个技术预览,并将在Qt 6.2中得到完全支持。在这篇博文中,我们将介绍每个开发者和设计师应该知道的关于新的3D粒子的事情,所以请继续阅读。对于像粒子这样的视觉元素,实际看看你能用它们做什么总是有好处的。下面的视频介绍了我们的Testbed应用程序的一些演示,这些演示包括在Qt 6.1的例子中。
使用方法(Usage)
如果你熟悉Qt Quick的粒子模块,你应该对3D粒子也感到满意。作为一个开始,你将在你的QML文件的开头使用 "import QtQuick3D.Particles3D",而不是 "import QtQuick.Particles"。下面是一个简单的粒子系统的QML代码,它有一个单一的逻辑粒子、一个发射器和一个影响器。
ParticleSystem3D {
SpriteParticle3D {
id: starParticle
sprite: Texture {
source: "images/star.png"
}
maxAmount: 200
color: "#ffff00"
particleScale: 20.0
fadeOutDuration: 500
billboard: true
}
ParticleEmitter3D {
particle: starParticle
velocity: VectorDirection3D {
direction: Qt.vector3d(100, 200, 0)
directionVariation: Qt.vector3d(20, 20, 20)
}
particleScaleVariation: 0.4
emitRate: 50
lifeSpan: 4000
}
Gravity3D {
magnitude: 100
}
}
当你运行上面的例子时,你会看到类似这样的东西。
或者,如果你用ModelParticle3D替换SpriteParticle3D来获得3D粒子,并添加一些颜色和旋转的变化,输出会是这样的。
因此,让我们来看看我们这个简单例子的一些方面。
-
ParticleSystem3D是粒子系统的根。它处理系统计时,并将所有其他相关元素(如粒子、发射器和影响器)分组。与Qt Quick ParticleSystem相比,ParticleSystem3D的一个显著特点是,你可以自由地对时间进行动画处理,例如,可以使粒子与其他动画同步。另一个让设计者乐此不疲的功能是,粒子系统可以用特定的种子随机化,以便在每次运行时获得相同的像素完美的粒子效果。
-
支持两种不同的逻辑粒子类型。SpriteParticle3D用于2D纹理粒子,ModelParticle3D用于3D模型粒子。模型粒子实际上使用实例渲染,允许渲染成千上万的粒子,并支持完整的快速3D材料和灯光。逻辑粒子将定义粒子的共同外观。一个重要的属性是maxAmount ,它用于分配粒子的数据。Qt Quick粒子没有这个功能,而是根据emitRate、lifeSpan和bursts自动增长数据。要求定义它允许我们优化内存的使用,并在不重新分配的情况下修改emitRate和lifeSpan。
-
ParticleEmitter3D处理粒子的实际发射。有许多属性可以定义单个粒子的外观以及它们的发射方式。许多属性都有对应的变化,用于增加粒子之间的差异。要从另一个粒子发射粒子,你可以使用TrailEmitter3D。
-
目前有4个不同的影响因子,用于控制粒子在其生命周期内的动画效果,将来可能会增加更多的影响因子。在这里,我们使用Gravity3D影响器,用一个幅度来拖动粒子。
要了解更多信息,请查看Particles3D的API文档和Testbed例子的文档。
性能说明(Performance Notes)
与所有的Qt模块一样,性能是新的3D粒子模块的关键因素之一。毕竟,我们希望粒子可以在各种硬件上使用,包括桌面、移动和嵌入式设备。这就是说,它不仅仅是在屏幕上渲染最大数量的粒子元素。对我们来说,易于使用的API、对不同使用场景的可扩展性、渲染质量、与其他UI元素的整合等也很重要。
目前,渲染在GPU上运行,而粒子系统逻辑在CPU上运行。我们正在使用一个所谓的无状态粒子系统,它也允许在GPU上移动系统逻辑,如果这看起来是有益的。初步测量表明,我们在CPU和GPU之间的平衡性相当好。我们的无状态系统也允许在未来有更好的工具集成,因为粒子可以在时间轴上被动画化(作为一个例子,见测试平台 "Qt Cube Burst")。而且正如已经提到的,模型粒子利用实例渲染来提高性能。这意味着OpenGL ES 2.0是不够的,至少需要OpenGL ES 3.0、Vulkan等现代的后端,这样我们才能使渲染具有高性能。
为了更具体地了解实际性能,下面的视频显示了在4个不同的Android设备上运行的粒子测试平台应用程序。这些设备及其芯片组和GPU可以被认为是低端/中端设备,这证实了粒子在更实惠的硬件上也能表现良好。
Qt Quick(2D)粒子怎么办?
Qt 6仍然完全支持2D Qt Quick粒子模块,所以不必担心这个问题。Laszlo Agocs已经将粒子模块移植到QRhi,因此它可以在所有Qt 6支持的渲染后端(OpenGL、Vulkan、Metal和D3D11)上运行。我自己和其他社区成员也进行了不同的清理、错误修复和优化。因此,实际上Qt 6上的Qt Quick粒子比以往任何时候都要好,只要继续使用你的2D Qt Quick粒子UI即可。
下一步是什么?
如果你正在读这篇文章,但还没有下载最新的Qt 6.1版本,请现在就下载吧。你可以运行粒子测试平台的例子,了解它目前提供的功能,并查看源代码。然后你可以自己实验一下3D粒子,用你自己的设计创造出狂野的效果。还有一个最重要的要求。请通过Jira tickets向我们提供反馈,这样我们就可以在未来的Qt版本中改进3D粒子模块以满足你的需求。谢谢!
2022年1月14日,Qt 6.3 Alpha发布
https://www.qt.io/blog/qt-6.3-alpha-released
我们今天已经发布了Qt 6.3 Alpha。
你可以在Qt 6.3.0的文档中找到Qt 6.3.0的新功能的初始列表。但请注意,该文档仍在建设中,并将在我们准备好最终发布之前进行更新。
像往常一样,你可以通过使用维护工具将Qt 6.3 Alpha添加到现有的在线安装中。或者你可以通过使用Qt在线安装器来做一个干净的安装。Qt 6.3 Alpha源码包可以从Qt账户门户和download.qt.io上下载。
请现在开始测试Qt 6.3 Alpha,并立即在Jira中报告你的所有发现。
2022年2月4日,Qt v6.3测试版发布
https://www.qt.io/blog/qt-6.3-beta-released
我们今天发布了第一个Qt 6.3测试版。在测试阶段,我们通过在线安装程序提供多个后续的测试版本。目标是根据测试阶段收到的反馈最终确定Qt 6.3,并在三月底发布Qt 6.3.0。
与Qt 6.2相比,Qt 6.3带来了多种新功能和改进,并增加了两个新模块。关于Qt 6.3版本的更多信息,请查看Qt 6.3中最重要的变化概述。我们已经在博客中介绍了Qt 6.3的一些新项目,并将在未来几周内围绕Qt 6.3在本博客中发表更多的文章。
在今天发布的第一个测试版之后,我们将使用在线安装程序推送多个新的测试版。通过这种方式,用户可以很容易地测试新功能并提供反馈。我们不打算为后续的测试版和候选版单独发表博客文章。除了二进制文件之外,每个测试版的源代码包也可以供那些喜欢自己构建的人使用。
我希望你们中的许多人能够试用Qt 6.3测试版,并提供反馈,以帮助我们确定在Qt 6.3中需要改进的地方,以便在三月底发布。对于你可能发现的任何问题,请向bugreports.qt.io提交一份详细的bug报告。在提交bug报告时,记得要提到你是在哪个测试版发现的问题,并查看已知问题的列表。我们也欢迎你加入Qt项目邮件列表和开发者论坛的讨论。
2022年2月8日,Qt 6.3中新的3D粒子功能
https://www.qt.io/blog/new-3d-particles-features-in-qt-6.3
是的,我知道,Qt 6.3还没有出来。但由于第一个测试版刚刚发布,现在是开始谈论新功能的好时机。在这篇博文中,我将列出我最喜欢的Qt Quick 3D粒子模块中的三个新功能。
自定义形状(Custom Shapes)
Quick 3D粒子模块中的形状定义了粒子发射的区域或粒子被吸引的区域。定义形状的最常见方法是使用ParticleShape3D并选择形状类型(Cube、Sphere、Cylinder)。另外,如果你想从一个现有的三维模型中发射粒子,还有ParticleModelShape3D专门用于此。这些选项通常是足够的,但它们并没有涵盖所有的需求,所以在Qt 6.3中,我们添加了一个新的ParticleCustomShape3D元素。这个元素允许以简单的CBOR格式定义形状的精确粒子位置。
[
"QQ3D_SHAPE", // string
version, // integer
[
posX, // float
posY, // float
posZ, // float
posX, // float
...
]
]
下面是一个使用自定义形状的应用实例。
为了创建这些形状文件,我们提供了一个简单的命令行工具,叫做shapegen,它接收图像和深度,并在其中创建定义数量的位置。下面是shapegen工具的帮助。
C:\qt6_3-install\bin
λ shapegen.exe --help
Usage: shapegen.exe [options]
Tool to generate Qt Quick 3D Particles Custom Shapes
Options:
-?, -h, --help Displays help on commandline options.
--help-all Displays help including Qt specific
options.
-i, --image Input image for the data.
-o, --output Output CBOR file for the shape data.
-d, --depth Depth (z scale) for the data.
-s, --scale Scale used for the image data. Default
1.0
-a, --amount Amount of position data to generate.
-p, --sorting-position Position to use for sorting. Format "x,
y, z"
-l, --list-cbor Lists CBOR file content.
这个工具仍然相当简单,但CBOR格式也是如此,所以你也可以看看私有的形状帮助类,以任何可以想象的方式生成你自己的自定义形状。
灯光支持(Lights Support)
为了在Quick 3D场景中发射2D纹理粒子,你可以使用SpriteParticle3D元素。在Qt 6.3中,我们为这些精灵粒子添加了灯光支持,定义了粒子应该受到哪些灯光的影响。
SpotLight {
id: lightSpot
...
}
PointLight {
id: lightPoint
...
}
SpriteParticle3D {
id: spriteParticle
sprite: Texture {
source: "images/sphere.png"
}
lights: [lightSpot, lightPoint]
...
}
所有的Quick3D灯光类型都被支持。对于粒子,应用的光量是按粒子计算的,而不是像Quick 3D模型那样按像素分辨率计算。之所以做出这个决定,是因为粒子通常比较小,而且通过在顶点着色器方面计算光照来获得出色的性能。
下面是一个演示粒子与不同灯光的应用实例。
你可以利用这种照明支持来使粒子与3D场景的其他部分更好地融合。如前所述,灯光的实现是相当有效的,所以你也可以在嵌入式硬件上使用它们。
动态突发(Dynamic Bursts)
为了以突发方式发射粒子,Quick 3D支持几个burst()方法和声明性的EmitBurst3D元素。后者是在粒子系统启动时进行评估的(所以产生了爆裂粒子)。这对性能来说是最理想的,因为它意味着在系统运行时不需要生成突发粒子,但它不适合发射器移动、旋转等情况,因为突发粒子将在初始发射器阶段创建。出于这个原因,我们在Qt 6.3中增加了一个新的DynamicBurst3D元素。它的使用与EmitBurst3D类似。
ParticleEmitter3D {
...
emitBursts: [
DynamicBurst3D {
time: 1000
amount: 100
},
DynamicBurst3D {
time: 2000
amount: 200
}
]
}
DynamicBurst3D元素在系统运行时被评估,也就是说,上面的例子在1s时发射100个粒子,在2s时发射200个粒子,发射器的属性在这些确切的时间内。DynamicBurst3D与TrailEmitter3D相结合,还可以在后续粒子开始或结束时触发爆裂。
下面是一个演示动态爆裂与跟踪发射器的应用实例。
博客中展示的所有例子都可以在Qt 6.3中使用,而且Qt 6.3中还有很多其他的新东西和修正。因此,请下载最新的6.3版本,并自己尝试一下。
Qt 6.3的新内容
https://doc-snapshots.qt.io/qt6-6.3/whatsnew63.html
Qt 6.3中新增和恢复的模块
Qt 6.3 增加了以下模块。
Qt语言服务器:实现了语言服务器协议规范(Language Server Protocol Specification)和JsonRpc 2.0协议。该模块不包含公共API。
Qt 6.3重新引入了以下在Qt 6.2中不存在的模块。所有列出的模块都被移植到Qt 6和CMake构建系统中。
Qt PDF(在技术预览中)
每个模块更详细的变化列表可以在Qt 6中的Qt模块变化中找到。
技术预览平台
1. WebAssembly
Qt for WebAssembly已经做了一些改进。详见Qt for WebAssembly的平台文档。
- 增加了对图像和html文本的复制/粘贴到系统剪贴板的支持。
- 增加了SIMD支持。注意,启用SIMD需要从源代码构建Qt。
- 增加了对在二级线程上调用QEventLoop::exec()和QThread::exec()的支持。
- 增加了对使用Emscripten Asyncify在主线程上调用QEventLoop::exec()和QDialog::exec()的支持。注意,启用asyncify需要从源代码构建Qt。
- 拖放功能现在可以在启用asyncify的构建中使用。
- 使用Emscriptens Emulated POSIX TCP Sockets over WebSockets,增加了对TCP和UDP套接字隧道的支持。该支持仅限于主线程上的异步套接字。
2. ARM上的Windows(Windows on ARM)
由于Qt的优化构建问题尚未解决,ARM64上的Windows仍处于技术预览阶段。
移动平台
1. 安卓(Android)
- 应用内购买演示和Qt 3D: Planets QML 示例有了安卓特有的改进。
- 将Gradle更新到了7.2.0,将Android Gradle 插件 (AGP) 更新到了 7.0.2(需要 JDK 11 或以上)。
- 为CMake Android项目添加了缺失的_make_aab 目标。
- 为CMake添加了多ABI构建,见QT_ANDROID_ABIS。
- QML模块现在被放置在用户的构建文件夹下一个名为 "android-qml" 的公共目录中。这可以作为androiddeployqt工具的一个通用导入路径。
- QML测试平台现在可以为Android构建工作。
参考
- Qt 6.3 Alpha released
- Qt 6.3 Beta Released
- New 3D particles features in Qt 6.3
- Introducing Qt Quick 3D Particles
- What's New in Qt 6.3