• IOS 特定于设备的开发:Core Motion基础


        Core Motion框架集中了运动数据处理。该框架是在IOS 4 SDK中引入的,用于取代accelerometer加速计访问。它提供了对3个关键的机载传感器的集中式监测。这些传感器有陀螺仪、磁力计和加速计组成,其中陀螺仪用于测量设备的旋转,磁力计提供了一种测量罗盘方位的方式,加速计用于监测沿着3根轴的重力变化。第四个入口点称为设备移动(device motion),他把全部3中传感器都结合进单个监测系统中。

       Core Motion使用来自这些传感器原始值创建可度的测量结果,主要表现为力向量的形式。可测量的项包括以下属性:

         》设备姿势(attitude):设备相对于某个参照画面的方向。姿势被表示为摇晃,前倾和左右摇摆的角度,他们都以弧度为单位。

         》旋转速率(rotationRate):设备围绕它的三根轴中的每一根轴旋转的速率。旋转包括x、y和z角速度值,他们以弧度/秒为单位。

         》重力(gravity):设备当前的加速度向量,由正常的重力场提供。重力的单位是g's,分别沿着x、y和z轴来测量。每个单位代表由地球提供的标准重力加速度(9.8米/秒的平方)

         》用户加速度(userAcceleration):用户提供的加度素向量。像重力一样,用户加速度的单位也是g's,分别沿着x、y和z轴来测量。当把它们加到一起时,用户向量和重力向量代表给设备提供的总加速度。

         》磁场(magneticField):代表设备临近区域的总磁场的向量。磁场是沿着x,y和z轴以为特斯拉(microtesla)为单位测量的。还提供了校准精度,通知应用程序有关磁场测量的质量。

    1.测试传感器

    你可以使用在Info.plist中设置使用或排除机载传感器,也可以在程序中来测试每种可能的Core Motion支持:

    @property (nonatomic , strong)CMMotionManager *motionManager;
    
    
     _motionManager = [[CMMotionManager alloc]init];
        //监测陀螺仪
        if(_motionManager.gyroAvailable)
        {
            [_motionManager startGyroUpdates];
        }
        
        //监测磁力计
        if(_motionManager.magnetometerAvailable)
        {
            [_motionManager startMagnetometerUpdates];
        }
        
        //监测重力感应器
        if(_motionManager.accelerometerAvailable)
        {
            [_motionManager startAccelerometerUpdates];
        }
        
        //监测Device Motion
        if(_motionManager.deviceMotionAvailable)
        {
            [_motionManager startDeviceMotionUpdates];
        }

    开始更新不会产生像使用UIAccelerometer时遇到的委托回调机制。作为替代,你将负责轮询每个值,或者可以使用基于块的更新机制,执行在每次更新时提供的一个块(例如,startAccelerometerUpdatesToQueue:withHandler:).

    2.使用Core motion做加速计蝴蝶飞的程序如下

    @implementation TestBedViewController
    {
        UIImageView *butterfly;
        
        float xaccel;
        float xvelocity;
        float yaccel;
        float yvelocity;
        
        float mostRecentAngle;
        
        CMMotionManager *motionManager;
        NSTimer *timer;
    }
    
    - (void) tick
    {
        butterfly.transform = CGAffineTransformIdentity;
        
        // Move the butterfly according to the current velocity vector
        CGRect rect = CGRectOffset(butterfly.frame, xvelocity, 0.0f);
        if (CGRectContainsRect(self.view.bounds, rect))
            butterfly.frame = rect;
        
        rect = CGRectOffset(butterfly.frame, 0.0f, yvelocity);
        if (CGRectContainsRect(self.view.bounds, rect))
            butterfly.frame = rect;
        
        butterfly.transform = CGAffineTransformMakeRotation(mostRecentAngle + M_PI_2);
    }
    
    - (void) shutDownMotionManager
    {
        NSLog(@"Shutting down motion manager");
        [motionManager stopAccelerometerUpdates];
        motionManager = nil;
        
        [timer invalidate];
        timer = nil;
    }
    
    - (void) establishMotionManager
    {
        if (motionManager)
            [self shutDownMotionManager];
        
        NSLog(@"Establishing motion manager");
        
        // Establish the motion manager
        motionManager = [[CMMotionManager alloc] init];
        if (motionManager.accelerometerAvailable)
            [motionManager
             startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
             withHandler:^(CMAccelerometerData *data, NSError *error)
             {
                 // extract the acceleration components
                 float xx = -data.acceleration.x;
                 float yy = data.acceleration.y;
                 mostRecentAngle = atan2(yy, xx);
                 
                 // Has the direction changed?
                 float accelDirX = SIGN(xvelocity) * -1.0f;
                 float newDirX = SIGN(xx);
                 float accelDirY = SIGN(yvelocity) * -1.0f;
                 float newDirY = SIGN(yy);
                 
                 // Accelerate. To increase viscosity lower the additive value
                 if (accelDirX == newDirX) xaccel = (abs(xaccel) + 0.85f) * SIGN(xaccel);
                 if (accelDirY == newDirY) yaccel = (abs(yaccel) + 0.85f) * SIGN(yaccel);
                 
                 // Apply acceleration changes to the current velocity
                 xvelocity = -xaccel * xx;
                 yvelocity = -yaccel * yy;
             }];
        
        
        // Start the physics timer
        timer = [NSTimer scheduledTimerWithTimeInterval: 0.03f target: self selector: @selector(tick) userInfo: nil repeats: YES];
    }
    
    - (void) initButterfly
    {
        CGSize size;
        
        // Load the animation cells
        NSMutableArray *butterflies = [NSMutableArray array];
        for (int i = 1; i <= 17; i++)
        {
            NSString *fileName = [NSString stringWithFormat:@"bf_%d.png", i];
            UIImage *image = [UIImage imageNamed:fileName];
            size = image.size;
            [butterflies addObject:image];
        }
        
        // Begin the animation
        butterfly = [[UIImageView alloc] initWithFrame:(CGRect){.size=size}];
        [butterfly setAnimationImages:butterflies];
        butterfly.animationDuration = 0.75f;
        [butterfly startAnimating];
        
        // Set the butterfly's initial speed and acceleration
        xaccel = 2.0f;
        yaccel = 2.0f;
        xvelocity = 0.0f;
        yvelocity = 0.0f;
        
        // Add the butterfly
        butterfly.center = RECTCENTER(self.view.bounds);
        [self.view addSubview:butterfly];
    }
    
    - (void) loadView
    {
        [super loadView];
        self.view.backgroundColor = [UIColor whiteColor];
        [self initButterfly];
    }
  • 相关阅读:
    ORA-04013,CACHE 值必须小于CYCLE值;解决方案
    .net 调用WCF服务接收数据对象属性为空
    各JAVA JDK版本下载地址
    记录一次基于Echart的数据可视化平台开发
    Swiper轮播使用记录--一个页面有多个DIV区域使用swiper进行轮播
    Echart使用记录-动态设置series的时候,设置了color属性,但所有的柱状图显示灰白色
    记录一次SignalR服务的搭建注意事项
    C#关于ListBox绑定list,不会刷新数据的问题
    关于bootstrap-fileinput上传后删除选中上传的文件,回到最初的选择文件界面
    Oracle 数据库 alert日志及trace日志的清理
  • 原文地址:https://www.cnblogs.com/haibosoft/p/4179697.html
Copyright © 2020-2023  润新知