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