徐涛 黄贤立 严霞 林瓅
摘 要:随着计算机的飞速发展,自然的图形用户界面应运而生,结合微软推出的体感设备Kinect,以及游戏引擎Unity3D,可以快速搭建实验环境。通过脚本定义投篮手势识别算法,完成投篮手势的识别,并利用算法算出篮球抛出时的初速度,交给Unity3D的物理引擎计算出篮球的运动轨迹,从而完成整个虚拟的投篮过程。
关键词:Kinect;体感;手势识别;Unity3D;投篮系统
DOI:10.16640/j.cnki.37-1222/t.2016.08.266
0 引言
根据冯·诺依曼(John von Neumann,1903~1957)的计算机体系结构,计算机分为五大部分——运算器、控制器、存储器、输入设备、输出设备。现在大多数计算机仍是冯·诺依曼计算机的组织结构,只是做了一些改进而已,并没有从根本上突破冯·诺依曼体系结构的束缚。对于计算机的研究和使用人员来说,计算机的发展最终需要解决的问题就是输入和输出的问题。如何对计算机进行高效准确的输入,以及如何让计算机通过算法,进行准确的计算,输出人们想要的结果,一直是计算机研究的一个重要课题。
随着计算机的发展,自然的用户界面(NUI) 随之出现。相对于传统的用户输入方式——鼠标键盘,自然的用户界面显得更加人性化。比如语音输入,手势识别等。显然,自然的用户界面更加符合人们的行为习惯。自然的用户界面更加健康,它可以让对计算机的输入变成与一个人的交流,让用户可以有更加身临其境的感觉。
1 现实生活中体感手势的运用
人们在日常的交际中,经常会用到一些手势,来使得对问题的表述更加具有表现力。这些手势不仅仅只是手指的动作,也不能理解为手部的动作。手势是一个广泛的概念,它包含了有含义、有意义的肢体动作。这也就是说,一个踢腿的动作,也可以被定义为手势。敲击键盘不是一个手势,因为手指快速的按下某一个按键既不容易被观察到,也不能直观地表达其含义。
然而,手势不只是用在交际表达中,人们在日常的生活中,也无处不用到手势。例如,在拧开饮料瓶盖的时候,需要用手握紧瓶盖,另一只抓紧瓶身,通过手腕、手臂的共同协作,完成拧下瓶盖的动作。拧下瓶盖的动作,就是一个手势。我们可以忽略在完成这些动作过程中所使用到、接触到的实际存在的物体,而把注意力转移到肢体本身。假设物体并不存在的,让你笔画着空气来完成一个拧瓶盖的动作,让另外一个人去猜你现在正在做的动作,是否他一眼就能看出你正在演示拧瓶盖的动作呢?
2 基于Kinect体感设备的篮球系统
2.1 手势的识别
如果“猜”出你所做手势的是一台计算机,那么就涉及到计算机的手势识别技术。让计算机去完成一个手势的识别、判断是非常困难的。首先,我们要设法获取人体的相关信息,这涉及到图形、图像识别技术、深度数据挖掘技术。通过微软研制的Kinect,其摄像头在收集了人体的视频信息之后,通过算法的处理,可以把人的肢体信息凝练为20个骨骼节点。它可以准确标定人体的这20个关键点,并对这20个点的位置进行实时追踪。在程序及算法设计中,人的肢体运动,会使得身体各个骨骼节点的三维坐标值发生改变。通过设置合理的数值,当骨骼节点的坐标差值超过某个设定值的时候,触发某一个状态位或一系列状态位的改变,从而完成一个手势或者一系列手势的判定。例如,完成一个完整的投篮手势,需要先抬起手臂。以右手为例,抬起右手意味着右手腕节点的y坐标值超过了右肩膀节点的y坐标值,也就是实际空间中的右手高度,高于右肩膀高度。此时,应该触发抬手状态位的改变,告诉系统,投掷者的手臂已经抬起,准备进行下一步的判断与计算。
当然,在手臂放下之后,要把抬手状态位还原,告诉系统,投掷者的手臂已经放下,不能继续进行投掷算法,不然系统会出现错误投掷判断。由此,抬手状态的触发就相当于投掷算法的第一个开关,整个投篮手势也是由一系列手势构成的。
2.2 运动轨迹的计算
篮球在空间中的运动,是一个球体的物理运动,需要物理引擎来提供物理算法,通常的游戏引擎都会带有物理引擎,我们使用Unity3D游戏引擎中的物理引擎,来完成篮球运动轨迹的计算。这样,我们只需要把篮球被抛出时的方向和速度提供给物理引擎,就可以完成篮球运动轨迹的计算了。
现实中,人完成投篮动作,就是给篮球一个加速度。通过手部用力,让篮球和手拥有相同的速度。当手部停止加速,开始减速,篮球也就不再加速,并且脱离手部,不再和手有接触。篮球拥有了初始速度,就开始抛物运动。这里我们忽略空气阻力的作用。在三维空间中,需要把加速度及速度分解到相互垂直的三個方向上,也就是三维坐标系中,计算三个方向上的加速度,最终提交给Unity3D的物理引擎,形成一个和速度进行计算。手部三个方向上的加速度,可以通过速度计算公式获得。Kinect提供给我们每秒30帧的骨骼节点三维坐标位置变化,一个方向上坐标的差值除以时间,就可以得到此方向上的速度,进一步就可以得到此方向上的加速度。
2.3 模型的构建
最后,我们在Unity3D中创建场景,添加篮球架的模型,并添加脚本判断篮球是否投进,进行计分,并给篮球和篮框添加碰撞器,当篮球碰触篮框时,进行碰撞的检测和碰撞结果的计算,模拟真实的投篮环境,构成一个完整的投篮系统。
参考文献:
[1]沈绪榜,刘泽响,王茹.计算机体系结构的统一模型[J].计算机学报,2007,30(05):731-736.
[2]张茫茫,傅红.基于实体用户界面与自然用户界面结合的产品设计[J].研究论文,2013,31(28):99-102.
[3]曹雏清,李瑞峰,赵立军.基于深度图像技术的手势识别方法[J].计算机工程,2012,38(08):16-21.
[4]朱惠娟.基于Unity3D的虚拟漫游系统[J].计算机系统应用,2012,21(10):36-40.
作者简介:徐涛(1993-),男,江苏人,本科,研究方向:物联网。