Qt 3D 动画 C++ 类
Qt 3D 动画模块提供一系列预构建元素,帮助您开始使用 Qt 3D。更多...
此模块正在开发中,可能会发生变化。
命名空间
包含 Qt3DAnimation 模块的类 |
类
Qt3D 动画的抽象基类 | |
提供关键帧动画数据的基类 | |
提供动画播放功能的基类 | |
用于构建动画混合树的基类 | |
基于加性因子执行两个动画片段的加性混合 | |
为 Qt 3D 提供关键帧动画功能 | |
表示动画回调对象 | |
指定关键帧动画数据 | |
包含动画数据的类 | |
从文件中加载关键帧动画数据 | |
动画控制器类 | |
用于组合动画的类 | |
提供树形混合节点动画播放功能的组件 | |
可以将片段内的通道映射到回调对象的调用上 | |
定义 QAnimationClipData 的通道。动画系统独立插值每个通道组件,除了“旋转”的情况(敏感大小写),它有四个 QChannelComponents 和每个 QChannelComponent 的相同数量的关键帧。在这种情况下,将使用 SLERP 进行插值 | |
可以将片段内的通道映射到应用程序中对象的属性上 | |
可以将片段内的通道映射到应用程序中对象的属性上 | |
提供简单动画播放功能的组件 | |
用于在混合树中包含剪辑的类 | |
处理关键帧的基类 | |
用于将 QTransform 实现简单关键帧动画的类 | |
基于归一化因子执行两个动画片段的线性插值 | |
提供变形目标以实现混合形动画的类 | |
实现混合形变形动画的类 | |
实现顶点混合变形动画的类 |
详细说明
本模块仍在开发中,但作为一个技术预览版可供使用。这意味着它可能不稳定,可能会更改,并仅提供方便。
#include <Qt3DAnimation>
要链接到相应的C++库,请将以下内容添加到您的qmake项目文件中
QT += 3danimation
类、类型和函数在Qt3DAnimation命名空间下声明。
概述
Qt 3D动画模块支持为您的仿真中的对象属性指定和使用动画。最初,此模块支持基于关键帧的动画。这意味着属性在特定时间有'键控'的值,并在回放时通过在关键帧内插值已知值来计算属性值。Qt 3D动画模块中的所有动画评估都在Qt 3D线程池中进行。这使得动画可以平稳运行并扩展到高吞吐量。
动画数据
关键帧动画数据可以通过Qt 3D动画API(如Qt3DAnimation::QKeyFrameData)以编程方式创建,也可以来自数字内容创建(DCC)工具,如Blender、Maya或3D Studio Max。Qt 3D提供用于Blender动画数据的示例导出脚本。Qt 3D动画目前消耗的格式是基于JSON的简单格式。这使得开发人员和艺术家都能够轻松地处理动画数据。稍后还会添加更多针对运行时消耗优化的格式。
可以使用Qt3DAnimation::QAnimationClipLoader类从文件加载关键帧动画数据。要使用编程方式指定动画数据,请使用Qt3DAnimation::QAnimationClip类。
默认情况下,关键帧数据使用三次贝塞尔曲线指定。这允许从少量的关键帧数据点创建平滑的动画。稍后还会添加其他插值类型。
播放动画
除了包含关键帧的动画数据外,Qt 3D动画还提供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(Qt3D动画通道映射器)实现的,其中包含一个Qt3DAnimation::QChannelMapping(Qt3D动画通道映射)对象的列表。Qt3DAnimation::QChannelMapping用于将动画剪辑中的特定通道映射到目标对象的命名属性上。通过这种方式分离动画数据和属性映射,可以为多个对象应用相同的动画,而无需拥有多个动画数据或对象的副本。这也使得动画数据可以轻松地重新分配到其他对象上。
混合动画播放
Qt3DAnimation::QBlendedClipAnimator组件允许通过在应用属性更改到目标属性之前混合多个动画剪辑来超越Qt3DAnimation::QClipAnimator的限制。该动画组件与标准的Qt3DAnimation::QClipAnimator组件一样,仍然需要通道映射器。然而,与指定单个动画剪辑不同,需要将blendTree
属性设置为指向混合树的根节点。
混合树是一种数据结构,表示动画剪辑如何根据混合树节点的属性进行聚合或混合。目前支持的混合树节点包括:
使用Qt3DAnimation::QClipBlendValue类的实例在混合树的叶子节点中指定源动画剪辑输入。这些动画剪辑可以以多种方式组合。目前,Qt3D Animation模块提供线性插值(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秒之间线性插值。
通过定义自己的混合树,您可以全面控制如何组合您的输入动画剪辑集。可以通过混合节点上的属性来配置混合树。请注意,混合节点上的属性本身只是标准属性,因此这些属性可以由其他动画驱动,如果需要的话。
参考资料
© 2024 The Qt Company Ltd. 本文档中包含的文档贡献属于其各自的版权所有者。提供的文档根据自由软件基金会公布的规定,以GNU 自由文档许可协议 1.3 版本进行许可。Qt 和相应的标志是 The Qt Company Ltd. 在芬兰和其他国家/地区的商标。所有其他商标均为其各自所有者的财产。