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

 //根据陀螺仪的四元数转换为矩阵
+ (GLKMatrix4)calculateMatrixFromQuaternion:(CMQuaternion*)quaternion orientation:(AVCaptureVideoOrientation) orientation{
float xx = quaternion->x * quaternion->x;
float yy = quaternion->y * quaternion->y;
float zz = quaternion->z * quaternion->z;
float xy = quaternion->x * quaternion->y;
float wz = quaternion->w * quaternion->z;
float wy = quaternion->w * quaternion->y;
float xz = quaternion->x * quaternion->z;
float yz = quaternion->y * quaternion->z;
float wx = quaternion->w * quaternion->x; float r00 = - * (yy + zz);
float r01 = * (xy - wz);
float r02 = * (wy + xz);
float r03 = ; float r10 = * (xy + wz);
float r11 = - * (xx + zz);
float r12 = * (yz - wx);
float r13 = ; float r20 = * (xz - wy);//xy - wy
float r21 = * (yz + wx);
float r22 = - * (xx + yy);
float r23 = ; float r30 = ;
float r31 = ;
float r32 = ;
float r33 = ; return GLKMatrix4Make(r00,r01,r02,r03,
r10,r11,r12,r13,
r20,r21,r22,r23,
r30,r31,r32,r33);
} //当前屏幕的方向
@property (nonatomic, readwrite, assign) AVCaptureVideoOrientation orientation;
//开启陀螺仪
- (void)updateAngleFromAttitudeSensor{
if(self.cmmotionManager){ }else{
self.cmmotionManager = [[CMMotionManager alloc] init];
self.cmmotionManager.deviceMotionUpdateInterval = 1.0/25.0;
self.cmmotionManager.gyroUpdateInterval = 1.0/25.0;
self.cmmotionManager.showsDeviceMovementDisplay = YES; NSOperationQueue *mQueue = [[NSOperationQueue alloc]init];
__weak typeof(self) wSelf = self;
[wSelf.cmmotionManager startDeviceMotionUpdatesToQueue:mQueue withHandler:^(CMDeviceMotion * _Nullable motion, NSError * _Nullable error){
CMAttitude *attitude = motion.attitude;
if (attitude == nil) {
return;
} //UID
CMQuaternion quaternion = attitude.quaternion;
wSelf.sensorMatrix = GLKMatrix4Identity;
wSelf.sensorMatrix = [GyroscopeUtil calculateMatrixFromQuaternion:&quaternion orientation:orientation]; wSelf.sensorMatrix = GLKMatrix4RotateX(wSelf.sensorMatrix,M_PI_2);
wSelf.sensorInverseMatrix = GLKMatrix4Identity; bool isInvertible = true;
wSelf.sensorInverseMatrix = GLKMatrix4Invert(wSelf.sensorMatrix, &isInvertible);
}];
}
}

iOS平台使用陀螺仪传感器的更多相关文章

  1. iOS开发——高级篇——传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  2. 【android】移植IOS视图响应陀螺仪交互行为

    IOS有个很有趣味的特性:背景图片可以响应陀螺仪方向的变化,去改变X.Y轴上的值,从而让整个界面看着充满着灵性.具体步骤是:解锁苹果产品,在IOS7以上,摆动手势,观察桌面背景图片的变化. 刚好,我们 ...

  3. 通过OpenGL ES在iOS平台实践增强现实

    http://www.cnblogs.com/elvisyzhao/p/3398250.html 本文采用OpenGL ES 1固定渲染管线实现,目标为在设备拍摄到的现实世界中,绘制世界坐标轴,并根据 ...

  4. 通过OpenGL ES在iOS平台实践增强现实(一)

    http://ios.9tech.cn/news/2013/1108/38495.html 1.本文采用OpenGL ES 1固定渲染管线实现,目标为在设备拍摄到的现实世界中,绘制世界坐标轴,并根据设 ...

  5. iOS平台快速发布HT for Web拓扑图应用

    iOS平台一直是封闭的生态圈,iOS开发者要缴纳年费加入开发者计划才可进行iOS平台的APP开发测试,所开发的APP需要上传到App Store经过苹果审核以后才可对外发布.如果要开发企业内部应用,则 ...

  6. (译)cocos2d-x跨android&ios平台开发入门教程

    免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作 ...

  7. [原创]自定义控件之AndroidSegmentControlView,仿IOS平台UISegmentControlView,继承自View

    版权声明:本文为博主原创文章,转载请注明出处. 控件简介 UISegmentControl在IOS平台的App中非常常见,其控件如下图所示: 这种控件的主要作用是动态的更改界面的显示内容,一般应用于内 ...

  8. [转]ios平台内存常见问题

    本文转自CocoaChina,说的满详细的: 链接地址:http://www.cocoachina.com/bbs/read.php?tid=94017&keyword=%C4%DA%B4%E ...

  9. U3D中IOS平台泛型方法尽少使用

    U3D的IOS最小运行库use micro mscorlib是不包含泛型反射方法的,如FieldType.GetGenericArguments方法.所以尽量少用List而直接使用array. 另外请 ...

随机推荐

  1. X86 Socket 通信

    struct txd_socket_handler_t { int fd; }; txd_socket_handler_t *txd_tcp_socket_create() { txd_socket_ ...

  2. [THINKING IN JAVA]操作符

    3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...

  3. Unity5 AssetBundle

    设置assetBundleName AssetImporter importer = AssetImporter.GetAtPath(p); importer.assetBundleName = x; ...

  4. Thread基本介绍

    1.Thread类介绍 Class Thread java.lang.Object java.lang.Thread All Implemented Interfaces: Runnable Dire ...

  5. unity, reduce android size

    参考: https://www.youtube.com/watch?v=TYSmf_zgtZo http://stackoverflow.com/questions/41087220/how-to-u ...

  6. break,continue的使用

    break,continue 使用break命令允许跳出所有循环下面的例子中,脚本进入死循环直至用户输入数字大于5.要跳出这个循环,返回到shell提示符下,就要使用break命令. #!/bin/b ...

  7. Nginx上传文件失败

    公司用Nginx做反向代理,出现了上传文件失败的问题,通过查看错误日志,发现是上传文件太大的缘故. 通过查找资料,才知道nginx默认最大上传文件时1M.这就需要修改配置文件,将上传文件大小进行修改. ...

  8. ruby HTTPS请求

    require 'uri'require 'net/http'require 'net/https' @toSend = { "date" => "2012-07- ...

  9. 深入详解DataTable

    在学习DataTable知识之前,我们有必要了解下ADO.NET.以下摘自MSDN: ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XM ...

  10. DNS错误 事件4000 4013

    DNS 错误事件4000 4013,无法创建活动目录本身的区域 WINDOWS 2003 DNS服务器无法解析 错误ID 4000 DNS 服务器无法打开 Active Directory.这台 DN ...