加速计(图片版)
加速计和CoreMotion
加速计 和CoreMotion
技术博客 新浪微博http://weibo.com/luohanchenyilong
全屏
的iOS 中的主要传感器 • 接近传感器
• 加速度传感器- 又称加速计
- - 由于 更凑够带来了更多发布的直觉游戏体验,基本姿态识别和环境
- - 目前智能手机中基本国内配备的都是三维线传感器,也就是说,
用来测量x ,Ÿ ,Ž 三个轴上的加速度 - - 由于重力分量的干扰,无法仅仅依靠加速度传感器来检测加
速方向的角度,也无法得知手机本身的朝向 - • 陀螺仪- 造价昂贵,目前并未在智能手机中得到普及- 基于角动量守恒理论,沿着某个特定的坐标轴测量旋转速率 - 误差会累积
• 电子罗盘-又称磁力计,或电子指南针
的iOS 中的主要传感器
| 加速度传感器 | 电子罗盘 | 陀螺仪 | 接近传感器 |
功能 | 通过测量三个轴的加速度大小来判断人体运动 | 通过测量设备周围地磁场的强度和方向来判断朝向 | 通过测量三个轴的旋转速率来判断朝向 | 无须物理接触就判断附近物体的存在 |
主要局限性 | 受重力干扰大瞬时误差大 | 误差大,容易受其他磁场和金属物体影响主要用于校正其他设备 | 误差会累积长时间读数的准确性差 | 不通用,大多数只针对几种材质 |
应用 | 活动测量 | 导航 | 导航 | 智能省电 |
,,。
加速计
- • 通过 的iOS 设备提供的内置的加速计,可以确定设备什么时候移动,移动了多少距离以及设备的方向
- • 在应用程序中,使用 UIAccelerometer 类来接收加速计数据,通过类方法sharedAccelerometer 可以获得该类的实例
- • 使用加速计需要设置其更新间隔状语从句代理店,此后,在指定的时间间隔,会收到代理方法 加速度:didAccelerate:的回调
- • 该代理方法收到一个指向加速计的指针和一个指向UIAcceleration 对象的指针
- • 该加速对象包含: x ,ÿ ,Ž 和时间戳四个属性,其中x ,Ÿ ,Ž 是设备在这三个方向上的重力加速度,单位克
加速计坐标系- 注意Ÿ 轴的方向
加速计开发测试需要注意
• 加速计的应用只能在真机上开发测试
加速计演练
• 演练1
- 在加速计回调方法中更新小球视图位置,运行并测试
效果 • 演练2
- 引入QuartzCore.framework 方法- 定义CADisplay L 墨游戏时钟,并在游戏时钟指定的更新
方法中更新小球视图位置- 运行并对比两种方式的实现效果
加速计演练小结
• 加速计使用步骤- 1. 获取共享加速计对象 - 2. 设置加速计数据更新频率 - 3. 设置加速计对象代理
• 让加速计负责速度更新,CADislpayLink 负责界面更新的好处
- - 1 游戏效果更加平滑
- - 2. 界面表示和游戏逻辑可以得到拆分,便于游戏扩展并引入 MVC 设计模式
- - 。3 使用时钟更新,需要注意小球位置的修正
• UIAccelerometer 虽然已经停止更新,但是目前还是有一定数量的应用中使用到了该技术
CoreMotion 框架
• 在的iOS4 之前,加速度计由UIAccelerometer类来负责采集工作,而电子
罗盘则由核心地段接管
• 随着iPhone4 的推出,由于加速度计的升级以及陀螺仪的引入, 与 Motion 相关的编程成为重头戏,所以,苹果在iOS4 中增加了一个专门负责该方面处理的框架- 核心运动框架
• 核心运动不仅能够提供实时的加速度值状语从句旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维姿态信息
核心运动框架结构示意图-MotionManager中
核心动态获取数据的两种方式
• 推送(采集所有数据-做运动仿真更好) • 拉(在需要是获取采样数据)
核心运动推演练
• 核心运动Push 使用步骤- 1. 实例化Motion 管理器 - 2. 判断传感器是否可用 - 3. 设定传感器数据更新频率 - 4. 启动传感器更新, Push 方式更新数据
增加新的功能
• 点击屏幕停止或者启动加速计数据采集
使用dispatch_once 创建MotionManager中的单例
• 好处:- 线程安全
- 很好满足静态分析器要求 - 和自动引用计数(ARC )兼容 - 仅需要少量代码
• 使用方法扩展功能,在AppDelegate中中定义
@财产 (强大的, 非原子, 只读)CMMotionManager * sharedMotionManger; !
调整代码
• 从的AppDelegate 中获得共享运动管理器
- 1, 获得AppDelegate中的引用
- 2 通过AppDelegate中的引用获得其中只读的 sharedMotionManager 对象引用