基于数据的角色动画——PFNN

角色动画控制的实现方法

在实现实时驱动角色动画时,分为两种主要的实现方法:运动学方法(Kinematic Approach)基于物理的方法(Physics-based Character Animation)

其区别主要在于运动学方法不考虑物理真实,一般只是在播放动画,如今最为成熟的就是动画状态机技术。

在运动学方法中又有 数据驱动的方法(Data-Driven) 尝试不设置状态机,用数据本身驱动角色动画,如Motion Matching在数据库中自动挑选要播放动画,而在此基础上又有 基于学习的方法(Learning-Based),其尝试利用深度学习来学习数据库中的动画,从而不需要将数据库保留在内存中。其中Taku Komura组所做的一系列工作十分具有代表性,PFNN就是后续工作的奠基工作。

PFNN简介

PFNN全称Phase-Functional Neural Networks for Character Control,基于相位函数的角色控制神经网络。在此网络结构中,权重是通过使用相位作为输入的循环函数计算的。其中提出的相位函数的概念本质是一种专家系统(Mixture of Experts, MoE),十分适用于动画生成领域,因为角色动画本身具有大量的二义性,如从站立到走路的过程中先迈哪只脚其实没区别,就会导致神经网络学习到的是一个平均值,导致动画生成质量较差,而PFNN根据人类走路的周期性提出Phase Function的概念解决这个二义性问题:

本文的核心就这张图:

本文的贡献主要有两点:

  1. 提出一种新颖的动作分析框架PFNN,可以利用大量动画数据实现角色控制(生成可交互角色动画)包括与虚拟环境的交互。
  2. 提出一种为PFNN准备训练数据的工作流程,通过将运动数据与从虚拟环境中提取的几何图形进行拟合。

其工作流程如下:

  1. 数据预处理阶段:对捕捉到的运动数据进行处理,并提取控制参数。然后将这些数据与虚拟环境中的高度图数据进行拟合
  2. 训练阶段:使用反向传播进行训练
  3. 执行阶段:根据用户控制和环境几何形状实时计算角色运动

下面依次介绍这三个阶段。

数据预处理阶段

动捕并提取控制参数

动捕不同步幅和朝向的基础移动,以各种速度越过障碍,走,小跑和跑的动画,得到大概一小时的60帧动捕数据,使用了与 BVH(BioVision Hierarchical Data) 版本的 CMU 运动捕捉数据相同的铰接式人体模型,该模型有 30 个旋转关节,并在臀部下方的地面上添加了额外的根变换。

标记Phase

得到动捕数据后,需要标记Phase,通过计算脚步关节速度检查脚步是否接触地面,之后将右脚接触地面时的Phase设为0,左脚接触时设为pi,下一次右脚接触时设为2pi,并对中间帧进行插值计算出Phase。

标记步态

之后标记人为标记步态,如标记走、跑、跳等步态。

地形拟合

terrain fitting则是由于在mocap数据时,为了能获得爬山这种动作的数据,有录具有地面高度变化的数据,但是由于地面高度并没有在mocap数据中,所以只能重新反求。其思路是针对已经捕捉好的动作用不同的地形来拟合,也就是改变的是地形而不是动作本身,动作都是动捕到的动作。

在地形高度图中随机采样大约 20000 个 3x3 米Patch的位置和方向信息,首先针对每一个动作,找到最合适的十个patch(使用一个设计好的误差函数);之后用 RBF(径向基函数)修改地形使动画中角色脚步接触地面时与地面准确接触。

计算最合适的Patch时用到的误差函数为:

其中 $h_i$ 为地形高度,$f_i$ 为脚步关节高度,$c_i$ 表示关节是否接地,$g_i$ 为步态信息;


经过地形拟合后,可以看到不同的patch可以对应同一个动作;

训练阶段

神经网络的输入输出参数

PFNN参数与MotionMatching类似,使用当前姿势和轨迹来得到下一帧姿势;

输入参数:上一帧的关节位置和速度当前帧采样窗口中的轨迹位置方向和高度信息(图中黑色点)(这两项就很类似MotionMatching)以及 步态信息(文中是用一个五维二值向量表示五种步态如走,跑,跳等等);
输出参数:当前帧的关节位置速度和旋转下一帧采样窗口中的轨迹位置和方向根位移相对于前进方向的X速度,Z速度以及相对于向上向量的加速度(本文实现完全使用根运动,这里应该是得出当前的运动速度),Phase的变化接地变量

PFNN结构

神经网络结构

文章使用一个简单的三层神经网络:

激活函数是ELU函数:

长这样:

Phase-Function

Phase-Function选择 立方Catmull-Rom样条(Cubic Catmull-Rom spline) 函数,这是一种被广泛应用的曲线绘制函数(在blender中用于建模发丝):

Cutmull-Rom样条一般形式如下,其某一点的切线是前一点和后一点的连线,本文中将首尾控制点设置为同一点构成一个圆形:

为什么要使用Catmull-Rom,因为本质上Phase-Function是想找到一种混合各个权重的方法(MoE),使用Catmull-Rom可以把权重当作控制点,并且可以保证结果是循环的(因为要保证同一个Phase输出的结果要是一样的)。

训练

训练是一个与相位函数参数有关的优化问题,最终就是要训练出 β,也就是四个权重 {$α_0$, $α_1$, $α_2$, $α_3$},文章设计的损失函数如下:

执行阶段(Runtime)

执行阶段的输入参数

执行阶段的输入根据上述的神经网络输入参数分为两部分介绍,骨骼信息轨迹信息

  1. 骨骼相关的信息直接用上一帧预测出的骨骼信息
  2. 轨迹相关的信息也分为两部分,过去轨迹和未来轨迹,过去轨迹直接记录即可,未来轨迹需要与用户输入进行混合,用来平衡控制灵敏度和可信度:

同时也要考虑用户希望的步态信息,如奔跑,跳跃等;在文章的Demo实现中,如果希望角色跳跃就需要一直按住空格,这是因为动作生成的单位是帧,就需要一段时间内的步态信息都指明是跳跃才能生成完整的跳跃动画(MotionMatching中如果要实现跳跃应该也有类似问题),但是应该可以通过技术操作解决。

预计算Phase Function

文中指出,计算Phase Function需要一毫秒,因此文章提出两种预计算方案:

  1. 预计算出50个Phase Function的值,在执行过程中直接用临近的值代替,空间换时间;
  2. 预计算10个值,之后线性插值;

实验结果评估

文章对各种网络结构进行了实验,发现还是PFNN效果好,并且使用Phase Function直接控制参数与将Phase当作参数相比效果更好。

参考资料

[合集] Data-Driven Character Motion Synthesis
动作生成的智能之路(I) : PFNN和MANN
phase functioned network for character control
一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)
Blender几何建模原理(五)曲线


基于数据的角色动画——PFNN
https://kenny-hoho.github.io/2023/11/06/基于数据的角色动画-PFNN/
作者
Kenny-hoho
发布于
2023年11月6日
许可协议