动画控制器
动画控制器
动画控制器 主要用于控制载具的动画播放和混合行为
模型姿态(Pose)
简单来说,姿态 可以理解为“模型当前摆出的样子”,即当前应用到模型骨骼上所有的 变换(位置、旋转、缩放)的集合, 它可以来自某个动画的某一帧,或是由程序输出的程序性动画
姿态之间可以经过一系列不同策略进行 混合/叠加 并得到一个新的姿态,我们会将得到的 最终姿态 应用到模型上
动画上下文和脚本
在编写动画控制器时,我们可能需要一些来自实体的信息或是进行某些操作,比如载具的速度,某个部件的旋转角度等等,我们将这些信息统称为上下文
模组会为每个载具实体提供一个独立的上下文,你可以通过js脚本或者特定的预设配置来访问这些信息和方法,并根据它们来决定动画控制器的行为
关于详细的动画上下文和脚本API,请参见 章节:动画上下文
提示
根据实体的不同,模组提供给动画控制器的上下文也不尽相同,有些信息仅在特定类型的实体上可用
姿态源
即输出姿态的来源,每个姿态源最终都会最终输出一个姿态
动画状态机
动画状态机是一种类似流程图的,用于控制动画的工具。它由多个状态组成,状态之间可以通过转换进行切换,从而实现动画的连贯播放
控制器支持定义复数个并行的状态机,每个状态机最终都会输出一个姿态
关于动画状态机在控制器中的具体使用,我们将在 章节:动画状态机 中介绍
除此之外,模组封装了一些常用的简单状态机,它们与特定场景下的状态机等效,但是实现更为简化,使用起来也更方便
开关动画
与 可开关部件 绑定的姿态源,输出对应部件的当前状态(开或关)对应的开/关动画,需要在控制器中预先配置
开关动画仅做开门的即可,关门时会自动倒放(包括播到一半时)
{
// 可开关动画列表
"switchable_animations": {
// 此pose源的id,即混合控制器中引用的id
"front_door_left": {
// 绑定的可开关部件ID,如果不是可开关部件此配置无效
"part_id": "front_door_left",
// 绑定的动画名称
"animation": "front_door_left"
},
"front_door_right": {
"part_id": "front_door_right",
"animation": "front_door_right"
}
}
// ...
}循环动画
输出一个始终在循环播放的动画,需要在动画控制器中预先配置
{
// 循环动画源
"loop_animations": {
// 此pose源的id,即混合控制器中引用的id
"static": {
"animation": "static"
}
}
}脚本
脚本输出的程序性动画
注意
强烈建议仅在封装好的功能确实无法满足需求时,才考虑使用脚本实现动画源
虽然理论上脚本完全可以等效完成上述封装好的功能,但脚本等效实现的开销往往是封装好的 数倍甚至数十倍
履带动画
一类特殊的姿态源,仅履带类载具可用,实际配置位于对应的display配置文件中,在动画控制器中无需额外配置,用于播放履带动画
混合控制器
混合控制器是一个 树形结构,用以描述复数姿态来源之间的混合行为
树上的节点主要分为两类:
- 姿态源节点:一个姿态源节点直接连接一个姿态源,输出该姿态源的当前姿态,仅能作为叶子节点
- 混合节点:一个混合节点可以接受若干个姿态(可以是某个姿态源节点,或是另外一个混合节点),经节点处理后输出一个姿态
完成所有计算后,根节点的输出将会最终应用到载具的模型上
