基于WinPhone 7的體感健身系統的設計與實(shí)現
隨著(zhù)人們生活節奏的加快,很多人難以做到經(jīng)常進(jìn)行體育鍛煉。近幾年對該問(wèn)題提出了多種解決方案,其中運用體域網(wǎng)(Body Area Network)技術(shù)實(shí)現的健身方案逐漸受到市場(chǎng)的青睞。
體域網(wǎng)通過(guò)連接多個(gè)傳感器節點(diǎn),實(shí)現人體周邊、體表以及體內范圍的通信,支持醫療保健、個(gè)人娛樂(lè )等功能。它把人體變成通信網(wǎng)絡(luò )的一部分,從而真正實(shí)現了網(wǎng)絡(luò )的泛在化,具有廣泛的應用前景和巨大的市場(chǎng)潛力。
該系統使用ZigBee技術(shù)組成體域網(wǎng),并將采集到的人體運動(dòng)信息以無(wú)線(xiàn)的方式發(fā)送到Windows Phone 7系統上。運用XNA技術(shù)和.NET 框架,在系統上模擬實(shí)現110 m跨欄競賽流程的3D游戲。用戶(hù)可通過(guò)屏幕看到模擬的運動(dòng)畫(huà)面,增加鍛煉的趣味性,提高人們對運動(dòng)的熱情。系統具有體積小巧、方便易用的特點(diǎn),適合在相對較小的空間使用。
1 系統總體架構設計
體感健身系統首先通過(guò)高靈敏的角度傳感器和心率傳感器實(shí)時(shí)采集運動(dòng)者腿部擺動(dòng)角度以及心率變化信息,然后利用ZigBee模塊組成體域網(wǎng),再傳輸到平臺中。系統對收到的信息進(jìn)行處理,實(shí)時(shí)模擬出一個(gè)3D跨欄的游戲。系統結構圖如圖1所示。
Windows Phone 7是微軟公司于2010年10月發(fā)布的全新智能手機操作系統。它并不是之前Windows Mobile操作系統的升級或是繼承,而是一個(gè)全新的操作系統,它基于Windows Embedded Compact 7新內核編寫(xiě)系統,完全脫離了Mobile 6的技術(shù)架構。簡(jiǎn)潔華麗的metro界面,宣告了它不同以往的風(fēng)格;采用全新的Push Notification技術(shù)方便了手機終端與服務(wù)器的數據同步[1]。
為方便開(kāi)發(fā),Windows Phone 7提供了模擬器(Emulator),Emulator可以運行在Windows 7操作系統下,并且在調試和運行程序時(shí),不需要將游戲部署到真正的設備中[2]。
2 系統硬件設計
2.1 ZigBee數據采集模塊
ZigBee數據采集模塊是硬件平臺的關(guān)鍵部分,該部分首先利用ZigBee技術(shù)組成體域網(wǎng),然后采集用戶(hù)橈動(dòng)脈處的脈搏信號和腿部的擺動(dòng)角度信號,處理后再以無(wú)線(xiàn)的方式將數據傳輸到系統接收模塊上。為了擴大系統的應用范圍,將來(lái)也可考慮用藍牙設備作為無(wú)線(xiàn)傳輸工具。體感傳感器模塊硬件框圖如圖2所示。
2.2 數據接收模塊
系統接收端使用CC2531內置的USB將從ZigBee模塊接收到的數據傳到手機終端上。
3 系統軟件設計
3.1 開(kāi)發(fā)環(huán)境
系統軟件部分使用Visual Studio 2010開(kāi)發(fā),與舊的Visual Studio 版本相比,最新版本的Visual Studio 在性能上有很大提升,方便程序員高效地編寫(xiě)高質(zhì)量的代碼。而且微軟公司提供的Windows Phone 7開(kāi)發(fā)包都是基于Visual Studio 2010的,因此本設計選擇Visual Studio 2010作為軟件開(kāi)發(fā)平臺。
Windows Phone 7提供了兩種不同的開(kāi)發(fā)平臺:Silverlight for Windows Phone和XNA 4.0 Game Studio。Silverlight是為開(kāi)發(fā)Windows Phone7準備的。XNA 4.0 Game Studio是為開(kāi)發(fā)游戲準備的。
XNA是微軟公司推出的通用軟件開(kāi)發(fā)平臺,建立在C#的基礎上方便游戲開(kāi)發(fā)的一組工具集,目的是讓游戲開(kāi)發(fā)過(guò)程更加輕松簡(jiǎn)單并富有樂(lè )趣。XNA 4.0比起之前的嵌入式版本XNA 3.1而言進(jìn)步非常明顯,能夠支持3D游戲,而且還封裝了Open GLES 2.0的接口[3]。
為了支持XNA的開(kāi)發(fā),開(kāi)發(fā)環(huán)境還需要安裝.NET Framework 4或.NET Framework 4的 Runtime動(dòng)態(tài)連接庫,否則XNA工程將無(wú)法正常編譯。開(kāi)發(fā)環(huán)境層次圖如圖3所示。
3.2 系統軟件實(shí)現
3D游戲主要設計實(shí)現模擬110 m跨欄競賽的流程。圖4展示了游戲全部模塊的關(guān)系結構。對于軟件開(kāi)發(fā)人員而言,主要實(shí)現的是導入模型、渲染場(chǎng)景、輸入處理、音效處理及運行時(shí)機制等功能。下面結合本系統的特點(diǎn)分別對上述幾個(gè)模塊給出處理方法。
3.2.1 模型導入
模型的導入需要XNA的內容管道(pipeline)來(lái)支持。XNA自帶了兩類(lèi)3D模型的導入處理器,可以分別處理
.FBX文件和.x文件。其中,.x文件在DirectX 3D編程中應用得比較廣泛。系統軟件使用MAYA制作三維動(dòng)畫(huà)文件,通過(guò)插件導出為DirectX(.X)文件,經(jīng)過(guò)pipeline導入器處理后,所有不同類(lèi)型的內容文件都被轉換成XNA框架的內部格式。在游戲生成階段,編譯器直接將這些文件封裝到游戲的內容管理模塊(Content Manager)中。
Content Manager是由XNA框架Runtime引擎驅動(dòng)的,具有良好的封裝,在形式上對程序員是透明的。使用模型文件的時(shí)候,調用Content Manager的LoadT>方法即可實(shí)現對模型的導入。具體實(shí)現代碼為:
public Model dc_model = null;
再在LoadContent()函數中對模型變量賦值,用Load方法導入模型。具體實(shí)現代碼如下:
dc_model
=Game.Content.LoadModel>(@Models+fuwa);
fb_model_batch
= new ModelBatch(Game.GraphicsDevice);
其中,模型文件的存儲位置以相對路徑的形式導入,有效避免了系統安裝在別的目錄后找不到模型文件的錯誤。模型導入效果如圖5所示。
3.2.2 場(chǎng)景渲染
場(chǎng)景渲染是將已導入到緩沖區的模型及紋理繪制在顯示屏上。雖然涉及到大量的繪制操作,但利用XNA提供的繪制精靈(SpriteBetch),可以輕松地完成這一工作。在計算機圖形學(xué)術(shù)語(yǔ)中,精靈被定義為一張集成在大場(chǎng)景中的二維或者三維圖像。屏幕顯示管理模塊就是通過(guò)繪制場(chǎng)景中的多種精靈來(lái)完成的。XNA框架提供的精靈也可以用來(lái)進(jìn)行二維圖像繪制,本系統中所有屏幕顯示文本都是由精靈繪制的。
除此之外,開(kāi)發(fā)者還需要關(guān)心世界變換矩陣、攝像機變換矩陣和投影變換矩陣的設置。世界變換矩陣是指將模型坐標系變換為三維世界坐標系的矩陣[4]。具體實(shí)現代碼為:
final_world_transforms = Matrix.Identity
*Matrix.CreateFromYawPitchRoll(dc_rotation.Y, dc_rotation.X, dc_rotation.Z)
* origional_world_transforms
* Matrix.CreateTranslation(dc_position);
攝像機矩陣是以攝像機所在坐標為原點(diǎn),以攝像機要觀(guān)察的方向為基準,創(chuàng )建一個(gè)新的攝像機坐標系,將世界坐標系變換為攝像機坐標系[4]。XNA提供了一個(gè)CreateLookAt的方法,它返回一個(gè)矩陣。這個(gè)矩陣存儲了從三維圖形轉換為平面圖形需要做的方向和位置變換。具體實(shí)現代碼為:
//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);
投影變換矩陣,是指將三維坐標系變?yōu)槎S坐標系的變換矩陣。其功能是將三維物體進(jìn)行轉換,以便在二維屏幕上輸出。這里用到的投影變換是投射投影法。用此投影法可以表現物體距離的遠近。具體實(shí)現代碼如下:
//Create the projection matrix
cmr_projection
=Matrix.CreatePerspectiveFieldOfView
(MathHelper.ToRadians(cmr_camera_fov),
graphics_device_in_cmr.Viewport.AspectRatio, 1, 10000);
AspectRatio為程序窗口的長(cháng)寬比,1為最近可視距離, 10 000為最遠可視距離。
3.2.3 音效處理
聲音管理器(AudioManager)繼承自GameComponent,負責管理游戲需要使用的聲音。XNA框架提供了能夠處理聲音的SoundEffectInstance類(lèi)型,類(lèi)型中除了包含聲音播放的相關(guān)方法,還封裝了聲音效果渲染方法[5]。聲音管理模塊還設計了一個(gè)字典(泛型Dictionary)用于存放所有的音效。泛型在排序和搜索方面比普通數據類(lèi)型要好得多。加載聲音、播放聲音、停止聲音和暫停聲音都是調用SoundEffectInstance類(lèi)型中封裝的對應方法,將聲音名稱(chēng)傳入之后,在聲音字典里查找,如果存在,則進(jìn)行相應操作。
3.2.4 輸入處理
本系統是為Windows Phone 7設備開(kāi)發(fā)的體感游戲,用戶(hù)在游戲過(guò)程中,需要進(jìn)行跑和跳的動(dòng)作來(lái)完成游戲。系統所讀取到的輸入信號就是傳感器在垂直空間的位置變化。輸入處理的流程是,首先使用C#接口函數讀取USB輸入的數據,然后初始化一個(gè)三維向量(Vector3)的臨時(shí)變量statevalue,再初始化一個(gè)布爾變量isjump表示是否有跳躍動(dòng)作,之后對變化后的statevalue進(jìn)行向量的單位化操作,最后根據兩個(gè)變量的值確定模型的動(dòng)作。
游戲使用事件輪詢(xún)驅動(dòng),不論當前是否有輸入操作,都對輸入模塊進(jìn)行訪(fǎng)問(wèn)。這與傳統的應用程序開(kāi)發(fā)的事件注冊驅動(dòng)是不同的。采用事件注冊驅動(dòng)的程序,用戶(hù)輸入后系統對其進(jìn)行捕捉,喚醒事件處理程序,即在輸入信號產(chǎn)生之前程序不會(huì )做任何事。相比之下,XNA框架游戲程序由事件輪詢(xún)驅動(dòng),游戲程序會(huì )主動(dòng)詢(xún)問(wèn)系統是否有用戶(hù)輸入發(fā)生,不論有沒(méi)有用戶(hù)輸入,程序都會(huì )一直運行。
3.2.5 游戲運行時(shí)機制
本質(zhì)上,游戲運行是由循環(huán)的一系列操作組成,這些操作被反復使用直到游戲結束。但游戲循環(huán)只包含繪制和更新兩個(gè)方法,所有影響游戲的邏輯都將在這些方法中完成。繪制時(shí)需要與系統進(jìn)行大量的數據交互,尤其繪制圖像時(shí)更將耗費大量系統空間。為減少繪制方法的負擔,提高系統性能,游戲將運行需要的所有操作(碰撞檢測、更新分數、游戲結束檢測等等)都放到更新方法中實(shí)現。
在實(shí)現繪制方法的過(guò)程中,用到了XNA的深度緩沖(depth buffer)和模板緩沖(stencil buffer)等特性。深度緩沖和模板緩沖是XNA框架中圖形設備的屬性??紤]到游戲運行時(shí)圖形設備需要繪制的場(chǎng)景較大,內容較多,并且還包括完成渲染模型的動(dòng)畫(huà)效果等工作,因此,開(kāi)啟緩沖功能有助于提高圖形設備性能。繪制方法流程圖如圖6所示。
本文詳細介紹了體感健身系統開(kāi)發(fā)的過(guò)程和方法,對XNA開(kāi)發(fā)3D游戲過(guò)程中重要的函數給出了使用說(shuō)明。系統可以幫助那些運動(dòng)場(chǎng)地受限制或者行動(dòng)不便的人提高運動(dòng)樂(lè )趣,具有比較廣泛的應用范圍。
評論