What

一种Warp行为,和普通的Warp不同,他会一开始就计算出Warp窗口期间骨骼的变换。可以对多骨骼进行Warp,主要是为了解决脚的滑步问题,多用于Root一直在地面的动画Warp。
Smart Layer In-Depth Tutorial 01: Introduction to Adjustment Blending

Why

比如一个受击踉跄动作。如果策划需要调整踉跄的位移,仅Warp根骨骼会导致脚滑步。因为两者移动速度不一样。通常会对脚的IK骨骼进行缩放,同时将IK骨骼喂给IK节点,来控制脚的滑步。
滑步表现:(99+ 封私信 / 80 条消息) UE5 Motion Warping(运动扭曲) 原理剖析及UE4适配 - 知乎

How

参考URootMotionModifier_AdjustmentBlendWarp的实现。
其他的Warp实现通常不会提前算好root的所有变换。而是始终根据当前状况进行Warp(如果有网络同步情况,会导致一开始算不准)。比如SimpleWarp。实时对当前的RootMotionDelta进行Warp。如下:

  1. 获取当前RootMotionDelta,之后对它进行调整。
  2. 获取当前距离目标值的大小(位移和旋转单独处理)TargetDelta
  3. 获取当前时间到结束时间的RootMotion。RootDelta
  4. 计算一个缩放值:WarpedAlpha = TargetDelta/RootDelta
  5. 应用给RootMotionDelta。

对于AdjustmentBlendWarp,为了解决滑步,让脚步骨骼(IK骨骼)也缩放。缩放的策略是当原动画里脚步不动时,Warp后的这段时间脚步(IK骨骼)也不要动。
计算过程比较复杂,在我看来使用运行时Warp的方式对脚步骨骼缩放应该也是可以的。如果当前RootMotionDelta为0,那么Warp值也会为0。

AdjustmentBlendWarp是这样做的:

  1. 首先得到每根骨骼的目标偏移(Translation和Rotation),这些偏移记录到了一个AdditivePose里。

  2. 计算窗口期间每根骨骼,每帧的变换。并将偏移分散进去。

    1. 为了将偏移按合适的比例(0~1)分散到每一帧,提前算了一个TotalTranslation(TotalRotation)和一帧的DeltaTranslation(DeltaRotation)。这里的TotalTranslation和DeltaTranslation的分量都是绝对值。目的是计算每一帧的偏移比例是多少。
    2. 有了这个比例后,就可以计算出这一帧的偏移值。累加之前的偏移值就能得到这一帧骨骼变换。

下面代码就是上面2.1的过程。对Vector的3个分量分别计算比例

auto CalculateAdditive = [](const FVector& Total, const FVector& Delta, const FVector& Additive, const FVector& PreviousAdditive, float Alpha)  
{  
    FVector CurrentAdditive = FVector::ZeroVector;  
    for (int32 Idx = 0; Idx < 3; Idx++)  
    {       if (!FMath::IsNearlyZero(Total[Idx], (FVector::FReal)1.f))  
       {          const FVector::FReal Percent = Delta[Idx] / Total[Idx];  
          const FVector::FReal AdditiveDelta = FMath::Abs(Additive[Idx]) * Percent;  
          CurrentAdditive[Idx] = (Additive[Idx] > 0.f) ? PreviousAdditive[Idx] + AdditiveDelta : PreviousAdditive[Idx] - AdditiveDelta;  
       }       else  
       {  
          CurrentAdditive[Idx] = Additive[Idx] * Alpha;  
       }    }    return CurrentAdditive;  
};

Sample

想象一个像前交互的情况。比如在X正方向,其中一只脚从0迈向5,接着另一只脚从0迈向10,最后5处的脚收回到10处。但要去的地方在15处。对于两只脚的增量都是5。需要将5平摊到其中,