iOS平台使用陀螺仪传感器

在移动端开发过程中,有时候会用到陀螺仪传感器获取当前手机的姿态,下面给出iOS端如何获取陀螺仪姿态数据的代码:

 1 //根据陀螺仪的四元数转换为矩阵
 2 + (GLKMatrix4)calculateMatrixFromQuaternion:(CMQuaternion*)quaternion orientation:(AVCaptureVideoOrientation) orientation{
 3     float xx = quaternion->x * quaternion->x;
 4     float yy = quaternion->y * quaternion->y;
 5     float zz = quaternion->z * quaternion->z;
 6     float xy = quaternion->x * quaternion->y;
 7     float wz = quaternion->w * quaternion->z;
 8     float wy = quaternion->w * quaternion->y;
 9     float xz = quaternion->x * quaternion->z;
10     float yz = quaternion->y * quaternion->z;
11     float wx = quaternion->w * quaternion->x;
12     
13     float r00 = 1 - 2 * (yy + zz);
14     float r01 = 2 * (xy - wz);
15     float r02 = 2 * (wy + xz);
16     float r03 = 0;
17     
18     float r10 = 2 * (xy + wz);
19     float r11 = 1 - 2 * (xx + zz);
20     float r12 = 2 * (yz - wx);
21     float r13 = 0;
22     
23     float r20 = 2 * (xz - wy);//xy - wy
24     float r21 = 2 * (yz + wx);
25     float r22 = 1 - 2 * (xx + yy);
26     float r23 = 0;
27     
28     float r30 = 0;
29     float r31 = 0;
30     float r32 = 0;
31     float r33 = 1;
32     
33     return GLKMatrix4Make(r00,r01,r02,r03,
34                       r10,r11,r12,r13,
35                       r20,r21,r22,r23,
36                       r30,r31,r32,r33);
37 }
38 
39 
40 //当前屏幕的方向
41 @property (nonatomic, readwrite, assign) AVCaptureVideoOrientation orientation;
42 //开启陀螺仪
43 - (void)updateAngleFromAttitudeSensor{
44     if(self.cmmotionManager){
45         
46     }else{
47         self.cmmotionManager = [[CMMotionManager alloc] init];
48         self.cmmotionManager.deviceMotionUpdateInterval = 1.0/25.0;
49         self.cmmotionManager.gyroUpdateInterval = 1.0/25.0;
50         self.cmmotionManager.showsDeviceMovementDisplay = YES;
51         
52         NSOperationQueue *mQueue = [[NSOperationQueue alloc]init];
53         __weak typeof(self) wSelf = self;
54         [wSelf.cmmotionManager startDeviceMotionUpdatesToQueue:mQueue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error){
55             CMAttitude *attitude = motion.attitude;
56             if (attitude == nil) {
57                 return;
58             }
59             
60             //UID
61             CMQuaternion quaternion = attitude.quaternion;
62             wSelf.sensorMatrix = GLKMatrix4Identity;
63             wSelf.sensorMatrix = [GyroscopeUtil calculateMatrixFromQuaternion:&quaternion orientation:orientation];
64             
65             wSelf.sensorMatrix = GLKMatrix4RotateX(wSelf.sensorMatrix,M_PI_2);
66             wSelf.sensorInverseMatrix = GLKMatrix4Identity;
67             
68             bool isInvertible = true;
69             wSelf.sensorInverseMatrix = GLKMatrix4Invert(wSelf.sensorMatrix, &isInvertible);
70         }];
71     }
72 }

 

posted @ 2016-12-21 14:37  bky2016  阅读(1626)  评论(0编辑  收藏  举报