基于WinPhone 7的体感健身系统的设计与实现
随着人们生活节奏的加快,很多人难以做到经常进行体育锻炼。近几年对该问题提出了多种解决方案,其中运用体域网(Body Area Network)技术实现的健身方案逐渐受到市场的青睐。
体域网通过连接多个传感器节点,实现人体周边、体表以及体内范围的通信,支持医疗保健、个人娱乐等功能。它把人体变成通信网络的一部分,从而真正实现了网络的泛在化,具有广泛的应用前景和巨大的市场潜力。
该系统使用ZigBee技术组成体域网,并将采集到的人体运动信息以无线的方式发送到Windows Phone 7系统上。运用XNA技术和.NET 框架,在系统上模拟实现110 m跨栏竞赛流程的3D游戏。用户可通过屏幕看到模拟的运动画面,增加锻炼的趣味性,提高人们对运动的热情。系统具有体积小巧、方便易用的特点,适合在相对较小的空间使用。
1 系统总体架构设计
体感健身系统首先通过高灵敏的角度传感器和心率传感器实时采集运动者腿部摆动角度以及心率变化信息,然后利用ZigBee模块组成体域网,再传输到平台中。系统对收到的信息进行处理,实时模拟出一个3D跨栏的游戏。系统结构图如图1所示。
Windows Phone 7是微软公司于2010年10月发布的全新智能手机操作系统。它并不是之前Windows Mobile操作系统的升级或是继承,而是一个全新的操作系统,它基于Windows Embedded Compact 7新内核编写系统,完全脱离了Mobile 6的技术架构。简洁华丽的metro界面,宣告了它不同以往的风格;采用全新的Push Notification技术方便了手机终端与服务器的数据同步[1]。
为方便开发,Windows Phone 7提供了模拟器(Emulator),Emulator可以运行在Windows 7操作系统下,并且在调试和运行程序时,不需要将游戏部署到真正的设备中[2]。
2 系统硬件设计
2.1 ZigBee数据采集模块
ZigBee数据采集模块是硬件平台的关键部分,该部分首先利用ZigBee技术组成体域网,然后采集用户桡动脉处的脉搏信号和腿部的摆动角度信号,处理后再以无线的方式将数据传输到系统接收模块上。为了扩大系统的应用范围,将来也可考虑用蓝牙设备作为无线传输工具。体感传感器模块硬件框图如图2所示。
2.2 数据接收模块
系统接收端使用CC2531内置的USB将从ZigBee模块接收到的数据传到手机终端上。
3 系统软件设计
3.1 开发环境
系统软件部分使用Visual Studio 2010开发,与旧的Visual Studio 版本相比,最新版本的Visual Studio 在性能上有很大提升,方便程序员高效地编写高质量的代码。而且微软公司提供的Windows Phone 7开发包都是基于Visual Studio 2010的,因此本设计选择Visual Studio 2010作为软件开发平台。
Windows Phone 7提供了两种不同的开发平台:Silverlight for Windows Phone和XNA 4.0 Game Studio。Silverlight是为开发Windows Phone7准备的。XNA 4.0 Game Studio是为开发游戏准备的。
XNA是微软公司推出的通用软件开发平台,建立在C#的基础上方便游戏开发的一组工具集,目的是让游戏开发过程更加轻松简单并富有乐趣。XNA 4.0比起之前的嵌入式版本XNA 3.1而言进步非常明显,能够支持3D游戏,而且还封装了Open GLES 2.0的接口[3]。
为了支持XNA的开发,开发环境还需要安装.NET Framework 4或.NET Framework 4的 Runtime动态连接库,否则XNA工程将无法正常编译。开发环境层次图如图3所示。
3.2 系统软件实现
3D游戏主要设计实现模拟110 m跨栏竞赛的流程。图4展示了游戏全部模块的关系结构。对于软件开发人员而言,主要实现的是导入模型、渲染场景、输入处理、音效处理及运行时机制等功能。下面结合本系统的特点分别对上述几个模块给出处理方法。
3.2.1 模型导入
模型的导入需要XNA的内容管道(pipeline)来支持。XNA自带了两类3D模型的导入处理器,可以分别处理
.FBX文件和.x文件。其中,.x文件在DirectX 3D编程中应用得比较广泛。系统软件使用MAYA制作三维动画文件,通过插件导出为DirectX(.X)文件,经过pipeline导入器处理后,所有不同类型的内容文件都被转换成XNA框架的内部格式。在游戏生成阶段,编译器直接将这些文件封装到游戏的内容管理模块(Content Manager)中。
Content Manager是由XNA框架Runtime引擎驱动的,具有良好的封装,在形式上对程序员是透明的。使用模型文件的时候,调用Content Manager的Load<T>方法即可实现对模型的导入。具体实现代码为:
public Model dc_model = null;
再在LoadContent()函数中对模型变量赋值,用Load方法导入模型。具体实现代码如下:
dc_model
=Game.Content.Load<Model>(@"Models\"+"fuwa");
fb_model_batch
= new ModelBatch(Game.GraphicsDevice);
其中,模型文件的存储位置以相对路径的形式导入,有效避免了系统安装在别的目录后找不到模型文件的错误。模型导入效果如图5所示。
3.2.2 场景渲染
场景渲染是将已导入到缓冲区的模型及纹理绘制在显示屏上。虽然涉及到大量的绘制操作,但利用XNA提供的绘制精灵(SpriteBetch),可以轻松地完成这一工作。在计算机图形学术语中,精灵被定义为一张集成在大场景中的二维或者三维图像。屏幕显示管理模块就是通过绘制场景中的多种精灵来完成的。XNA框架提供的精灵也可以用来进行二维图像绘制,本系统中所有屏幕显示文本都是由精灵绘制的。
除此之外,开发者还需要关心世界变换矩阵、摄像机变换矩阵和投影变换矩阵的设置。世界变换矩阵是指将模型坐标系变换为三维世界坐标系的矩阵[4]。具体实现代码为:
final_world_transforms = Matrix.Identity
*Matrix.CreateFromYawPitchRoll(dc_rotation.Y, dc_rotation.X, dc_rotation.Z)
* origional_world_transforms
* Matrix.CreateTranslation(dc_position);
摄像机矩阵是以摄像机所在坐标为原点,以摄像机要观察的方向为基准,创建一个新的摄像机坐标系,将世界坐标系变换为摄像机坐标系[4]。XNA提供了一个CreateLookAt的方法,它返回一个矩阵。这个矩阵存储了从三维图形转换为平面图形需要做的方向和位置变换。具体实现代码为:
//Make the camera follow the object
cmr_position = object_to_follow + cmr_drag;
cmr_target = object_to_follow;
//Create the view matrix
cmr_view
=Matrix.CreateLookAt(cmr_position,
cmr_target, Vector3.Forward);
投影变换矩阵,是指将三维坐标系变为二维坐标系的变换矩阵。其功能是将三维物体进行转换,以便在二维屏幕上输出。这里用到的投影变换是投射投影法。用此投影法可以表现物体距离的远近。具体实现代码如下:
//Create the projection matrix
cmr_projection
=Matrix.CreatePerspectiveFieldOfView
(MathHelper.ToRadians(cmr_camera_fov),
graphics_device_in_cmr.Viewport.AspectRatio, 1, 10000);
AspectRatio为程序窗口的长宽比,1为最近可视距离, 10 000为最远可视距离。
3.2.3 音效处理
声音管理器(AudioManager)继承自GameComponent,负责管理游戏需要使用的声音。XNA框架提供了能够处理声音的SoundEffectInstance类型,类型中除了包含声音播放的相关方法,还封装了声音效果渲染方法[5]。声音管理模块还设计了一个字典(泛型Dictionary)用于存放所有的音效。泛型在排序和搜索方面比普通数据类型要好得多。加载声音、播放声音、停止声音和暂停声音都是调用SoundEffectInstance类型中封装的对应方法,将声音名称传入之后,在声音字典里查找,如果存在,则进行相应操作。
3.2.4 输入处理
本系统是为Windows Phone 7设备开发的体感游戏,用户在游戏过程中,需要进行跑和跳的动作来完成游戏。系统所读取到的输入信号就是传感器在垂直空间的位置变化。输入处理的流程是,首先使用C#接口函数读取USB输入的数据,然后初始化一个三维向量(Vector3)的临时变量statevalue,再初始化一个布尔变量isjump表示是否有跳跃动作,之后对变化后的statevalue进行向量的单位化操作,最后根据两个变量的值确定模型的动作。
游戏使用事件轮询驱动,不论当前是否有输入操作,都对输入模块进行访问。这与传统的应用程序开发的事件注册驱动是不同的。采用事件注册驱动的程序,用户输入后系统对其进行捕捉,唤醒事件处理程序,即在输入信号产生之前程序不会做任何事。相比之下,XNA框架游戏程序由事件轮询驱动,游戏程序会主动询问系统是否有用户输入发生,不论有没有用户输入,程序都会一直运行。
3.2.5 游戏运行时机制
本质上,游戏运行是由循环的一系列操作组成,这些操作被反复使用直到游戏结束。但游戏循环只包含绘制和更新两个方法,所有影响游戏的逻辑都将在这些方法中完成。绘制时需要与系统进行大量的数据交互,尤其绘制图像时更将耗费大量系统空间。为减少绘制方法的负担,提高系统性能,游戏将运行需要的所有操作(碰撞检测、更新分数、游戏结束检测等等)都放到更新方法中实现。
在实现绘制方法的过程中,用到了XNA的深度缓冲(depth buffer)和模板缓冲(stencil buffer)等特性。深度缓冲和模板缓冲是XNA框架中图形设备的属性。考虑到游戏运行时图形设备需要绘制的场景较大,内容较多,并且还包括完成渲染模型的动画效果等工作,因此,开启缓冲功能有助于提高图形设备性能。绘制方法流程图如图6所示。
本文详细介绍了体感健身系统开发的过程和方法,对XNA开发3D游戏过程中重要的函数给出了使用说明。系统可以帮助那些运动场地受限制或者行动不便的人提高运动乐趣,具有比较广泛的应用范围。
体感健身系统 3D游戏 Windows Phone 相关文章:
- 在Windows下启动Linux(02-09)
- Windows CE下驱动程序开发基础(04-10)
- 基于WinCE的I2C驱动程序设计(04-24)
- Windows Embedded CE 6.0开发初体验(04-26)
- Linux和Windows系统线程间的区别(05-25)
- Linux下破解windows密码最终秘籍(02-27)