ios实现简单随便移动的AR功能

先上个最终的效果动态图,

1、首先我们要自定义一个相机界面,可以用AVCaptureSession来自定义,不需要其他按钮,只有一个预览的界面;

2、我们要画一个简单的雷达图,可以用CGContextRef来简单实现,雷达图用来显示你跟你附近的用户(物体)的距离,通过跟实际物体的经纬度来算两点之间的距离,通过一定的比例来映射到雷达图上,两点之间的距离计算公式如下:

//两点的经纬度计算距离
-(float) DistanceFromCoordinates:(CLLocationCoordinate2D) myDot other:(CLLocationCoordinate2D)otherDot
{ 

 double EARTH_RADIUS = 6378137.0; 

 double radLat1 = (myDot.latitude * M_PI / 180.0);
 double radLat2 = (otherDot.latitude * M_PI / 180.0);
 double a = radLat1 - radLat2;
 double b = (myDot.longitude - otherDot.longitude) * M_PI / 180.0;
 double s = 22 * asin(sqrt(pow(sin(a / 2), 2)
        + cos(radLat1) * cos(radLat2)
        * pow(sin(b / 2), 2)));
 s = s * EARTH_RADIUS;
 s = round(s * 10000) / 10000; 

 return s; 

}

要算物体在雷达图上的显示位置,根据三角函数,sinA=对边/斜边,cosA=邻边/斜边,斜边我们已经有了,就是两点之间的距离,那么我们就需要知道一个角度,才能算出一条边,通过这条边跟半径的加减,就可以算出这个物体在雷达图上的位置。所以我们先要算两点的方位角,看下面的一张图:

这个维基上的一张方位角的解释图,我们可以同通过tan2函数来计算,公式如下:

- (float)getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
{
 float fLat = DegreesToRadians(fromLoc.latitude);
 float fLng = DegreesToRadians(fromLoc.longitude);
 float tLat = DegreesToRadians(toLoc.latitude);
 float tLng = DegreesToRadians(toLoc.longitude); 

 float degree = RadiansToDegrees(atan2(sin(tLng-fLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(tLng-fLng))); 

 if (degree >= 0) {
  return degree;
 } else {
  return (360+degree);
 } 

}

3、要实现雷达图跟随手机旋转而转动,这里我们要用到指南针的原理,通过CLLocationManager管理类,里面有个CLHeading类,我们可以实现指南针,看这个类的结构:

里面有真北,磁北,还有磁力值在x,y,z三轴上的磁力值,不过当我用到这三个值的时候,发现有问题,在前后移动手机的时候,发现这个值变化有停顿,如果用这个值来实现移动会导致不流畅,所以我又用了陀螺仪数据,通过CMMotionManager这个管理类来获取手机移动摆动的角度,用来计算手机前后移动的时候,物体在手机界面上下的位置。

-(void) startMotion
{ 

 if (![_mgr isDeviceMotionActive] && [_mgr isDeviceMotionAvailable])
 { 

 //设置采样间隔
  _mgr.deviceMotionUpdateInterval = 0.1; 

 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

  [_mgr startDeviceMotionUpdatesToQueue:queue
   withHandler:^(CMDeviceMotion * _Nullable motion,
      NSError * _Nullable error) { 

      double gravityX = motion.gravity.x;
      double gravityY = motion.gravity.y;
      double gravityZ = motion.gravity.z; 

   if (gravityY<=0 && gravityY>=-1)
   { 

 //获取手机的倾斜角度(zTheta是手机与水平面的夹角, xyTheta是手机绕自身旋转的角度):
  zTheta = atan2(gravityZ,sqrtf(gravityX*gravityX+gravityY*gravityY))/M_PI*180.0; 

}
  [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self updataPoint]; 

    }]; 

  //[self performSelectorOnMainThread:@selector(updataPoint) withObject:nil waitUntilDone:NO]; 

  }]; 

 }
}

