在开始解构ALSv4之前,我们需要了解运动、动画相关的基础知识,在本节主要记录这些基础知识。
1. 骨架-骨骼-姿势-动画
四者之间的关系:骨骼的变换和旋转生成姿势,各个姿势在每个帧上进行动画混合,形成动画。骨架保存所有的骨骼数据。
在UE中生成姿势资产:
(1)由骨骼生成姿势资产
(2)由动画的某一帧上生成姿势资产
下图为从骨骼中生成资产,动画的某一帧生成也是同理。
生成的资产是一个姿势资产
在UE中骨架、网格体和动画是相互独立的,也就是说骨架像一个中间键一样,同时绑定了网格体和动画才得以成立。而对于这个骨架修改了动画,换一个网格体同样是有效的。
2. 叠加动画
叠加动画是一个偏移量,是个增量,最终姿势减去初始姿势,即为叠加动画的本质。
叠加动画的作用:我们在制作No addiive动画时,将所有叠加动画的值,加到每个帧上去,就形成运动的动画。
3. 混合空间
注意:混合空间属于动画资源,因此需要绑定骨架。
我们以BlendSpeed1D为例
注意:白点可以是姿势,也可以是动画,因此我们可以做一个从站立姿势到走路动画的混合输出动画值。
4. 瞄准偏移
瞄准漂移是特殊的混合空间,是所有混合空间中资产都是Mesh Space的。
UE源码如下,UAimOffsetBlendSpace1D就继承自UBlendSpace1D。
// 头文件
class UAimOffsetBlendSpace1D : public UBlendSpace1D
{
GENERATED_UCLASS_BODY()
virtual bool IsValidAdditiveType(EAdditiveAnimationType AdditiveType) const override;
virtual bool IsValidAdditive() const override;
};
// 函数实现
bool UAimOffsetBlendSpace1D::IsValidAdditiveType(EAdditiveAnimationType AdditiveType) const
{
// AAT_RotationOffsetMeshSpace在UE中的名称就是"Mesh Space"
return (AdditiveType == AAT_RotationOffsetMeshSpace);
}
bool UAimOffsetBlendSpace1D::IsValidAdditive() const
{
return ContainsMatchingSamples(AAT_RotationOffsetMeshSpace);
}
因此瞄准偏移相当于在混合空间的基础上加了限制:所使用的资源都是Mesh Space。
瞄准偏移的目的:在于忽略骨架现在的倾斜姿势,以基础姿势为准,即模型的指向动作永远朝向鼠标所指的方向。
5. 动画蓝图
在动画蓝图中使用动画序列,动画序列以绿色标记,可以直接拖入,也可以直接搜索资产名称。
对于姿势来说,右击动画,选择Convert To Single Frame Animation。
注意:动画蓝图中的输入输出都是以姿势为单位,每帧去调的。
使用变量进行动画的设置。
6. 修改骨骼
使用Transform (Modify) Bone进行指定骨骼的修改,修改值可以选择替换数值和在现有值上进行追加两种,同时也可以选择修改的空间。
注意:Local To Component和Component To Local是坐标映射变化,不用细究。
7. 双骨骼IK
注意:Joint Target Location本质为PoloVector,即为极向量约束。
8. 混合
我们在动画蓝图中可以通过Blend节点实现和混合空间相同的效果,混合模式分为Map Range、Clamp Result和Interp Result。插值的公式是A + Speed * deltatime,主要目的能让速度稳定的叠加。
上图与四点的2D混合空间的效果是基本一致的。
当然可提供了根据条件进行混合的节点和多姿势的混合节点。
9. 同步组
比如当你切换姿势的时候,切换时走路抬起的是左脚,而切换到跑步,跑步姿势抬起的是右脚,那这样的切换就会很生硬。这个时候就要用到同步组,这样你的过度才会很自然。
注意:同步组中分为Leader和Follower,Follower永远使用Leader的动画长度。
必须是同一个同步组中,以相同名称的同步标记来进行同步,并且标记完全相同,不多不少。
在姿势中,可以添加同步标记来让当前帧寻找最近的标记,来达到动画之间的同步,如下图添加Left和Right标记来同步左脚和右脚。
10. 蒙太奇
蒙太奇的作用:我们使用普通的Play Animation,这个节点会破坏我们原有的动画蓝图,在播放结束后不会回到原来的动画蓝图。而蒙太奇的作用就是以插槽的形式来插入到动画蓝图中,播放完蒙太奇后并不会对动画蓝图产生影响,Mesh使用Play Montage来实现。
注意:蒙太奇动画的作用不止如此,蒙太奇的本质是剪辑,将不同的动画片段组合在一起,可以用程序控制的顺序序列,而且支持根运动。我们可以直接通过拖拽,把新的动作片段插入原有的蒙太奇,并且可以随意拼接这些片段。
11. 动画曲线
动画曲线的原生用法:1.变形目标;2.骨骼材质。
动画曲线的其它使用:我们能在任何地方拿到这个动画曲线,从而用这个曲线做逻辑上的运算。