《武汉工程大学学报》  2016年05期 505-510   出版日期:2016-11-02   ISSN:1674-2869   CN:42-1779/TQ
基于四元数插值的虚拟人运动建模及实现


1 引 言近年来计算机性能逐步提高,计算机图形学和计算机视觉等领域的理论研究取得重大突破,虚拟现实技术的发展也上了一个新的台阶,三维人物动画是虚拟现实中重要的组成部分,在影视、游戏娱乐、医疗、航天事业,建筑仿真等多个领域的应用越来越广泛. 针对以上现状,提出对虚拟人运动的研究. 三维人物动画制作中最关键的技术是人体建模技术和运动控制技术[1] ,本文是基于D-H机器人表示方法[2],建立人体的骨架模型,基于四元数插值理论,建立人体行走模型,并利用OpenGL编程技术,实现人体行走过程的可视化. 关键帧动画中,一个刚性物体的运动其实就是一个旋转运动和平移运动的复合运动,可以表示为一个旋转矩阵和一个平移向量,旋转矩阵用来确定物体的朝向,平移向量确定物体的位置,然后根据物体在各关键帧处的状态通过插值来实现它的运动. 在计算机动画领域,国内从事相关技术的研究人员不断增加,《中国图形图像学报》、《计算机辅助设计与图形学报》等国内学术期刊以及Chinagraph等国内学术会议都为国内研究开发人员提供了很好的交流机会,浙江大学的CAD&CG国家重点实验室更是在这一领域起着重要带头作用[3]. 中国科学院的王兆其等人做了大量关于运动生成和控制、人体行为交互等方面的研究,应用人体运动合成技术实现了人体行为交互的主要工作,并利用其研究成果在聋哑人手语交互、人体行走等方面做了大量应用[4]. 在国外,由蒙特利尔大学Thalmann领导的LIG实验室是在研究人体动画领域里的一支比较著名的团队. LIG实验室主要从事运动控制系统、运动捕获[5]、人体平衡控制、人体建模及变形[6]、人的动作[7]、基于网络的人体运动以及碰撞检测技术等方面的研究. 2 四元数理论2.1 线性插值对于两个四元数[q1],[q2]其线性插值方程为[q(t)=q1+t ? (q2-q1)] [(0t1)]其中[t]为插值变量,当[t]从0变化到1时,即可实现从[q1]到[q2]的变化. 在虚拟人运动动画中,对应于从一帧到另一帧的过渡. 2.2 球面插值对于两个四元数[q1],[q2],其球面插值方程为[q(t)=sin(1-t)θsinθq1+sin(1-t)θsinθq2] [(0t1)]其中t为插值变量,[θ]为[q1]、[q2]之间的夹角,[cosθ=dot(q1,q2)],这里需要指出的是,计算夹角余弦值时[q1],[q2]需化成单位四元数. 2.3 四元数与欧拉角的转换设绕x,y,z轴旋转的欧拉角分别为[θ1,θ2,θ3],对应的四元数为[qθ1,qθ2,qθ3],由式[Rq(P)=pqp-1]对应的四元数为[8] [q=qθ1qθ2qθ3=cosθ32,0,0,sinθ32][cosθ22,0,sinθ22,0cosθ12,sinθ12,0,0]令单位四元数[q=cosθ2,nsinθ2=[s,(a,b,c)]]则有:[s=cosθ12cosθ22cosθ32-sinθ12sinθ22sinθ32][a=cosθ12cosθ22sinθ32+sinθ12sinθ22cosθ32][b=cosθ12cosθ22cosθ32+sinθ12cosθ22sinθ32][c=sinθ12cosθ22cosθ32+cosθ12sinθ22sinθ32]3 虚拟人运动建模在虚拟人动画中,认为骨骼在运动中不发生形变,即把人体当做是刚体. 但是人体与多刚体系统又有很大区别,人体的骨骼之间都受到关节的连带约束,而且每个关节的旋转范围都受到一定的约束,由此人体的建模方法有别于一般的物体. 3.1 人体骨架模型由于本文主要研究的是虚拟人行走时使用四元数做旋转插值生成动作,考虑的主要是虚拟人的行走的过程中骨骼在关节位置的旋转,不注重人体绘制是否逼真,所以为了简化绘制工作,直接将人体所有的部分使用相应大小的立方体代替. 简化的人体模型如图1 所示. 整个人体是由骨骼和关节交替形成,关节是骨骼的旋转点,而且父关节的转动会带动子骨骼的转动,也会带动子关节的转动,总而言之,就是整个人体骨架系统是有层次的,其实这种方法是 D-H 方法的简化版. 3.2 关节空间相对位置的计算首先是对人体的每个关节空间的局部坐标系进行定义:坐标原点都是关节点,坐标系建立在每个关节处,规定坐标轴在人体初始状态的时候,X轴正方向向左,Y轴正方向向上,Z轴正方向向前,可以看得出初始状态的时候他们的坐标轴都是同世界坐标系的坐标轴平行的. 设关节点i和i+1,相邻关节空间转化过程如图2所示[9]. 首先,将i+1关节空间的坐标原点即关节点平移到关节点i的位置,这一过程记为trans(i,i+1)-1, 这个时候相邻的两个关节空间的坐标原点重合.然后将关节i+1的坐标系左旋转使其和关节i的坐标空间的坐标轴平行,这个过程记为rotate(i,i+1)-1,这时两个坐标系实际上是重合的.这个变换坐标系的过程没有改变点的位置,所以关节空间i+1中的点要做这个过程的逆过程,先做rotate(i)旋转,再做trans(i,i+1)的平移,这个过程用矩阵[Ti+1i]表示如下:[Ti+1i]=trans(i,i+1)rotate(i)3.3 骨骼和关节的连接结构人体骨架系统是由骨骼和关节相互连接组成的,骨骼和关节之间使用指针链接,而且这个链接是有序的,关节所指向的骨骼的转动是被关节控制的,骨骼所指向的关节是依附在该骨骼上的,整个人体的关节链接顺序如图3所示[10]. 在图中有一个root关节,这个关节是附加的,但这个关节在计算世界坐标和关节空间的相对坐标的转换时很重要,如果将人体行走的过程看作人体的中心高度不变,那么可认为世界坐标是关节0的坐标空间,这里的人体中心root就是关节1,root关节自然成为人体其他关节空间和世界坐标转换的桥梁. 一般来说这个root关节可以设置到人体的任何位置,但是最好的位置是世界坐标中不动的点或者是一个简单运动的点. 3.4 运动模型行走是人类最基本的运动之一,也是描述虚拟人所不可缺少的. 在设计虚拟运动系统时,考虑建立基于关键帧的虚拟人行走动画,并且对这个人体有一定的可控制性,比如控制行走的速度、方向. 正是基于这样的思考,关注于设计一个可生成水平面上直线,运动的虚拟人运动系统,并且尽量保证运动的实时性、连续性和真实性. 走路的姿势可分解成开始抬左手迈右腿向后挥右手,当右腿落地后收回左手,挥右手,左腿向前几个过程,这是一个循环且重复的过程,也意味着制作出一套最小的循环动作即可. 不考虑外界的干扰,人体运动可以简化成骨骼在关节处做相对旋转,知道人体的一个端点在世界坐标系中的位置,整个人体的其他部分就可以通过计算得到它在世界坐标系中的位置. 人体行走除了自身的关节之间的旋转,还有自身的平移运动,这个效果可以通过控制移动速度来实现. 研究表明,在正常行走速度下,几乎所有“行走运动时刻”都具有固定的区间值. 人体的平行移动是依靠每次单脚着地,以那只脚为旋转点,以臀关节的高度为半径,以一个角度为[θ]的角度做旋转,然后再以另一只脚,以同样的方式做旋转运动,这种过程才导致了整个身体的平行移动,如图4所示. 人体移动的速度V,一步最大距离[DC]和完成一个周期的基本运动时间[TC]之间的计算公式如下[11]:[V=DCTC][DC=H(sin(θmax)+sin(θmin))]其中H表示LHip(RHip)关节到LAnkle(RAnkle)关节的距离,[θmin]表示lupperleg骨骼与人体中心垂直向下直线的最小夹角,[θmax]表示Rupperleg骨骼与人体中心垂直向下直线的最大夹角.人体行走可认为人体的中心高度一直没变,那么就以人体的中心作为第 1 个关节,而世界坐标空间当做是第0个关节的坐标空间,当然这是虚拟的,方便人体更好的映射到世界坐标系中,现做如下假设,人体行走的平面在 XOY 平面, 头顶的方向是 Z 轴的正方向. 在第 1 个关节的关节空间是这样定义的,同样是以头顶为 Z 轴的正方向,前方是 Y 轴正方向,左边是 X 轴的正方向. 这样人体中第i个关节空间的点可以很方便地转换到世界坐标系中,设关节i中的曲线[q′t(t)],[qi(t)]是世界坐标系中表示的曲线[12] ,转化公式如下:[qi(t)=T1iq′t(t)+q1(t)]如果人体是做直线运动那么曲线[q1(t)=] [q1(0)+vt]. 4 基于四元数插值的虚拟人运动模型的实现4.1 选取关键帧关键帧是物体运动或变化中的关键动作所处的那一帧,是运动状态即将改变的临界点,如手臂挥手的过程当手臂挥到最大的幅度的时候,如果不把最大值的位置作为关键帧,使用插值算法是不可能计算出一个位置大于插值端点的值,就不能很好地模拟人行走的运动. 关键帧中记录的是在某个时刻人体的所有关节的角位移,从这一帧到下一帧过渡过程持续的时间等. 考虑到程序可能需要对关键帧的一些值反复测试,不适合固化到程序里面,所以关键帧的信息是存放在xml 格式文件中,然后程序在初始化的时候读取关键帧的信息构造关键帧对象. 使用 xml 格式很显然可读性更强,而且这些数据的组织方式和与模型的结构是一致的. 4.2 生成中间帧虽然给出了人体模型,以及人体骨骼和关节的组织方式,但还是不能让模型动起来,还需要给出关键帧和在关键帧之间插值算法. 常用的四元数插值方法有线性插值、球面线性插值和样条插值等,针对不同的情形采用不同的插值算法,使人体行走看起来连贯、平滑. 本文中除neckbase和root关节采用线性插值外,由于其它关节涉及到的都是关节的旋转,所以插值是旋转插值. 根据上面的分析人体的行走过程是一个循环,只需要得到一个运动周期的关键帧信息就可以了. 中间帧中的关节角可由关键帧中关节角通过插值而得. 在表示关节的旋转时是用欧拉角表示的,欧拉角表示起来比四元数简单,而且更容易看出虚拟人在运动过程中各关节的角度变化. 但是如果采用欧拉角插值的方法,会产生病态现象[15],因为欧拉角的3个角度没有直接关系. 为了避免这种问题的出现,可以在插值前将欧拉角转化成四元数,再采用四元数方法完成插值,这样就可以生成一系列的中间帧,形成一个动态的过程,即动画. 5 实验结果及分析在Visual Studio 2013环境下,利用OpenGL图形库可视化编程,实现基于四元数插值的虚拟人行走动画. 如图5所示,给出了由给定关键帧生成中间帧的截图,实验表明,生成的中间帧过渡自然,较好的模拟了人体行走过程. 该方法可以和运动学方法相结合来实现虚拟人的运动控制,也可以用于三维动画制作. 在基于四元数插值的虚拟人行走模型的基础上,修改关键帧中的各关节的角位移信息,可得到虚拟人跑动过程动画,如图6所示. 可以看出,该模型较好的模拟了虚拟人跑动过程,该算法框架具有通用性. 6 结 语以上介绍的基于四元数插值虚拟人运动模型,实现了由给定关键帧生成中间帧的方法,且生成的中间帧过渡平滑. 但本文中虚拟人的运动是简单的直线运动,只能进行简单的向左向右转向. 本文以人体的中心作为根节点来连接人体各关节,人体的重心高度保持不变,不能模拟人体起跳过程等,利用逆运动学方法模拟虚拟人运动和模拟复杂运动将是下一步的研究工作.