Qt 3D Animation C++ Classes
Qt 3D Animation 模块提供了一组预构建的元素,可帮助您开始使用Qt 3D 。更多
自 6.8 起,该模块已被弃用。我们强烈建议不要在新代码中使用该模块。
命名空间
包含 Qt3DAnimation 模块中的类 |
类
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 Animation API(如 Qt3DAnimation::QKeyFrameData)以编程方式创建,也可以来自数字内容创建(DCC)工具,如 Blender、Maya 或 3D Studio Max。Qt 3D 提供了一个 Blender 动画数据导出脚本示例。Qt 3D Animation 目前使用的格式是一种基于 JSON 的简单格式。这使开发人员和艺术家都能轻松处理动画数据。稍后将添加更多针对运行时使用进行了优化的格式。
关键帧动画数据可通过Qt3DAnimation::QAnimationClipLoader 类从文件加载。要以编程方式指定动画数据,请使用Qt3DAnimation::QAnimationClip 类。
默认情况下,关键帧数据使用立方贝塞尔曲线指定。这样就可以通过少量关键帧数据点创建流畅的动画。稍后还将添加其他插值类型。
播放动画
除了包含关键帧的动画数据外,Qt 3D Animation 还提供了播放动画和将生成的属性值映射到模拟对象属性的 API。目前有两种播放动画的方法:
这两种方法都是作为Qt3DCore::QComponent 的子类实现的,这意味着这些类型的对象可以通过Qt3DCore::QEntity 对象聚合,从而为模拟实体添加动画功能。
简单动画播放
Qt3DAnimation::QClipAnimator 类允许一次播放单个Qt3DAnimation::QAbstractAnimationClip 。要为实体添加动画,只需在实体的components
属性中添加Qt3DAnimation::QClipAnimator 类的实例即可。
Qt 3D 动画模块采用的方法与QPropertyAnimation 和AbstractAnimation 略有不同。在这些动画框架中,动画既指定了动画值,也指定了目标对象和属性。Qt 3D 中的动画组件则将这两个正交概念分开。例如,Qt3DAnimation::QClipAnimator 组件有一个clip
属性,用于指定动画数据(Qt3DAnimation::QAnimationClip 或Qt3DAnimation::QAnimationClipLoader )。
这样就可以计算出动画值,但还需要更多信息才能将这些值映射到对象的属性上。这可以通过包含Qt3DAnimation::QChannelMapping 对象列表的Qt3DAnimation::QChannelMapper 来实现。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 时,仅使用片段 0 中的行走动画,因此持续时间为 3 秒。如果混合因子为 1,则持续时间为 2 秒。对于中间混合因子,持续时间将在 3 秒和 2 秒之间线性插值。
通过定义您自己的混合树,您可以完全控制如何组合输入的动画片段。混合树可以通过混合节点上的属性进行配置。还需注意的是,混合节点上的属性本身只是标准属性,因此如果需要的话,这些属性反过来也可以由其他动画驱动。
参考资料
© 2025 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.