APP下载

基于Kinect的虚拟FTG游戏的设计

2018-01-18刘晋钢刘云萍周晓青

数字技术与应用 2018年9期

刘晋钢 刘云萍 周晓青

摘要:本文将Kinect作为游戏的控制器,以Unity作为FTG游戏的引擎,在Visual Studio 2013平台下,使用WPF和KinectSDK作为的开发工具,在虚拟格斗类游戏中的数据传输采用UDP和TCP协议。功能测试和性能测试表明骨骼数据驱动模型合理,Kinect成为游戏的控制器这种方案可行。

关键词:体感设备;格斗类游戏;Unity

中图分类号:TP391.41 文献标识码:A 文章编号:1007-9416(2018)09-0149-03

1 引言

Kinect设计之初是作为XBOX360的体感设备,针对游戏领域而开发的。但是在2011年Kinect for Windows的推出和代码的开源使得程序员可以选择C#、C++、VB.NET等多种语言进行开发。因此吸引了大批的程序开发人员针对Kinect开发。也正因为如此,使它不再局限于游戏领域,而延伸到工业设计、电子商务、医疗保健、物联网、智能家庭、教育和照顾老人等各个领域[1]。

Kinect的核心技术和创新技术是能够获取目标物体的深度数据和人体的骨骼数据,如今Kinect主要被用于识别手势、四肢动作、人体检测等方面,在国内很多大学实验室和一些交互公司也在很多领域做了不少Kinect的应用开发和研究。比如在市场上已经应用的虚拟试衣镜,就是应用了的体感技术和增强现实技术,需要买衣服的顾客不需要实体试穿和换装,只需站在试衣镜前通过手势操作就能看到虚拟的衣服穿在身上的效果。体感虚拟试衣间操作更方便、交互更加自然,从而能给用户带来全新的购衣体验[2]。

在明尼苏达大学儿童发展研究所,研究人员借Kinect收集和追踪儿童的语音和行为特征,开展自闭症谱系障碍(ASD)研究。日本知名的机器人制造商安川机电(Yaskawa),在服务机器人Smartpal上安装Kinect,成功研制出Smartpal VII机器人。华南理工大学的金连文教授也利用体感技术开发了虚拟手写识别系统,用户只要在空间中用手指自由的移动,系统就能识别出书写的字符。随着Kinect的应用越广泛,加上无数开发者的智慧,在不久的将来Kinect必定会与我们的学习、生活更密切相关,在越来越多的领域也会出现Kinect的身影[3-4]。

FTG指格斗类游戏。FTG类游戏是从ACT动作类游戏脱胎分化出来的,由玩家操纵各种角色与电脑或另一玩家所控制的角色进行一对一决斗的游戏。一直以来,由于输入设备发展的缓慢,使得市面上的几乎所有FTG游戏都使用键盘加鼠标的方式进行游戏,例如著名的《街霸》系列、《侍魂》系列、《拳皇》系列等;3D格斗游戏如《铁拳》、《VR战士》等。由于Kinect设备的种种特性,使得其就像是为FTG游戏量身定做的一样,可以使游戏的操作更方便交互、更自然,从而能给用户带来全新的游戏体验。

2 关键技术

2.1 Kinect与Unity3D集成原理

Kinect的设计思想是将人视为控制器。在Kinect For Windows面世后,基于它的游戏和应用在发布会上出现,已引起人们广泛关注。人们体会到自然交互语言的强大震撼力。随着游戏的升级,高效的游戏开发工具也成为开发者的期盼,而Unity3D高效率的开发模块、强大的渲染效果及可扩展的能力,使Unity3D赢得了开发者的青睐,在2012年成为最受欢迎的游戏开发引擎,尤其在处理三维场景的编辑和交互方面,使用基于脚本的开发方式简单又方便。但是Unity3D这种高效开发与体感硬件Kinect并不兼容。因为Kinect SDK对开发者开放的接口调用方式有兩种,一种是基于C++的头文件和静态链接库的方式,另一种是程序集的方式。这两种方式在Unity3D中均无法直接调用。尽管如此,在C# Mono平台中提供与非托管程序的使用方式,导入Dll文件,用户可通过自定义数据结构和算法,能够实现对Kinect中获得的数据重新组织,即可以在Unity 3D中使用,在开发时,编写中间件来请求Kinect服务,并将数据传输给Unity实例[5]。

