行業(yè)資訊
加速度傳感器解讀
2010-12-24 16:34:09
加速度傳感器
在Windows Phone 7的硬件規(guī)格中已經(jīng)成為一種標(biāo)配,有了加速度傳感器,就可以根據(jù)地球引力來(lái)仿真現(xiàn)實(shí)生活中的許多操作。譬如說(shuō)我們傾斜手機(jī),就可以實(shí)現(xiàn)手機(jī)向傾斜的方向移動(dòng)。還有我們可以揮動(dòng)手機(jī),實(shí)現(xiàn)游戲中保齡球的揮出操作等等功能。搖晃手機(jī)實(shí)現(xiàn)圖片和背景圖片的更換,一切只限于你的想象力。因此掌握加速度傳感器的編程也是XNA游戲開(kāi)發(fā)的必經(jīng)之路。
WP7上的加速度傳感器輸出可以用一個(gè)3D空間的矢量來(lái)描述,這里要注意下,在XNA中存在三維的矢量類型,而Silverlight是不存的。本文除了將給出Platformer的加速度感應(yīng)器代碼外,還將深入WP7的加速度感應(yīng)器的概念,讓你在以后的項(xiàng)目開(kāi)發(fā)中可以快速切入。
當(dāng)一個(gè)三維的點(diǎn)坐標(biāo)(x,y,z)表示空間一個(gè)特定的位置時(shí),矢量(x,y,z)代表的意義則更加豐富,它包含了方向和長(zhǎng)度的概念。很明顯點(diǎn)坐標(biāo)和矢量是有關(guān)聯(lián)的。矢量(x,y,z)的方向就是點(diǎn)(0,0,0)到點(diǎn)(x,y,z)的方向。但是矢量(x,y,z)并不是由點(diǎn)(0,0,0)到點(diǎn) (x,y,z)構(gòu)成的那條直線,而只是代表這條直線的方向。
矢量(x,y,z)的長(zhǎng)度我們可以使用勾股定理快速獲取,下面是計(jì)算的數(shù)學(xué)表達(dá)式。
在使用加速度傳感器時(shí),我們可以把WP7手機(jī)想像成一個(gè)三維的坐標(biāo)系統(tǒng)。無(wú)論電話放置的方向的什么,Y坐標(biāo)軸是電話的底端(包含按鈕的那端)到頂端的方向,而且這個(gè)走向是是X軸正方向。X坐標(biāo)軸則是從左至右的走向,這個(gè)走向亦是正方向,Z坐標(biāo)軸正走向則是面對(duì)你的方向。
下面是WP7三維矢量坐標(biāo)的標(biāo)示圖:
這是一個(gè)我們?cè)趯?shí)際生活和數(shù)學(xué)中都經(jīng)常使用的經(jīng)典三維坐標(biāo)系統(tǒng),XNA中的3D編程也采用了這種坐標(biāo)方法。這種坐標(biāo)系統(tǒng)有一個(gè)專業(yè)術(shù)語(yǔ),被稱作笛卡爾右手坐標(biāo)系統(tǒng)。
笛卡爾右手坐標(biāo)系統(tǒng)的意思就是將右手背對(duì)著手機(jī)屏幕放置,拇指即指向X軸的正方向。伸出食指和中指,食指指向Y軸的正方向,中指所指示的方向即是Z軸的正方向。有點(diǎn)類似面對(duì)自己的蘭花指造型,大家可以看看示意圖。
這種坐標(biāo)朝向永遠(yuǎn)是固定的,無(wú)論你是將手機(jī)是橫拿還是豎放,又或者游戲是在Landscape和Portrait模式下運(yùn)行,均如此。你只需要記住前面強(qiáng)調(diào)的兩點(diǎn),無(wú)論電話放置的方向的什么,Y坐標(biāo)軸是電話的底端(具備開(kāi)始按鈕的那端)到頂端的走向,而且這個(gè)方向是是X軸正方向。X坐標(biāo)軸則是從左至右的走向,這個(gè)走向亦是正方向。再使用右手定理,就可以很快地確定Z的坐標(biāo)軸走向了。
正如你想象的那樣,Windows Phone 7應(yīng)用程序的在屏幕選擇時(shí)會(huì)自動(dòng)切換正是由加速度傳感器實(shí)現(xiàn)的。如果你的手機(jī)是靜止的,加速度傳感器的矢量方向永遠(yuǎn)是指向地心的,如果矢量的長(zhǎng)度為1的話,我們稱之為1G。當(dāng)你著正拿著WP7手機(jī)時(shí),加速度傳感器的矢量為(0,-1,0),方向指向地心。逆時(shí)針旋轉(zhuǎn)90度,加速度傳感器矢量變?yōu)?(-1,0,0)。再逆時(shí)針旋轉(zhuǎn)90度又變?yōu)椋?,1,0)。
當(dāng)你將手機(jī)朝上平放在桌面上時(shí),加速度傳感器矢量為(0,0,-1)。這些值也就是Windows Phone 7仿真器經(jīng)常報(bào)告的矢量。
正常拿著時(shí),加速度傳感器矢量為(0,-1,0)
右Landscape模式時(shí),加速度傳感器矢量為(1,0,0)
左Landscape時(shí),加速度傳感器矢量為(-1,0,0)
向右傾斜45度時(shí),加速度傳感器矢量為(0.7,-0.7,0)。這樣使用勾股定理正好得到矢量長(zhǎng)度為1
當(dāng)然,加速度傳感器矢量很少能達(dá)到這種類似(0,-1.0)這種精確度,其長(zhǎng)度不可避免會(huì)有些出入。在WP7手機(jī)靜止時(shí),加速度傳感器矢量長(zhǎng)度會(huì)有一定的誤差。當(dāng)你在訪問(wèn)月球時(shí)使用WP7的話,你可能會(huì)認(rèn)為矢量速度為0.17這個(gè)大概的區(qū)域(月球重力為地球的1/6),但是這個(gè)數(shù)值主要還是取決于手機(jī)的加速度傳感器品質(zhì)。
前面談?wù)摰募铀俣雀袘?yīng)器矢量都是在手機(jī)靜止?fàn)顟B(tài)下發(fā)生的,加速度感應(yīng)器矢量還可以指向其它的一些方向,當(dāng)手機(jī)在快速運(yùn)動(dòng)時(shí)其矢量長(zhǎng)度也會(huì)發(fā)生或大或小的變化。
比如說(shuō),當(dāng)你猛地將手機(jī)向左移動(dòng)時(shí),如果手機(jī)的速度一直處于增大時(shí),加速度傳感器矢量將指向右。但當(dāng)手機(jī)的移動(dòng)速度穩(wěn)定時(shí),加速度傳感器矢量的長(zhǎng)度又變?yōu)橹亓Υ笮 .?dāng)你最后減速時(shí),加速度傳感器矢量的方向一直保持左邊,直到手機(jī)完全停止為止。
還有一種情況就是當(dāng)手機(jī)自由落體時(shí),原理上可認(rèn)為此時(shí)加速度傳感器矢量的長(zhǎng)度為0。
在程序開(kāi)發(fā)過(guò)程中需要和加速度傳感器打交道時(shí),你首先要引用Microsoft.Devices.Sensors這個(gè)dll文件。此外,WMAppManifest.xml這個(gè)文件還需要包含
我們知道Platformer游戲中,是使用加速度傳感器的來(lái)確定英雄的移動(dòng)方向,以及移動(dòng)的速度,這和你傾斜手機(jī)的角度有著密切的關(guān)系。我們需要對(duì)加速度傳感器返回的矢量值進(jìn)行處理,以實(shí)現(xiàn)仿真現(xiàn)實(shí)場(chǎng)景的移動(dòng)效果。此外,當(dāng)程序運(yùn)行在模擬器上時(shí),我們可以使用電腦鍵盤的方向鍵來(lái)仿真加速度傳感器。