产品大类

行业资讯

加速度传感器解读

2010-12-24 16:34:09

加速度传感器在Windows Phone 7的硬件规格中已经成为一种标配,有了加速度传感器,就可以根据地球引力来仿真现实生活中的许多操作。譬如说我们倾斜手机,就可以实现手机向倾斜的方向移动。还有我们可以挥动手机,实现游戏中保龄球的挥出操作等等功能。摇晃手机实现图片和背景图片的更换,一切只限于你的想象力。因此掌握加速度传感器的编程也是XNA游戏开发的必经之路。

 

WP7上的加速度传感器输出可以用一个3D空间的矢量来描述,这里要注意下,在XNA中存在三维的矢量类型,而Silverlight是不存的。本文除了将给出Platformer的加速度感应器代码外,还将深入WP7的加速度感应器的概念,让你在以后的项目开发中可以快速切入。

 

当一个三维的点坐标(x,y,z)表示空间一个特定的位置时,矢量(x,y,z)代表的意义则更加丰富,它包含了方向和长度的概念。很明显点坐标和矢量是有关联的。矢量(x,y,z)的方向就是点(0,0,0)到点(x,y,z)的方向。但是矢量(x,y,z)并不是由点(0,0,0)到点 (x,y,z)构成的那条直线,而只是代表这条直线的方向。

 

矢量(x,y,z)的长度我们可以使用勾股定理快速获取,下面是计算的数学表达式。

 

在使用加速度传感器时,我们可以把WP7手机想像成一个三维的坐标系统。无论电话放置的方向的什么,Y坐标轴是电话的底端(包含按钮的那端)到顶端的方向,而且这个走向是是X轴正方向。X坐标轴则是从左至右的走向,这个走向亦是正方向,Z坐标轴正走向则是面对你的方向。

 

下面是WP7三维矢量坐标的标示图:

 

 

 

 

这是一个我们在实际生活和数学中都经常使用的经典三维坐标系统,XNA中的3D编程也采用了这种坐标方法。这种坐标系统有一个专业术语,被称作笛卡尔右手坐标系统。

 

笛卡尔右手坐标系统的意思就是将右手背对着手机屏幕放置,拇指即指向X轴的正方向。伸出食指和中指,食指指向Y轴的正方向,中指所指示的方向即是Z轴的正方向。有点类似面对自己的兰花指造型,大家可以看看示意图。

 

 

这种坐标朝向永远是固定的,无论你是将手机是横拿还是竖放,又或者游戏是在Landscape和Portrait模式下运行,均如此。你只需要记住前面强调的两点,无论电话放置的方向的什么,Y坐标轴是电话的底端(具备开始按钮的那端)到顶端的走向,而且这个方向是是X轴正方向。X坐标轴则是从左至右的走向,这个走向亦是正方向。再使用右手定理,就可以很快地确定Z的坐标轴走向了。

 

正如你想象的那样,Windows Phone 7应用程序的在屏幕选择时会自动切换正是由加速度传感器实现的。如果你的手机是静止的,加速度传感器的矢量方向永远是指向地心的,如果矢量的长度为1的话,我们称之为1G。当你着正拿着WP7手机时,加速度传感器的矢量为(0,-1,0),方向指向地心。逆时针旋转90度,加速度传感器矢量变为 (-1,0,0)。再逆时针旋转90度又变为(0,1,0)。

 

当你将手机朝上平放在桌面上时,加速度传感器矢量为(0,0,-1)。这些值也就是Windows Phone 7仿真器经常报告的矢量。

 

 

正常拿着时,加速度传感器矢量为(0,-1,0)

 

 

右Landscape模式时,加速度传感器矢量为(1,0,0)

 

 

左Landscape时,加速度传感器矢量为(-1,0,0)

 

 

向右倾斜45度时,加速度传感器矢量为(0.7,-0.7,0)。这样使用勾股定理正好得到矢量长度为1

 

当然,加速度传感器矢量很少能达到这种类似(0,-1.0)这种精确度,其长度不可避免会有些出入。在WP7手机静止时,加速度传感器矢量长度会有一定的误差。当你在访问月球时使用WP7的话,你可能会认为矢量速度为0.17这个大概的区域(月球重力为地球的1/6),但是这个数值主要还是取决于手机的加速度传感器品质。

 

前面谈论的加速度感应器矢量都是在手机静止状态下发生的,加速度感应器矢量还可以指向其它的一些方向,当手机在快速运动时其矢量长度也会发生或大或小的变化。

 

比如说,当你猛地将手机向左移动时,如果手机的速度一直处于增大时,加速度传感器矢量将指向右。但当手机的移动速度稳定时,加速度传感器矢量的长度又变为重力大小。当你最后减速时,加速度传感器矢量的方向一直保持左边,直到手机完全停止为止。

 

还有一种情况就是当手机自由落体时,原理上可认为此时加速度传感器矢量的长度为0。

 

在程序开发过程中需要和加速度传感器打交道时,你首先要引用Microsoft.Devices.Sensors这个dll文件。此外,WMAppManifest.xml这个文件还需要包含这个描述。一般来说这个描述是在项目创建时就已存在,这里和大家提醒下。

 

我们知道Platformer游戏中,是使用加速度传感器的来确定英雄的移动方向,以及移动的速度,这和你倾斜手机的角度有着密切的关系。我们需要对加速度传感器返回的矢量值进行处理,以实现仿真现实场景的移动效果。此外,当程序运行在模拟器上时,我们可以使用电脑键盘的方向键来仿真加速度传感器。