2.2 骨骼数据驱动模型

Kinect与Unity运行平台的差异性,Kinect需要的运行环境最低.NET4.0,而Unity脚本支持的运行环境最高是.NET3.5。又因为Kinect数据是一帧一帧的传输过来的,而且数据具有时效性,因此使用效率较高的UDP协议传送Kinect数据。由于Kinect骨骼数据是关节的坐标数据,而且在Kinect1.0版本下并不能使用关节角度信息,因此需要建立骨骼数据驱动模型,使用骨骼位置直接驱动骨骼数据。再动态计算部分角度,使用模型驱动方式。

3 系统分析与设计

3.1 系统分析

该系统将使用Unity游戏引擎设计并实现一个简易FTG游戏。该游戏将有良好的交互界面,有明确的逻辑顺序,可以双人对战。

另外,该系统使用Kinect SDK与WPF开发Kinect数据接收器,将数据通过UDP,TCP发送到FTG游戏,使得FTG游戏可以利用Kinect的骨骼数据,以通过肢体动作控制游戏。

本系统可由游戏核心模块、Kinect管理器和网络输入服务器三大部分组成。用户作为客户端调用Kinect管理器,从而页获取Kinect设备中的颜色数据,场景深度数据,骨骼数据;还需要使用ROC远程对象传输协议将数据发送到游戏模块。游戏模块通过ROC远程对象传输协议接收数据,并应用于游戏模块的对战逻辑。

系统由三大部分组成。但作为一款格斗类游戏,又可以将其分为网络输入客户端和游戏端。在网络输入客户端的功能:首先,使用UDP、TCP协议与FTG游戏建立连接,以传输数据。接下来,Kinect SDK获取Kinect设备的颜色数据,深度数据,骨骼数据。最后,将采集来的骨骼数据发送到游戏,以驱动游戏的角色动作,游戏更新。在游戏端部分实现的功能有:接收并处理来自输入客户端和网络端来的输入消息;分类转发骨骼帧数据;驱动角色模型运动(包适坐标转化、平移转化、镜像转化等处理)和关联游戏模型运动,实现战斗功能。系统中格斗角色具有生命、怒气和技能三种属性。其中,生命为零,该角色死亡,玩家被告知格斗失败。怒气与技能相联系。若怒气达到设定某值后,其释放技能。反之,怒气不够,不足于释放其技能。技能是一些效果酷炫,游戏中用伤害报表来体现,若怒气值满足条件,可以使用技能。

3.2 数据采集

3.2.1 Kinect设备摆放位置

由于游戏需要人体的全身骨骼数据作为输入数据,因此需要对Kinect摆放位置以及Player活动区域进行控制,经过反复计算和多角度测试,获知Kinect摆放到Player正前方1米高度处。Player的活动范围距离Kinect设备2米到4米处,在距Kinect左右各一米处,一个Player站左边,一个站右边。如图1所示。图中地形块为4*4(米)的区域,黄色区域和蓝色区域分别为2玩家的活动区域,中心红点为参考中心点。

3.2.2 Kinect数据采集

Kinect for Windows SDK支持主动获取和被动获取两种数据获取方式。主动获取方式是不断查询有没有新数据到来。如果有新数据,则可以取出数据,否则返回空。通过这种方式需要主动以轮询的方式去控制。获取数据更自由,但可能会额外消耗资源。被动获取是事件触发式,当有数据到来的时候调用相应回调函数,无数据的时候没有任何操作。通过实验验证两种数据获取方式,当选择被动获取数据,用事件触发式时,游戏性能降低,由于无法处理庞大的数据。因此设计师选用主动获取的方式,需要的时候去获取,因为系统默认的30帧数据,经过测试,每秒5帧基本可以使用,每秒10帧已经可以平滑过度,完全不需要多余的处理。系统采用主动获取数据方式比被动获取轮询方式,降低了系统压力,减少网络占用,更合理、更高效。

3.2.3 数据通信

