首页 > Android频道 > 【Android研究院之游戏开发】 > Android研究院之游戏开发小球重力感应(十五)
2012
04-29

Android研究院之游戏开发小球重力感应(十五)

Android研究院之游戏开发小球重力感应(十五) - 雨松MOMO程序研究院 - 1

重力感应主要是依靠手机的加速度传感器(accelerometer)来实现        在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论加速度传感器的具体实现方式。

传感器名称如下:

加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)

1.SensorMannager传感器管理对象手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService(SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。


 2.实现SensorEventListener接口

       说道SensorEventListener接口就不得不说SensorListener接口。在Android1.5一下是通过实现SensorListener接口来捕获 手机传感器状态,但是在1.5以上如果实现这个接口系统会提示你这行代码已经过期。今天我们不讨论SensorListener因为它已经是过时的东西了。主要讨论一下SensorEventListener接口。我们须要实现SensorEventListener这个接口 onSensorChanged(SensorEvent event)方法来捕获手机传感器的状态,拿到手机 X轴Y轴Z轴三个方向的重力分量,有了这三个方向的数据重力感应的原理我们就已经学会了,简单吧 哇咔咔~~

 如图所示:上例代码中 float x y z 3个方向的取值范围是在 -10 到 10 之间,我向同学们说明一下 X轴 Y轴 Z轴 重力分量的含义。 这里须要注意的是坐标原点 向天空为正数 向地面为负数 刚好与编程时坐标是相反的。

手机屏幕向左侧方当X轴就朝向天空,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(10,0,0)

手机屏幕向右侧方当X轴就朝向地面,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(-10,0,0)

手机屏幕垂直竖立放置方当Y轴就朝向天空,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,10,0)

手机屏幕垂直竖立放置方当Y轴就朝向地面,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,-10,0)

手机屏幕向上当Z轴就朝向天空,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,10)

手机屏幕向上当Z轴就朝向地面,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,-10)

因为这张图片是在模拟器上截得,所以没有重力感应它的三个方向的的重力分量都为0。

Android研究院之游戏开发小球重力感应(十五) - 雨松MOMO程序研究院 - 2

3.注册SensorEventListener

         使用SensorMannager调用getDefaultSensor(Sensor.TYPE_ACCELEROMETER)方法拿到加速重力感应的Sensor对象。因为本章我们讨论重力加速度传感器所以参数为Sensor.TYPE_ACCELEROMETER,如果须要拿到其它的传感器须要传入对应的名称。使用SensorMannager调用registerListener()方法来注册,第三个参数是检测的灵敏精确度根据不同的需求来选择精准度,游戏开发建议使用  SensorManager.SENSOR_DELAY_GAME。

     重力感应简单速度计算的方式。 每次摇晃手机计算出 X轴 Y轴 Z轴的重力分量可以将它们记录下来 然后每次摇晃的重力分量和之前的重力分量可以做一个对比 利用差值和时间就可以计算出他们的移动速度。(下面这段代码是我之前的博文中摘录过来的,因为那篇写的不是很好所以在这一篇中我详细总结一下)

 

Android研究院之游戏开发小球重力感应(十五) - 雨松MOMO程序研究院 - 3

下面给出这个DEMO小球重力感应的完整代码

老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。

下载地址:http://vdisk.weibo.com/s/aajXn

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Android研究院之游戏开发小球重力感应(十五)》有 4 条评论

  1. 郭玄 说:

    使用了网上一个GyroDroid 陀螺仪的插件, 但是极其不稳定 在场景里面放一个cube 用手机旋转看的时候 cube基本上是飘的 有什么办法能让他不那么晃

  2. 零式微语 说:

    MOMO大神,请教下,我在android下的陀螺仪数据抖动是什么情况啊,用了网上随便一搜就能找到的陀螺仪控制摄像机的代码,但是打包到IOS上一点问题都没有。在android上就会自己跳动,摄像机也会在手机静止状态下自己慢慢转动。用了低通过滤器也不好使。偶尔还会大幅度的跳动一个角度。

  3. 智识World 说:

    大神,在Unity下 有直接使用的Sensor功能 或者 插件吗? 求推荐。。。

留下一个回复

你的email不会被公开。