4、通过计算角度区间来显示手机上的物体显示还隐藏,也就是说在雷达图上的点进入扇形可见的区域就显示出物体并且移动,超出就隐藏起来。还有一点,就是要算碰撞检测的手机上物体与物体如果太多,就不能叠在一起,通过错位错开来,可以通过CGRectIntersectsRect来写个算法检测两个矩形是否碰到了。

简单说了下我实现的原理,当然实际做的时候会遇到很多问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • iOS粒子路径移动效果 iOS实现QQ拖动效果
  • iOS实现一个可以在屏幕中自由移动的按钮
(0)

相关推荐

  • iOS实现一个可以在屏幕中自由移动的按钮

    本文主要给大家介绍了利用iOS实现一个可以在屏幕中自由移动的按钮的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍. 效果图如下: 其实实现很简单,只需要写.m就可以了 示例代码 #import "CrossBtnVC.h" @interface CrossBtnVC () { CGPoint beginPoint; CGFloat rightMargin; CGFloat leftMargin; CGFloat topMargin; CGFloat bottomM

  • iOS粒子路径移动效果 iOS实现QQ拖动效果

    粒子效果,QQ拖动效果,实现很简单,具体代码如下 一.图示 二.分析 我们要实现的如果如上面的图示,那么我们可以按照下面的步骤操作: 第一步:我们的红点其实是一个UIButton.创建一个BageValueView继承自UIButton 第二步:初始化的时候,初始化控件,设置圆角,修改背景.文字颜色 第三步:添加手势.在手势的处理中我们,我们需要让当前控件随着手指移动而移动. 第四步:控件一开始创建的时候,其实有两个圆,一个就是我们能够拖动的大圆,另外一个就是原始位置上会改变大小的圆.这一步骤中

  • ios实现简单随便移动的AR功能

    先上个最终的效果动态图, 1.首先我们要自定义一个相机界面,可以用AVCaptureSession来自定义,不需要其他按钮,只有一个预览的界面: 2.我们要画一个简单的雷达图,可以用CGContextRef来简单实现,雷达图用来显示你跟你附近的用户(物体)的距离,通过跟实际物体的经纬度来算两点之间的距离,通过一定的比例来映射到雷达图上,两点之间的距离计算公式如下: //两点的经纬度计算距离 -(float) DistanceFromCoordinates:(CLLocationCoordinat

  • IOS 实现简单的弹幕功能

    前言 简单实现弹幕功能,表跟我谈效率,但也有用队列控制同时弹的数量. 正文 代码实现: let DANMAKU_SPEED: CGFloat = 150 // 弹幕每秒移动速度 let DANMAKU_SPACE_TIME: NSTimeInterval = 1 // 弹幕之间的时间间隔 let DANMAKU_MAX_ROW = 3 // 最多同时弹幕行数 let danmakuFont = UIFont.systemFontOfSize(18) // 弹幕字体大小 var rowArray

  • iOS实现简单的头部缩放功能

    本文通过实例代码给大家介绍了iOS实现简单的头部缩放功能.实现思路有头部视图,滚动视图,控制头部动画等多个示例代码块,大家可以参考下本文. 简单实现并集成一个头部缩放的功能,适用于UIScrollView以及其子类. 头部伴随模糊效果放大缩小,并在一定位置时悬停充当导航栏.这里提供实现思路,如有符合可直接使用. 效果如下图. 实现: 首先分解为两部分,一部分为头部视图,一部分为滚动视图.头部视图负责展示,滚动视图负责控制头部视图如何展示,比如放大和缩小. 一:头部视图 头部视图拆解为负责展示图片

  • iOS实现简单计算器功能

    本文实例为大家分享了iOS实现简单计算器功能的具体代码,供大家参考,具体内容如下 //  ZYAppDelegate.m //  Calculator // //  Created by mac on 15-7-30. //  Copyright (c) 2015年 zhiyou. All rights reserved. //   #import "ZYAppDelegate.h"   @implementation ZYAppDelegate   - (BOOL)applicati

  • iOS实现简单计算器小功能

    本文实例为大家分享了iOS实现简单计算器小功能的具体代码,供大家参考,具体内容如下 SimpleCaculatorViewController.h // //  SimpleCaculatorViewController.h //  SimpleCaculator // //  Created by LI Junui on 14-2-12. //  Copyright (c) 2014年 LEE JUNHUI. All rights reserved. //   #import <UIKit/U

  • IOS提醒用户重新授权打开定位功能

    iOS 8及以上版本最不为人知的一个特点是与应用设置的深层链接,用户可以根据APP的需要授权启用位置.通知.联系人.相机.日历以及健康等设置. 大多数应用程序仅仅是弹出一个包含操作指令的警示窗口,如"进入设置>隐私>位置>OUR_APP".例如,推特的应用程序有一个更为精致和友好的指示对话框,所以我就把它当做一个例子来使用(可惜大多数应用程序都会有一个非常糟糕的版本). 我现在以一个心情沮丧用户的身份写这个帖子,希望更多的iOS开发者能与用户设置建立直接的深层链接,尤

  • iOS开发微信收款到账语音提醒功能思路详解

    一.背景 为了解决小商户老板们在频繁交易中不方便核对.确认到账的痛点,产品MM提出了新版本需要支持收款到账语音提醒功能.这篇文章总结了开发过程中遇到的坑和一些小技巧. 二.技术方案 后台唤醒App 收款到账语音提醒需要收款方在收到款后,播放一段TTS合成语音播报金额,微信在前台时可以通过模板消息将需要播报的金额带下来,再请求TTS数据并播放,但是app在挂起或者被kill掉的情况下要如何请求语音数据并播放呢? iOS提供了两种方式唤醒处于挂起或已经被kill掉的app.分别是Silent Not

  • iOS实现微信朋友圈视频截取功能

    序言 微信现在这么普及,功能也做的越来越强大,不知大家对于微信朋友圈发视频截取的功能或者苹果拍视频对视频编辑的功能有没有了解(作者这里也猜测,微信的这个功能也是仿苹果的).感觉这个功能确实很方便实用,近来作者也在研究音视频功能,所以就实现了一下这个功能. 功能其实看着挺简单,实现过程也踩了不少坑.一方面记录一下:另一方面也算是对实现过程的再一次梳理,这样大家看代码也会比较明白. 效果 我们先看看我实现的效果 实现 实现过程分析 整个功能可以分为三部分: 视频播放 这部分我们单独封装一个视频播放器

  • Android简单的短信验证功能的实现代码

    相信有很多朋友在做三方登陆的时候会加入短信验证的功能,最近刚好被分配安排实现这一需求,本人新手一枚,特地去网上搜了资料,目前用的比较多的大汉.云通讯还有MOB的smssdk,对比之下,最终选择了完全免费的MOB产品试试手,下面就是我在使用sdk过程中一些心得,希望看到的大神给点建议,喜欢的给个小心心就好. 首先我上网百度了下Mob的官网(http://www.mob.com/)作为第一次使用习惯性的先打开文档介绍,关于使用方法这里介绍的算是比较详细的,我这里也不做赘述了,整个文档浏览了一遍,介绍

  • Vue实现简单基础的图片裁剪功能

    目录 一.准备工作 二.基本结构 三.添加功能 onMouseDown onMouseMove onMouseUp onMouseLeave 四.总结 近日,在写公司项目的时候接到一个需求:对已加载的大图中可截取部分图片用来入库或者布控,说白了就是截图嘛,于是我使用了vue-cropper来完成.完成后因为前边也没自己实现过,所以就想看看是如何实现的.因此本文写的是最简易基础的实现方法用作学习,肯定有考虑不周的地方,还请大家谅解.工作中还是使用成熟的轮子为好. 一.准备工作 本文中我所使用的环境

随机推荐