一种基于游戏引擎的4D体感交互系统技术方案说明书目录1引言 (1)1.1编写目的 (1)1.2背景 (1)2设计概述 (2)2.1任务和目标 (2)2.2需求概述 (2)2.3系统概述 (2)3系统详细设计分析 (3)3.1数据获取识别模块 (3)3.1.1彩色图形获取 (4)3.1.2深度图像获取 (4)3.1.3动作识别 (5)3.1.4语音识别 (7)3.2Unity3D接口控制 (7)3.2.1设备控制 (8)3.2.2场景显示控制 (8)3.2.3骨骼跟踪绑定 (9)3.2.4近景模式绑定 (10)3.2.5平滑处理 (10)3.2.6特效事件处理 (10)5总体方案确认 (11)5.1系统总体结构图 (11)5.2系统总体功能图 (12)5.3系统总体流程图 (12)5.4系统硬件组成图 (13)5.5系统开发工具 (14)5.5.1Kinect开发平台 (14)5.5.2Kinect系统架构 (15)5.5.3Kinect SDK (15)5.5.4Unity3D开发工具 (16)1引言1.1编写目的本文提供一种基于游戏引擎的4D体感交互系统技术方案的说明。
本系统包括安装有游戏引擎的计算机、体感装置、力反馈发生装置、特效发生装置等。
利用Kinect体感器替代传统游戏的输入外设,克服了对鼠标、键盘或游戏手柄等操作装置的依赖,同时增加了震动和特效反馈装置,将游戏的声音、碰撞等4D特效更加真实地展示,增添体感交互的真实性、带入性;同时削弱了游戏对人体的生理、心理伤害。
1.2背景游戏产业作为一门新兴的娱乐产业,已经在世界范围内得到迅猛的发展,游戏的形式也越来越丰富,作为其中之一的体感游戏逐渐受到人们的关注。
体感游戏一出现就颠覆了游戏单调的操作,使得人机互动的模式展现得更完美。
玩家进行游戏时,对游戏的操控性与游戏的代入感的要求也逐渐提高,体感游戏作为一种依托于新技术的游戏,不需要外置的游戏控制器,凭借其操控性以及可玩性得到越来越多的玩家欢迎。
目前,在国内外已经开发的游戏种类很多,但是还没有使用游戏引擎开发过基于游戏引擎的4D体感交互游戏的支持,各别公司也仅仅是提供了一些游戏的展示效果,体感交互系统的开发还十分不成熟。
同时,由于体感交互系统不需要外置的游戏控制器,即克服了对鼠标、键盘或游戏手柄等操作装置的依赖,可以减轻因为长时间的鼠标、键盘操作引起的一些生理伤害。
如何既能做到放松的娱乐,又能兼顾玩家的生理健康变成为当前发展的新的方向。
本文提出的基于游戏引擎的4D体感交互系统,旨在为未来4D体感游戏的开发提供最新的研究方向,为研究体感游戏的开发者提供研究资料和成果,推动体感游戏在国内的发展,具有创新以及借鉴参考的意义。
2设计概述2.1任务和目标本文研究基于游戏引擎的4D体感交互系统的开发。
采用Unity3d 作为游戏引擎进行跨平台体感游戏开发,同时利用Microsoft Kinect SDK的重要工具包,实现4D体感交互。
本文在分析 Unity3d 的对外通信接口以及 Unity3d 插件的基础上,针对当前微软提供的 Kinect 体感设备,类比了 OpenNI中的一些体感游戏实现的常规方法,使用 Unity3d 作为游戏引擎, Microsoft Kinect SDK 以及 OpenNI 作为开发工具进行体感游戏开发,实现基于游戏引擎的4D体感交互系统的设计开发。
2.2需求概述基于游戏引擎的4D体感交互系统需要具有场景展示、即时动态捕捉功能、影像识别功能、语音识别功能、事件控制、特效控制功能等。
场景展示:游戏场景显示即时动态捕捉功能:即时识别人体动作影像识别功能:识别人体静态影像如手势等语音识别功能:识别人声功能事件控制:游戏引擎识别输入信号并转成相应事件进行控制特效控制功能:控制如风、光、风、振动等4D特效功能2.3系统概述基于游戏引擎的4D体感交互系统,包括计算机、Kinect体感装置、力反馈发生装置、特效发生装置,计算机中安装有unity3D游戏引擎,游戏引擎加载有将接收数据转化为符合规范数据的游戏引擎数据接口单元和用于存储事件的数据库服务器单元;Kinect体感装置与计算机通过总线接口连接;力反馈发生装置和特效发生装置与计算机通过信号线连接。
利用Kinect体感器替代传统游戏的输入外设,克服了对鼠标、键盘或游戏手柄等操作装置的依赖,同时增加了震动和特效反馈装置,将游戏的声音、碰撞、风、灯光等特效更加真实地展示。
设计分为Unity3D场景展示模块、Unity3D的接口模块、Kinect的数据获取以及特效反馈四个模块。
其中Unity3D接口模块实现了的场景设置、骨骼绑定、镜像运动、近景模式、平滑处理及特效反馈的控制;Kinect数据获取模块通过代码实现设备控制、骨骼绑定算法、设备图像获取。
系统模块组成图如下:图2-1 系统模块组成图3系统详细设计分析3.1数据获取识别模块本系统采用kinect传感器获取数据信息,包括彩色图像、深度图像、即时动作识别、语音识别等。
其硬件组成结构图下:图3-1 kincet实体图3.1.1彩色图形获取Kinect中间的镜头是普通RGB摄像头,彩色数据的编码格式可设置为RGB.32bit 格式和YUV-16bit格式。
在传感器传输数据前,会先将Bayer格式转换为RGB.32bit格式,在分辨率为640x480的情况下,帧率可达到30帧/每秒. 获取彩色图像的方法是首先打开Kinect的彩色数据通道,在彩色帧处理事件中的核心代码为:kinectVideo.Source=BitmapSouree.Create(colorFrame.idth,colorFrame.Height,96,96,framesPixelFormats.Bgr32,nul,colorData, colorFrame.Width*colorFrame.BytesPerPixel);其中Bgr32表示一个像素点对应的4字节,前3个字节对应B、G、R,第4字节对应代表透明度的alpha通道。
运行后,得到RGB彩色图像。
3.1.2深度图像获取Kinect视角场的有效距离为1.2m~3.8m,微软建议用户在开发中使用的深度范围为1220mm~3810mm,深度图像的每个像素由2个字节组成,共16位。
其中高13位表示Kinect红外摄像头到最近的物体的距离,低3位表示跟踪到的用户索引号,低3位可表示的整数范围是0~7,其中数值0表示没有找到用户,数值1~6表示识别到的用户1至用户6。
表3-1为实际距离与深度数值的对照表。
表3-1 实际距离与深度数值的对照3.1.3动作识别Kinect内部的光学部件是让Kinect实现实时动作捕捉的部分。
这部分的技术非常复杂。
kinect红外摄像头识别图像的是一个“深度场”,其中每一像素的颜色代表了那一点物体到摄像头的距离。
比如离摄像头近的身体呈亮红色、绿色等,而离摄像头远的物体则呈暗灰色。
软件接手深度场后,运行一系列的滤镜程序,区分人体和其他的物体。
系统识别人体时遵从一些基本的规律,比如一个人的身高范围,“人体应该有四肢”等等。
Kinect能相当准确地通过不多的信息识别出人体部位。
人体部位识别完成后,系统将数据整合成一个由活动关节组成的骨架图。
Kinect系统内预存了200 多个常见的人体姿势,以便当Kinect接收的信息不全的时候猜测玩家的动作(比如玩家部分身体脱离了可视范围,或者身体一些部位被挡住时等等)。
系统以每秒30次的速度进行动作识别。
图3-2位动作识别核心算法流程。
图3-2 动作识别核心算法流程骨架关节点跟踪是Kinect的核心技术,如图3-3所示,Kinect可识别人体骨架中的20个关节点。
图3-3 人体骨架关节点KinectAPI中JointCollection类提供了可识别用户20个骨架关节点集合,可对全身关节点遍历。
对人体动作的识别可以基于骨架关节点的空间位置或者移动序列。
其主要解决步骤为:(1)首先利用深度信息对人体前景分割,从背景中分离出人体;(2)将人体分类为32个部位,相邻的部位分别着不同颜色;(3)使用深度随机决策森林分类器对训练样本进行分类;(4)从多角度分析部位以确定关节点在三维空间中的坐标位置。
3.1.4语音识别语音识别是通过Kinect上的四个麦克风实现的。
这个麦克风组最擅长在远距离上识别人的语音。
但是麦克风组还不是全部,Kinect内部有处理芯片来过滤噪音和其他不相干的声音。
系统还包含一个叫“Beam Forming”的软件来配合摄像头识别玩家的位置,以便准确地把语言识别范围控制在玩家身上,同时压制玩家身边的别的人发出的声音。
就像的图像识别部分一样,Kinect的声音识别部分也是随时工作的。
Kinect的语言识别是工作在“开放麦克风”模式下,也就是说玩家在使用Kinect是随时可以发出语音指令,无需按特殊的按键。
3.2 Unity3D接口控制Unity3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具。
它能够将数据信息转换成事件命令进行控制,信息转换映射图如下:图3-4信息转换映射图3.2.1设备控制对设备的控制主要体现在:启动相关外围设备及初始化、相机角度调节、关闭设备等。
硬件设备包括kinect传感器,通过总线与控制计算机相连,震动反馈及其他特效设备通过信号线同计算机相连。
利用Unity3d实现控制接口,来控制相关设备。
3.2.2场景显示控制场景模块功能可实现人物模型随着体感镜头捕捉的人体来变化。
模型搭建效果如图3-4所示。
在场景中布置一人物,制作人物,并附着人物骨骼,在Unity3D中进行绑定,调节灯光和天空。
图3-5 人物模型搭建效果3.2.3骨骼跟踪绑定骨骼绑定在Kinect中,站立模式可以跟踪20个关节点,分为主动和被动两种模式,提供最多两副完整的骨骼跟踪数据。
主动模式下,调用相关帧,读取函数获得用户骨骼数据;而被动模式下,最多支持四个人的骨骼跟踪,但是在该模式下仅包含用户的位置信息,不包括详细的骨骼数据。
对于所有获取的骨骼数据,至少包含3类信息。
第1类信息:相关骨骼的跟踪状态,被动模式时仅包括用户位置数据,主动模式包括完整的骨骼数据;第2类信息:唯一的骨骼跟踪ID,用于分配给视野中的用户;第3类信息:用户质心位置,该值仅在被动模式下可用。
身体部位绑定,便于在Unity3D场景模型的骨骼获取数据,用数组bones表示场景中模型的各个骨骼节点,完成骨骼的映射功能。
采用四元素方式。
四元素为简单的超复数。
四元素都是由实数与i、j、k构成的线性组合,公式如下:i2=j2=k2=-1(1)a+bi+cj+dk=0(2)unity3D中使用Quaternion来表达物体的旋转。