1. 引言
随着现代计算机科学的迅猛发展,通过虚拟现实(Virtual Reality)对现实生活场景的仿真成为当前研究的热点。在虚拟现实中,虚拟人可以到模拟的真实人无法到达或代价较高的现实环境中运动,减少了不必要的资源浪费和成本开销,因此虚拟人相关的技术在军事仿真、航天事业、教育培训、游戏娱乐等许多方面都得到了广泛的应用 [1] 。
由于虚拟人相关的的技术在各领域应用需求逐步增加,国内外许多的专家团队都开始研究各种虚拟人相关的技术。在国外,宾夕法尼亚大学Badler领导的人体建模与仿真中心是众多的团队中一个比较著名的研究团体,他们的研究包括参数化的关键帧技术在关节虚拟人的模型中的应用、逆向运动学的应用、人体的平衡研究、脊骨的建模、行走模型的建立、运动捕获的研究、人的冲突检测和纠正以及智能运动规划问题的研究等 [2] [3] [4] [5] ;国内在人体建模与运动控制方面,北京航空航航天大学、中国科学院、哈尔滨工业大学以及浙江大学等学校都做了大量的理论研究及实践工作,比如在人体建模方面,北京航空航天大学的袁修干等人主要在人机系统仿真中的三维人体建模方面进行了研究,在人体实时运动控制方面,哈尔滨工业大学的贺怀清、洪炳熔等人致力于人体实时运动控制,并实现了人体步行与跑步方式 [6] 。
本文考虑到在用矩阵和欧拉角表示虚拟人的运动时计算量大和自由度丢失等缺点,提出了四元数插值的方法来模拟虚拟人的运动,并对人体运动的多个动作特点进行分析和研究,建立了虚拟人的运动框架,在合理的设计好虚拟人的运动模型,就可以对虚拟人的动作进行模拟,从而丰富了虚拟人的基本运动形式。
2. 运动框架研究的基础
2.1. 四元数插值理论
四元数由一个实部
和三个虚部
组成,其表示形式如下所示:

式中
均为实数,复数部分的
是虚数单位,且
满足:
, 
,
。
一个四元数用一个标量和一个矢量描述,如下所示:

其中
。
两个四元数
的简单线性插值的运算表达式如下:
(2-1)
公式中t为插值变量,使用该参数来控制线性插值过程中速度的平滑过渡
两个四元数
的球面插值的运算表达式如下:
(2-2)
公式中t为插值变量,
为
之间的夹角,
,球面插值的结果在单位超球面上,可以保证从
变化到
时,是以恒定的角速度在球面上沿最短弧运动。
2.2. OpenGL图形库简介
本模板可直接用于论文及其文字的编排,有的页边距、行距、字体都严格符合规定,请勿修改!尤其是页边距,由于期刊在后期制作过程中需要在页眉、页脚添加各种信息,所以所有论文务必确保现有的页边距不被修改,页面空白不被占用。
OpenGL (Open Graphics Library)是一个用于三维图像的专业的图形程序接口。在OpenGL中提供了一组功能强大但又非常基本的渲染函数,所有的高级绘图都是建立在这些函数的基础上完成的。它们都在 OpenGL 的基本函数库中:
OpenGL工具函数库(GLU)
它包含了一些函数,利用底层的 OpenGL 函数来执行一些特定的任务,例如设置特定的矩形、多边形分格化以及表面渲染等。
OpenGL实用工具库(GLUT)
该库是一个独立于窗口系统的工具包,他的目的是隐藏不同的窗口系统API所带来的复杂性。
3. 虚拟人骨骼模型建立
为了模拟虚拟人的运动,首先要建立虚拟人的人体模型,在人体运动过程中,主要是人体各部分的骨骼和关节相互作用,从而产生人体的各种运动,因此,在研究虚拟人的运动时,将人体简化成骨骼和关节来表示。在人体骨骼模型中,把各个关节看成点,在实现过程中并没有实际表示出来,将关节之间的骨骼看成是链,可以通过绘出来的各个立方体来表示,再根据人体模型中关节与骨骼间运动连带关系,就可以将身体各部分链接起来,在链接过程中,骨骼所指向的关节依附在该骨骼上,而关节所指的骨骼的运动由关节来进行控制,骨骼模型下的关节骨骼链接如图1所示。
4. 虚拟人运动控制技术
在建立了虚拟人骨骼模型后,就需要建立虚拟人的运动控制模型,以便能够控制虚拟人进行运动。本文采用关键帧的方法来控制虚拟人运动,在该方法中,首先要根据人体运动的特点设计出虚拟人运动过程中的一系列重要动作的画面,这些画面被成为关键帧,然后在关键帧中间通过各种插值方法生成一系列的中间帧。不管关键帧还是插值得到的中间帧,都是对虚拟人空间运动姿态的描述,为了通过关键值插值实现对虚拟人的运动控制,就需要将人体运动姿态进行参数化,分析出各个关键动作的人体各关节相对于其所依附的骨骼旋转角度及相对位置,这样改变参数就可以对虚拟人不同动作进行模拟和控制 [7] 。

