• 对于步幅重定向
    • 不使用踝关节的原始局部旋转
    • 以髋关节为原点,腿部伸直向下向后画圆
    • 通过调整下一个脚部落地预测点的距离调整步幅
  • 对于(步幅重定向)数据结果的操作
    • 对于调整过步幅的结果,同时通过等比修改纵轴缩放调整动画过程的高度让动作变的更加自然(步幅减小时脚抬起高度也会对应降低),如正常步幅1m,调整后步幅0.6m,则抬高高度也应为原始动画的0.6倍
  • 对于脚步预测
    • 读取原始动画确认下一步落脚点运动时间
    • 通过root motion变化确认下一步移动距离
    • 通过navigation确认移动路径和最终朝向以确认移动了多少距离(这里由于一般项目不是自动移动,或者角色单位会有横移等明确具有目标朝向结果的移动,因此可能考虑直接通过输入或者从其他系统中获取目标朝向)
    • 此时移动距离、起始与结果脚步朝向都已确定,通过射线检测决定落脚点。该落脚点需要每帧更新计算结果,理想情况下不应在此过程中产生变化
    • 当处于动画混合时,距离可能产生变化;且动画过程中root motion不一定是线性的,比如僵尸走路会有一个蹒跚的动作。因此混合不应该是简单的随时间插值
      • notion image
        这里选择在混合开始时读取前后两个动作起始点的速度,得到速度差,按过度时间添加到当前速度中,逐帧还原直到当前动画的速度完全取决于目标动画(最终距离也将会是二者差值结果,不会大于更远的那个,不会小于更近的那个)
        公式:
      • 速度差VelocityDelta,当前时间t(开始混合为0),前后动画配置混合时间BlendTime
      • 对速度的补充 V(t) = VelocityDelta * (1 - t / BlendTime)
      • 时间t时该帧移动的距离 D(t) = -VelocityDelta / BlendTime / 2 * t * t + Velocity * t + C(存疑)
  • 选择合适的动画
    • 依据一组标准决定最接近的动画(切换)——基于Motion Matching
    • 如何选择正确的动画进行混合并提高运算效率
      • 将所有动画分组,在运行时实时的增加移除可能的列表
      • 将当前需要查找的情况规划为某个或多个指标的范围,直接剔除对应参数不在该范围内的动画
        • 比如限定下一个动作的移动范围比较小,则剔除那些无法到达位置的动画,然后使用超过那个距离的动画通过缩放(参见上文对步幅重定向数据结果的操作)来调整步幅长度以精确停在目标位置
        • 比如当需要从走到停的时候,下一步混合的动画不选择不存在任何移动的动画(比如直接选择站立)
      • 会制作一些假sample用以比如结果动画速度不为0的情况以获得更自然的过渡(存疑)
    • 对于不平坦的地形
     
     
    Semi-Procedual Locomotion研读:核心算法「Hallo World」 UE4制作分享笔记