文章先介绍了运动数据,但是在我目前所做的实验中,数据都来源于CMU提供的ASF/AMC格式的运动数据
重点部分是关键帧插值、时间和空间变形。最后一步是优先级重叠。
以骨骼间夹角作为动作特征,根据运动特征将关键帧集合分类,采用分层插值方法,合成虚拟人运动序列。对于某一时刻前后两个关键帧的插值,平移和缩放采用线性插值,旋转过程采用球面线性插值。球面线性插值就是在四维空间的单位超球面上对两个单位四元数进行插值,并保证最终的插值结果仍在超球面上,而不会产生加速效果。
接下来介绍了单位四元数的插值方法:
假设q1和q2位单位四元数,参数μ∈[0,1],从q1到q2的球面线性插值记作slerp(q1,q2,μ),数学表达式为:
其中μ∈[0,1] ,α=arccos(q1,q2)是两个插值点q1和q2间的夹角,球面线性插值的结果处于球面上,无需进行归一化处理,就能保证以恒定的角速度在两个关键帧q1和q2间的球面上以最短弧长运动。
本文在关键帧插值基础上,采用变形使两个运动之间的关键帧产生一一对应的关系,持续相同的时间,说白了就是时间对齐或者称为DTW。
选取的关键帧时刻为Ki(1≤i≤Nk),Nk为选取的个数。将实际时间T∈[K1,KNk] 映射到标准时间t∈[0,1] ,构造如下函数
其中,m为最大指数,即T>Km
这样两个运动序列经过变形以后就可以在关键帧之间一一对应。
但是由于人物的空间位置不同,所以就需要进行空间变形了。将运动序列整体沿水平或者垂直方向旋转,使各输入运动的空间位置和朝向尽可能相似。
设运动序列分别为P和Q,长度分别为m和n,分别表示为
p=p1,p2,...,pm
Q=q1,q2,...,qn
每帧有J个关节点,采用“点云”方式表示运动姿态。每个关键帧对应不同的点云,任意点云经过运动变换以后,使点云距离达到最小,对输入的两段运动序列m1和m2任意的关键帧进行空间变形。设m1中第i 关键帧 fi 的一个关节坐标为(x,y,z)^T,m2中第i个关键帧fi' 相同关节坐标为(x‘,y',z’)^T,人体在XOZ平面上绕轴的旋转角度为θ ,任意两帧之间的距离函数为:
其中,pi,k是由第i 帧生成的邻居点云上的第k个节点;是把第i 帧和第 j 帧对齐的仿射变换矩阵。wk是权值,决定了每个节点对最终距离值的影响程度。
将帧间距离公式展开,对θ,x0,z0求偏导,并令偏导为0,得到
最后一步进行优先级重叠。将几个典型动作按照合适的权重结合产生新的动作数据A1和A2之间的中间插值动作。
浮点数α 取值0~1.0。上式表示两个动作所包含的所有对应的旋转角度和平移矢量各自进行线性组合。