Figure 1. Connection diagram of joints and bones
图1. 关节和骨骼连接图
关键帧的数据中包含了骨骼模型中所定义的各关节的名称和角度以及一帧到下一帧的持续时间,通过修改时间可以控制虚拟人的运动速度。为了使虚拟人的运动更加平滑更加逼真,通常需要对关键帧的关节角度和时间等数据进行反复测试,这就要求在实现过程中方便修改关键帧的数据来改变具体的动作却不影响全局的实现,因此,将所需要的关键帧的数据存放到XML格式的文件中,然后在程序中对XML文件进行读取,获取所需的关键帧数据。
关键帧生成后,通过四元数插值的方法来生成中间帧。四元数线性插值较为简单可以用来实现虚拟人的躯干和头部的骨骼平移,在涉及到旋转角度较大的骨骼则采用四元数球面插值。球面插值的优点是在四维空间的单位球面上进行单位四元数的插值运算,使插值结果还在单位超球面上,这样控制的骨骼旋转运动是均匀旋转的,使得虚拟人骨骼旋转运动看上去更加平滑逼真。
5. 虚拟人的运动框架分析
人体的许多运动都是有规律的,一般情况下是由一系列周期的、循环往复的动作组成,因此,如果可以分析出虚拟人在一个时间周期内的运动片段,就可以通过关键值插值的方法生成连续的虚拟人运动序列。人体的许多运动是建立在行走运动之上的,因此行走运动是基本运动之一,为了更好地了解其他运动的特点,首先来分析虚拟人的行走模型。因为分析的结果要用来设置关键帧的数据,所以将人体的运动以关键帧的方式划分为以下几步:
第一步:虚拟人静止站立时个关节的角度为0。
第二步:虚拟人向前挥左手臂,迈出右脚,虽然此时左脚还没有踏出,但是左髋关节的角度的变化还是有的,它相对躯干是向后旋转的,所以角度值是负的,还有右肩关节、右膝关节以及右脚踝关节的角位移均是负值。
第三步:虚拟人向前挥左手臂,向后挥右手臂,迈出右脚,左脚还未踏出,与第三帧的区别是各个关节的角度变化比第二帧要大,这就是步骤间的关键帧,使运动看起来更加的平滑。
第四步:虚拟人向前挥左手臂,向后挥右手臂,右肘关节的角度为0,右脚落地,左脚后跟离地,脚尖未离地,右肩关节的角度为负值。
第五步:虚拟人恢复站立姿势,因此所有关节角度均为0。
第六步:虚拟人向前挥右手臂,向后挥左手臂,迈出左脚,右脚还未踏出。
第七步:虚拟人向前挥右手臂,向后挥左手臂,迈出左脚,左脚慢慢落地,右脚还未踏出,各关节对应的角度变化比第六帧的要大。
第八步:虚拟人向前挥右手臂,向后挥左手臂,此时左肘关节的角度为0,右肩关节的角度为负值,左脚落地,右脚后跟离地。
第九步:虚拟人恢复站立姿势,所有关节的角度值均为0。
上面的九步代表了虚拟人行走的一个周期,第一步到第五步为一个阶段,第六步到第九步为一个阶段,这两个阶段类似,对应的关节角度变化相同,只是正负值相反,在实验过程中反复调节关节角度值,使运动看起来更加自然平滑。
虚拟人的跑步模型与行走模型类似,只是运动周期,单脚支撑期,双脚支撑期,支撑周期在相同情况比行走模型要短 [8] ,而步距、步幅比行走模型要大,对应的各步的信息与行走类似,只是少了一步中间各关节角度恢复为0的一步。虚拟人的打招呼模型、拳击模型、跳跃模型均是在行走模型的基础上进行具体的关键帧设置,这里不再详细说明每个步骤的信息。
通过对虚拟人的各种动作进行分析,将得到的数据设置成对应的关键帧并存放到相应的XML文件中,通过改变程序中读取的XML文件名就可以控制虚拟人进行相应的动作,从而搭建起虚拟人的运动框架。
6. 虚拟人运动的实现
本实验主要是完成在大小可进行调整的输出窗口中,通过调用库函数来绘制虚拟人运动的空间,以不同的颜色来创造出空间感以显示虚拟人行走的地面和非地面。通过设置参数来绘制所想要的虚拟人,在Visual Studio 2013的输出界面中输出设置出控制虚拟人运动方向的快捷键,运行代码,通过快捷键来控制机器人的运动的方向。改变读取的XML文件,得到不同的虚拟人运动,实验结果如下图2~5所示。
7. 结束语
从实验结果可以看出,通过四元数插值模拟的虚拟人的各种运动具有较好的平滑性,只要设计好虚拟人运动的关键帧,就可以控制虚拟人进行相应的动作,说明建立的虚拟人运动框架具有可行性。
基金项目
武汉工程大学校长基金项目(230106);2015年省级大学生创新创业训练计划项目(201510490027)。