由于Unity的.net平台与Kinect的兼容性问题,设计采用了跨进程的网络通信。数据发送时,将采集到的数据分装成NetInput Message的子类对象,再将该对象序列化为二进制数据。如果数据较大,超出了UDP所能携带的数据长度,就拆分成多个DataWrap对象,否则包装成一个DataWrap对象,将这些DataWrap对象分别序列化为二进制数据,并通过UDP或者TCP发送出去。在在接收端,不断的接收数据报,并将接收到的数据报数据反序列化为DataWrap对象,将这些对象收集起来,并进行合成处理,将提取出来的完整的数据反序列化为NetInputMessage的子类对象,触发相应事件,通知应用程序相关模块处理这些消息数据。其中,DataWrap分包主要涉及2个类,一个是DataWrap类,主要用于分装数据,拆分数据。另一个是DataWrapsCollector类,主要用于将DataWrap对象进行组装,还原数据。

3.3 游戏设计

3.3.1 游戏输入消息

游戏输入消息分为两大类。一类是以Kinect数据为主,另一类以语音数据为主。Kinect部分数据包括了Kinect的彩色摄像头采集的色彩数据,深度摄像头采集的景深数据,还有通过引擎对深度数据分析,计算出的骨骼数据。而语音数据部分包括识别出的语音命令,语音字符,以及语音识别相关参数。在本次系统开发时,语音识别数据未启用,在以后的继续开发设计中会使用到这些数据消息,故此保留语音数据类。在客户端接收到相应的消息之后,就会产生相应的事件,触发对应的功能模块去处理相应的消息,达到控制游戏运作的功能。

3.3.2 骨骼驱动

在3D动画的世界中,动画的驱动就是改变位置和方向。Kinect可以获取骨骼的位置坐标。使用骨骼坐标驱动游戏的模型是一种最简单有效的方案。如图2所示,每个基本对象都对应Kinect的一个骨骼位置,共20个。

本设计直接使用骨骼位置驱动关键坐标,同时使用脚本计算出其他相关部分的位置、方向和大小。如图3所示,每個关节位置(圆球)之间的圆柱通过2个相关关节位置计算出方向和位置。

将模型块安置到骨骼点上,实现模型驱动。取一个模型,使用三维建模工具将模型的头、身体、手和腿等部位分割为单个模型,将这些单独的模型分别提取出来,导入到Unity游戏引擎中。再取出模型,将其安置到圆柱体上,进行一定的位置平移,角度旋转的调整,这样,就做好随着骨骼关节运动的人物模型。

3.3.3 游戏对战设计

在系统分析时,提到格斗角色生命、怒气和技能三种属性,当进入游戏对战时,再为角色加入打击点和承受点,如图4玩家战斗系统所示。图4左边4个红色的小球分别是绑定到该角色四肢末端的4个打击点,右边的绿色的球体是角色头部的承受点,而绿色立方体是角色身体部位的承受点。当游戏运行起来以后,这些碰撞球就将与其相应部位保持位置相同。

4 测试

本系统设计硬件依赖度高,故选取Serialization和DataWrap两个较独立的类进行功能测试,选用数组、字符串,长数据、布尔类型数据作为输入,实验结果与期望结果完全吻合,功能实现正常。

在性能测试时,还是选用Serialization和DataWrap两个类进行测试。选用数组和长数组类型数据,采用序列化和反序列化操作时,实测性能都不足1毫秒,比期望性能的2毫秒提高了很多,性能极高。完全可以满足游戏需要。

5 结语

系统实现了Kinect体感设备采集数据、ROC数据传输、骨关节三维模型驱动重要模块。通过这些模块,实现FTG(格斗类游戏)的人体体感控制,针对格斗类游戏特征分析,为游戏角色引入生命、怒气、技能三种重要属性。当游戏角色进入战斗时,明确身体的承受点。用不同类型的数据,通过功能测试,实验结果与期望结果完全吻合。在性能测试时,采用序列化和反序列化操作时,实测性能远远高于期望性能。本课题达到了预期效果,人机交互界面良好,在用于体感游戏开发,可降低开发成本,具有一定的社会推广价值。

参考文献

[1]朱涛,金国栋,芦利斌.Kinect应用概述及发展前[J].现代计算机,2013,(6):8-11.

[2]况鹰.基于Kinect运动捕获的三维虚拟试衣[D].广州:华南理工大学,2012.

[3]马建荣,章苏静,李凤.基于体感技术的亲子互动游戏设计与实现[J].中国电化教育,2012,09:85-88.

[4]马荟.连接未来的人机交互[J].互联网周刊,2010,(7):64-66.

[5]刘晋钢,刘卫斌,刘晋霞. Kinect 与Unity3D 数据整合技术在体感游戏中的应用研究[J]电脑开发与应用,2014,(11):7-11.