Qt 3D Animation C++ Classes
Qt 3D 动画模块提供了一组预构建的元素,可帮助您快速入门Qt 3D 。更多内容...
自 6.8 版本起,该模块已被废弃。我们强烈建议您不要在新代码中使用它。
命名空间
类
Qt3D 动画的抽象基类 | |
为提供关键帧动画数据的类型提供的基类 | |
为提供动画播放功能的类型提供的基类 | |
用于构建动画混合树的类型的基类 | |
根据加法因子对两个动画片段执行加法混合 | |
为以下对象提供关键帧动画功能Qt 3D | |
表示一个动画回调对象 | |
指定关键帧动画数据 | |
包含动画数据的类 | |
支持从文件加载关键帧动画数据 | |
用于动画的控制器类 | |
将动画分组在一起的类 | |
提供混合节点树动画播放功能的组件 | |
允许将片段中的通道映射到回调对象的调用上 | |
定义了 QAnimationClipData 的一个通道。动画系统会独立对每个通道组件进行插值,除非该 QChannel 名为“Rotation”(区分大小写),此时它包含四个 QChannelComponent,且每个 QChannelComponent 都有相同数量的关键帧。 在这种情况下,将使用 SLERP 进行插值 | |
允许将剪辑中的通道映射到应用程序中对象的属性上 | |
允许将剪辑中的通道映射到应用程序中对象的属性上 | |
提供简单动画播放功能的组件 | |
用于将剪辑包含在混合树中的类 | |
用于处理关键帧的基类 | |
一个为 QTransform 实现简单关键帧动画的类 | |
根据归一化因子对两个动画片段执行线性插值 | |
为混合形状动画提供形态目标的类 | |
实现混合形状变形动画的类 | |
一个实现顶点混合变形动画的类 |
详细说明
该模块仍处于开发阶段,但已作为技术预览版提供。这意味着它尚不稳定,可能会发生变更,且仅作为便利功能提供。
#include <Qt3DAnimation>要链接相应的 C++ 库,请在您的 qmake 项目文件中添加以下内容:
QT += 3danimation类、类型和函数均声明在Qt3DAnimation 命名空间下。
概述
Qt 3D 动画模块新增了对指定和使用动画的支持,这些动画可应用于模拟中对象的属性。目前该模块支持基于关键帧的动画。也就是说,属性在特定时间点被“关键帧化”,回放时,属性值通过在关键帧内的已知值之间进行插值来计算。Qt 3D 动画模块中的所有动画评估都在Qt 3D 线程池中进行。这使得动画能够流畅运行,并可扩展以实现高吞吐量。
动画数据
关键帧动画数据既可以通过Qt 3D 动画API(如Qt3DAnimation::QKeyFrameData)以编程方式创建,也可以来自Blender、Maya或3D Studio Max等数字内容创作(DCC)工具。Qt 3D 为Blender提供了动画数据导出示例脚本。 目前,Qt 3D 动画支持的格式是一种基于JSON的简单格式。这使得开发人员和美术人员都能轻松处理动画数据。后续将添加更多针对运行时处理进行优化的格式。
可以使用Qt3DAnimation::QAnimationClipLoader 类从文件中加载关键帧动画数据。若要通过编程方式指定动画数据,请使用Qt3DAnimation::QAnimationClip 类。
默认情况下,关键帧数据采用三次贝塞尔曲线定义。这使得仅凭少量关键帧数据点即可生成平滑的动画。其他插值类型将在后续版本中添加。
播放动画
除了包含关键帧的动画数据外,Qt 3D Animation 还提供了用于播放动画并将生成的属性值映射到模拟中对象属性的 API。目前有两种播放动画的方式:
这两种方式均作为Qt3DCore::QComponent 的子类实现,这意味着Qt3DCore::QEntity 对象可以聚合这些类型的对象,从而为模拟实体添加动画功能。
简单的动画播放
Qt3DAnimation::QClipAnimator 类允许每次播放一个Qt3DAnimation::QAbstractAnimationClip 。要向实体添加动画,只需将Qt3DAnimation::QClipAnimator 类的实例添加到实体的components 属性中即可。
Qt 3D 动画模块在处理QPropertyAnimation 和AbstractAnimation 时采用了略有不同的方法。在那些动画框架中,动画同时指定了动画值以及目标对象和属性。而Qt 3D 中的动画组件将这两个正交的概念分开了。例如,Qt3DAnimation::QClipAnimator 组件有一个clip 属性,用于指定动画数据(Qt3DAnimation::QAnimationClip 或Qt3DAnimation::QAnimationClipLoader )。
这使得动画值的计算成为可能,但要将这些值映射到对象的属性上,还需要更多信息。这通过Qt3DAnimation::QChannelMapper 实现,其中包含一个Qt3DAnimation::QChannelMapping 对象列表。 通过使用Qt3DAnimation::QChannelMapping ,可以将动画片段中的特定通道映射到目标对象的命名属性上。通过这种方式将动画数据与属性映射分离,同一动画可以应用于多个对象,而无需创建动画数据或对象的多份副本。此外,这还使得动画数据能够轻松地重新定位到其他对象上。
混合动画播放
Qt3DAnimation::QBlendedClipAnimator 组件通过在将属性更改应用到目标属性之前,将多个动画片段混合在一起,从而超越了Qt3DAnimation::QClipAnimator 所能实现的功能。该动画组件与标准的Qt3DAnimation::QClipAnimator 组件一样,仍需要一个通道映射器。但是,它不需要指定单个动画片段,而是需要将blendTree 属性设置为指向混合树的根节点。
混合树是一种数据结构,它表示动画片段如何根据混合树节点上的属性进行聚合或混合。当前支持的混合树节点集包括:
源动画片段输入通过Qt3DAnimation::QClipBlendValue 类的实例,作为混合树中的叶节点进行指定。这些动画片段可以通过多种方式进行组合。 目前,Qt3D 动画模块提供了线性插值(LERP)和加法混合操作。未来将逐步添加更多混合节点类型,预计至少会包括一个通用 LERP 节点和一个质心 LERP 节点。
以以下混合树为例:
Clip0----
|
Lerp Node----
| |
Clip1---- Additive Node
|
Clip2----假设Clip0 表示一个时长为3秒的行走动画循环,而Clip1 表示一个时长为2秒的奔跑动画循环。它们都是Lerp 混合节点的输入(也是其依赖项)。Lerp 节点的计算结果取决于Lerp 节点的blendFactor 属性。该属性可以绑定到人形角色实体的速度上,例如。随着角色速度的增加,动画会逐渐从Clip0 中的行走动画淡入Clip1 中的奔跑动画。
此外,假设Clip2 代表某种可叠加的变体动画(例如挥动手臂或摇头)。该叠加片段的叠加量可通过Additive 混合节点上的additiveFactor 属性进行控制。
在评估混合树时,会使用归一化时间(或相位),以便不同时长的片段能够无缝混合。例如,尽管“行走”和“奔跑”动画片段的长度不同,但只要动画师在制作时确保脚步落地的位置在相同相位处对齐,它们就能被完美地插值。
这意味着混合后片段的时长实际上取决于树中各节点的混合因子。仅以上述示例中的Lerp 节点为例:当Lerp 节点的混合因子为0时,仅使用Clip0中的行走动画,因此时长为3秒。 当混合因子为1时,最终时长将为2秒。对于中间值混合因子,时长将在3秒和2秒之间进行线性插值。
通过定义自定义混合树,您可以完全掌控如何组合一组输入动画片段。混合树可通过混合节点上的属性进行配置。另请注意,混合节点本身的属性只是标准属性,因此如果需要,这些属性也可以由其他动画驱动。
参考
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.