马建晓,刘 伟
(南阳师范学院 机电工程学院,河南 南阳 473061)
虚拟人作为参与者在虚拟现实中的表示,其逼真程度直接影响了参与者的沉浸感。运动捕获方法就是通过捕获真实人的运动数据记录人体运动中丰富的细节,生成具有很强真实感和较强实时性的人体动画[1-2]。但是在虚拟人的运动过程中,并不是重复单个动作,往往需要做出各种不同的动作,因此必须解决动作之间的切换问题。一种实现动作过渡的简单方法就是利用关键帧插值技术,将前后动作的一些特殊位置作为关键帧,然后通过参数插值实现运动[3-4]。这种方法虽然简单,但是处理效果并不理想,尤其是当动作与动作间的过渡时间较长时,在过渡时间内可能会出现新的特殊位置,所以仅仅依靠运动变化前后两个关键帧是无法通过参数插值来实现的。文献[5]提出一种数据驱动的虚拟人运动生成模式。当直接使用运动捕获的数据无法保证与虚拟环境实时交互时,可将人体的物理性质与运动捕获数据联合计算,以获取物理正确性的控制参数,通过运动分割器和姿态生成器得到运动参数。这种动力学控制方法虽然部分解决了生成动作机械化的问题,但由于人体物理性质的复杂性,在复杂虚拟环境中还会出现动作失真的现象[6-7]。另外,在虚拟现实中虚拟人还经常在同一时刻做出多个动作。比如在作战仿真系统[8]中,步行动作和射击动作作为两种不同的基本动作,常常是同时进行的。甚至有时候虚拟人会同时做出两种以上不同的动作。比如在步行前进射击的过程中,做出卧倒动作,这些都属于虚拟人运动合成的问题。逼真的虚拟人运动合成目前主要面临以下困难[9]:(1)在交互式虚拟现实中,虚拟人的运动要受到使用者的控制,然而这种控制通常是较高层次的控制,如运动的方向、速度等,而不是对某个关节角度或肢体形态等底层的控制,缺少灵活的动作切换和合成技术将有损系统的交互性。(2)虚拟人运动具有内在的结构和时序性。例如,行走通常要包括右脚支撑、左脚支撑再到右脚支撑等过程,合成在结构上不完整的运动是没有意义的。
针对以上问题,必须找到一种合适的运动融合方法来合成满足控制信息和环境约束的动作。运动融合的基本思想就是把运动看成基于时间的一组信号,从而可以对两种或两种以上的运动信号进行按权重相加,合成一种新运动[2,10]。该文对传统的基于固定权重相加的运动融合技术进行改进,提出一种基于实时权重相加的运动融合技术,在进行虚拟人交互式控制时,通过在运动过程中实时计算被融合运动的权重进行动作合成,使合成的动作既满足控制者的需要,又满足环境约束条件。
在虚拟现实中,虚拟人经常需要在步行、跑步和跳跃等动作之间切换,如果忽略中间的过渡阶段,直接将虚拟人从一个动作转换到下一个动作,则无法实现平滑过渡,视觉效果较差[11-12]。以步行运动和跑步运动为例,两种动作都是周期型运动,具有较强的相似性。但是在融合的过程中运动信号还必须基于时间对齐,即运动序列在时间上对齐,否则融合的运动将完全没有意义。例如,将跑步运动中落地阶段的动作与步行运动中脚在空中的动作进行融合,融合的结果就没有意义。
时间变换[13]是对运动中的时间进行重新映射,通过这种变换将信号表示在一个新的时间段里,这一过程即为运动序列对齐。时间变换可以实现对信号的膨胀和压缩,这样处理能够使两个不同步信号变换为时间上同步协同的信号。
通过运动融合技术,实现动作θ1(t)到θ2(t)的切换,基本思路是,将动作θ1(t)结束时间段里的运动关节参数和动作θ2(t)起始时间段里的运动关节参数按照一定的比例权重进行叠加,就可在这个重叠时间段里实现运动θ1(t)到运动θ2(t)的过渡[14]。过渡动作的计算公式如下:
θ(t)=s(t)θ1(t)+(1-s(t))θ2(t)
(1)
其中,s(t)为过渡函数,是关于时间t的函数,在过渡阶段,随着时间的推移而发生变化,决定了在过渡过程中两个不同动作的权重;θ(t)表示过渡动作关节参数关于时间t的函数。从公式(1)可知,动作切换实质上是将前后两个基于时间的动作关节参数信号按权重进行相加,不同的过渡函数s(t)决定了不同的切换效果。因此,针对不同的运动切换必须设定与运动类型相一致的过渡函数才能保证切换效果的真实性。
在研究两种动作之间的切换时,由于两个动作的权重和等于1,所以只需设定一个动作的权重函数即可。权重函数一般可分为线性过渡函数和非线性过渡函数两大类。常用的线性函数表达式如公式(2)。
(2)
在实际的虚拟人运动关节参数计算时,时间按照运动帧的间隔向前推进,因此常用的是其离散表达式,如公式(3)。
(3)
非线性过渡函数的表达式有多种,常用的是指数衰减函数,表达式如公式(4)。
s(t)=e-αt-e-αN,α为衰减系数
(4)
离散表达式如公式(5)。
s(i)=e-αni-e-αN,0≤ni≤N,α为衰减系数
(5)
在以上表达式中,N指过渡时间内需要重新编辑的帧数,ni为当前的帧为第i个编辑帧。s(i)为前一个动作过渡时间内的第i个运动帧的关节参数,由s(i)表达式可知,在运动切换的过程中,前一个动作的权重逐渐减小,后一个动作的权重逐渐增大。具体过渡函数的选择要结合两个切换动作本身的时空特性来决定,一般来讲,相似动作的过渡,例如步行动作与跑步动作的过渡一般选用线性函数,而差别较大的动作,例如在跑步前进中,从跑步动作突然到跳跃动作的过渡一般选用非线性函数。
为了实现步行运动到跑步运动的切换,选择步行和跑步的一个单步运动周期作为运动过渡的重叠区间。由于行走和跑步的速度不一样,所以步行运动和跑步运动的单步运动周期不同。如果采用相同的采样频率,所获得的采样帧数就不同。针对这个问题,该文采用时间变换的方法是将单步运动周期统一缩放到[0,1]区间内,建立一种从t到t'的映射关系t'=g(t),只要给定每一帧的运动时间,通过映射关系就可以找到经过时间变换的相对运动时间。由于步行运动和跑步动作均为周期运动,因此,该文选择线性时间变换函数,其表达式如公式(6)。
(6)
其中,tp为对应跑步运动和步行运动的单步运动周期,n为当前的帧为第几个编辑帧。通过函数变换,可以将时间长度映射到[0,1]区间内,使步行运动和跑步运动在一个单步周期内同步。通过时间变换和运动采样分析,保证每个运动的采样帧在映射区间内均匀分布且数量相等。
跑步运动曲线如图1所示,红线表示脚尖的轨迹曲线,绿线表示脚后跟的轨迹曲线。在时空特性分析的过程中,采用与步行运动相同的采样频率进行采样,同时记录每一个采样点处的运动关节坐标,并保存到相应的数据结构中。
图1 跑步运动关键节点曲线
在实现运动切换时,依然采用按帧运动编辑的方法进行运动编辑。即在一个单步运动周期内按照固定的采样间隔逐帧对虚拟人的运动姿态进行编辑,由于采样间隔一般小于运动帧间隔,所以进行编辑后还要运用四元数球状线性插值技术实现两个被编辑帧之间的运动序列。运动编辑公式如公式(7)。
(7)
其中,s(i)为第i个被编辑帧步行运动的权重,k为第几个需要计算的运动关节,K为总的需要编辑的运动关节个数,wk(ni)为步行运动中第i个采样帧处第k个运动关节的坐标位置,rk(ni)为跑步运动中第i个采样帧处第k个运动关节的坐标位置。
在计算运动关节坐标时,根据构建的虚拟人简化几何模型,针对步行运动和跑步运动,只需关注虚拟人下体运动关节坐标位置的变化过程,所以在实际仿真时,只对臀关节、左右股关节、左右膝关节以及左右踝关节的坐标位置进行编辑。运动切换过程中虚拟人上体运动关节坐标位置的变化,通过计算脚后跟到身体中心线的连线与地面的夹角,来设置虚拟人上体的倾斜度。即上体关节坐标只跟虚拟人两个动作切换的速度倾斜一定角度。具体的步行运动到跑步运动切换的计算流程如图2所示。
图2 运动切换流程
运动切换可以看作是两种动作的合成,但是在虚拟现实中,虚拟人仅仅实现两种动作的合成是远远不够的,经常需要多种动作的合成。常见的基于运动融合技术的运动合成方法大体可以分为两大类[15-16],即基于固定权重的运动合成和基于实时权重的运动合成。前者通过人为设定被合成运动的权重来合成运动,后者主要根据一些关键帧的运动姿态实时计算被合成动作的权重来合成运动。
基于固定权重的运动合成是指在由一些基本运动构成的样本动作库中,给出一组系数θi,即每个样本动作的权重。由这组系数θi和原始样本动作ri合成出一个新的动作x,数学表达式如公式(8)。
(8)
其中,m为样本动作个数,从公式(8)可以看出,合成的运动实际上是对样本运动的线性融合,因此,合成结果的连续性与所采用的基本动作的连续性是相同的。此方法需要人为直接设定每个样本动作的权重来合成新动作,对操作者的要求较高。在实际应用中,通常需要经过反复实验合成出一些接近真实人运动效果的固定动作,在运动过程中不能够根据环境约束改变动作,灵活性较差,主要应用在环境约束影响小且场景比较简单的虚拟现实中。
3.2.1 基于实时权重的运动合成方法概述
传统的运动合成方法主要有逆向运动学方法和基于控制器的方法[16]。逆向运动学方法是通过某些末端关节的位姿来反求中间运动关节坐标信息,不考虑合成运动的权重,直接生成新的动作,不足之处是需要计算的关节坐标信息太多,且基于反复迭代思路进行问题求解,所求结果可能不满足人体要求。基于控制器的方法是根据末端关节的位姿计算虚拟人每个关节的所需控制力矩,实现特定动作的生成与控制。此方法只考虑了人体的机械特性,仿真的动作太过僵硬、正规。
基于实时权重的运动合成方法是指根据环境约束生成某个时间序列上虚拟人应该达到的运动姿态,然后依据该关键帧的运动姿态反求出各个样本动作的权重进而合成出整个运动序列。与逆向运动学方法相比,该方法不需要通过末端关节的位姿来反求中间所有的运动关节坐标信息,只需求出某些关键运动关节坐标信息,再求出被合成动作的权重。该文提出一种基于时间序列的矩阵方程算法,来实时求解运动权重,此方法能够根据环境约束的改变和交互控制者的需要实时计算运动权重,并且新动作是虚拟人基本动作的合成,因此确保了动作不失真。
例如,在合成虚拟人上台阶的动作时,首先根据虚拟环境中台阶的高度和宽度以及控制信息计算出虚拟人在某时刻的足迹位置,然后运用逆向运动学算法计算足迹位置处的虚拟人运动姿态,即某些关键运动关节坐标,主要包括臀关节、左右股关节、左右膝关节等。其次,根据关键运动关节坐标信息计算被合成动作的权重,最后根据各个动作的权重合成出从当前位置到足迹位置的整个虚拟人人体的运动序列。
该方法的核心技术主要有以下两点:①根据虚拟人末端效应器的运动目标位置,运用逆向运动学算法求解虚拟人的关键运动关节坐标;②根据虚拟人的关键运动关节坐标求解被合成动作的权重。关于逆向运动学算法求解虚拟人的关键运动关节坐标,笔者在其他文章中有专门论述,该文重点研究实时权重的计算方法。
3.2.2 实时权重的计算方法
在进行运动合成时,被合成的运动是多样化的,运动类型各不相同,即有可能存在周期型运动与非周期型运动的合成,所以不能按照上述设定过渡函数的方法来实时计算运动权重,必须在基于关键帧姿态的约束下设计合适的算法来实时计算被合成运动的权重。
为了能够实时计算运动权重,该文引入了运动组的概念,每个运动组包含多个周期运动和一个非周期运动。周期运动一般是指步行运动、跑步运动以及左右跨步运动等,非周期运动主要是指射击、跳跃等。在进行运动合成时,约定周期运动的速度均大于零,非周期运动的速度均等于零。由于每个运动组只包含一个非周期运动,所以如果被合成的运动包含多个非周期运动,就要设定多个运动组来计算权重。
下面给出一种实时权重的计算方法。
假定被合成的运动中只有一个非周期运动,则构建一个运动组就可以实现运动合成。给定运动组M,里面包含m个周期运动和1个非周期运动。首先运用时间变换的方法将周期运动的周期统一映射到[0,1]区间上。
在给定时刻t,需要虚拟人达到姿态p,被合成运动权重的计算方法如下:
(1)将时刻t转换为运动组中周期型运动在一个周期内的时刻t';
(2)计算每个周期运动在时刻t'的运动姿态ri;
(3)合成新运动的问题转化为公式(9)的最优化问题。
(9)
其中,z是指非周期运动的运动姿态。构造矩阵A=[r1r2…rmz],则上述问题可以通过计算α=A-·p求解,其中A-为A的伪逆矩阵,α=[α1α2…αmα]为权重组成的列向量。通过求解伪逆矩阵方程可以求得单个运动的权重。
如果被合成的运动中包含多个非周期运动,则构建多个运动组M1,M2,…,Mn,然后给每个运动组再设定一个组权重βn,则最优化公式可表示公式(10)。
(10)
将公式(10)进行化简后,按照相同的方法求解伪逆矩阵方程可以得到被合成运动的权重。其中每个周期型运动的权重值是所有运动组中运动权重值的和。即第i个运动帧参数的最终权重为:(β1+β2+…+βn)αi。以上通过构建运动组和伪逆矩阵方程,基于特定的关键帧姿态求解被合成运动的权重,达到了实时计算权重的目的。
Unity是一个跨平台的3D游戏开发工具,可以非常方便地导入3D模型。在Unity中,脚本主要用来定义用户在系统中的行为,通过脚本编程可实现虚拟人模型的各种动作。在本次编程实验中,主要用到两个类。一个是表示对象位置的类Transform,里面包含对象的位置参数、旋转参数以及大小参数等。另外一个是在插值求解时,要用到Unity里的矩阵运算类Quaternion(即四元数),四元数能够简化旋转矩阵在计算旋转时繁琐的运算,同时又避免了欧拉角的万向节锁问题。
在进行步行运动到跑步运动切换时,选择公式(7)的过渡函数,在虚拟人运动过程中,权重随时间帧线性变化。图3和图4给出了虚拟人步行运动与跑步运动切换的实验效果图。根据实验结果可知,当虚拟人在步行运动和跑步运动之间切换时,除了腿部运动关节坐标发生改变外,虚拟人上体的运动关节坐标也发生了明显改变,虚拟人的身体在跑步运动时相对于步行运动有更大的倾斜度。因此,这种变化仅仅依靠单纯的运动编辑是无法实现的,必须结合切换前后两个动作的运动姿态依靠运动融合方法才能得到准确的虚拟人运动姿态。在作战仿真系统中,虚拟士兵经常需要在多种动作之间进行切换,此方法不仅可以应用到步行运动和跑步运动之间,还可以应用到任意两种动作的切换,比如跑步中的跳跃、射击等。
图3 步行运动到跑步运动切换的实验效果
图4 跑步运动到步行运动切换的实验效果
以虚拟士兵为例,在进行运动合成仿真时,共选择5个基础动作,分别是:步行、跑步、射击、瞄准、休息(静止)。其中每个动作又可分为不同的运行状态,比如步行动作可分为:朝前(WalkForward)、朝后(WalkBackward)、朝左(WalkStrafeLeft)、朝右(WalkStrafeRight)、正常先进(WalkIdle)、快步前进(WalkRun)等。图5给出了运动合成的权重图,左半部分表明当虚拟人开始步行运动时,步行运动的权重从0逐渐增加到1,即从静止状态到完全的步行状态中间有一个过程,比较符合真实人的运动情况。如图5左半图所示的时刻,虚拟人从静止状态开始前进,第一只脚刚刚抬起还未放下时,此刻步行朝前(WalkForward)的权重为0.651,休息动作(Idle1)的权重为0.349。右半部分表明虚拟人在步行运动和跑步运动之间切换时,在有环境约束的情况下(即台阶引起的地面高度变化),两个运动的权重是此消彼长的过程。如图5右半图所示的时刻,在交互者控制运动时,虚拟人左脚的目标位置已经确定,要快速登上台阶,此刻步行朝前(WalkForward)的权重为0.425,跑步朝前(RunForward)的权重为0.567,跑步朝左(RunStrafeLeft)的权重为0.008(说明此刻虚拟人有朝左运动的趋势)。
需要说明的是,各个动作的权重受交互者的控制而实时变化,动作权重根据虚拟人的目标运行位置和关键关节的坐标信息(通过逆向运动学求得),按照3.2.2节的矩阵方程求得,与虚拟人当前的运动姿态没有直接关系。运动融合技术从本质上来讲是对运动编辑技术的延伸,根据以上实验结果可知,当虚拟人根据时空约束需要做出新动作时,如果依靠调整单个动作(即运动编辑)不能完成时,就必须通过实时计算运动权重进行多个动作的合成来完成这个新动作。因此,在开发虚拟人仿真系统时,一般将这两种技术结合使用,根据时空约束的复杂程度选择合适的技术实现虚拟人丰富多彩的运动。
针对虚拟人多个运动的合成问题,提出了一种基于实时权重相加的运动融合技术。首先,通过时间变换和设定运动过渡函数,在过渡时间内对虚拟人的运动姿态进行重新编辑,实现了步行运动到跑步运动的切换。其次,重点对基于实时权重的运动合成方法进行研究,提出了一种实时权重的计算方法,基于虚拟人的关键帧姿态实时求解被合成运动的权重,实现了多个运动的合成。但是在实验仿真时,构建的虚拟场景相对简单,在对提出的方法进行验证时,由于Unity平台的动画是基于脚本进行控制的,因此无法将运动过程中的相关数据保存分析,只满足了开发者视觉上的需求,没有一套完整的数据指标定量分析实验结果。尤其在构建复杂虚拟现实场景时,仅仅依靠视觉效果是无法满足开发者的各类需求的,必须给出一套参数用来衡量系统的优劣,在标准化方面有待进一步完善。