AR之—悬空指南针

悬浮的指南针.gif
新建CLLocationManager并设置代理
@property(nonatomic , strong) CLLocationManager *locationManager;//定位管理器

- (void)viewDidLoad {
    [super viewDidLoad];
    //管理者的代理
    self.locationManager.delegate = self;
    // 开始获取用户位置 注意:获取用户的方向信息是不需要用户授权的
    [self.locationManager startUpdatingHeading];
}

- (CLLocationManager *)locationManager
{
    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc] init];
    }
    return _locationManager;
}
当手机方向发生改变时,系统会调用下面方法
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    /*
     magneticHeading 设备与磁北的相对角度
     trueHeading 设置与真北的相对角度, 必须和定位一起使用, iOS需要设置的位置来计算真北
     真北始终指向地理北极点
     */
    // 1.将获取到的角度转为弧度 = (角度 * π) / 180;
    self.pinAngle = newHeading.magneticHeading * M_PI / 180.0;//指针方向
    self.degreeText.string = [NSString stringWithFormat:@"%.0f°",newHeading.magneticHeading];
    SCNMatrix4 transform = SCNMatrix4MakeTranslation(0.3, 0.3, 0.01);
    transform = SCNMatrix4Scale(transform, -0.03, -0.03, 0.03);
    self.degree.transform = transform;
}
ARFrame更新的代理方法
#pragma mark - ARSessionDelegate
- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame {
    SCNMatrix4 transform = SCNMatrix4MakeRotation(self.pinAngle+M_PI, 0,0,1);
    transform = SCNMatrix4Rotate(transform,M_PI_2, -1, 0, 0);
    transform = SCNMatrix4Rotate(transform, M_PI_4, 0, 1, 0);
    transform = SCNMatrix4Scale(transform, 0.5, 0.5, 0.5);
    transform = SCNMatrix4Rotate(transform, -frame.camera.eulerAngles[0], 1, 0, -1);
    transform = SCNMatrix4Translate(transform, 1.0, 0, 1.0);
    self.dashboardNode.transform = transform;//罗盘的位置
    
    SCNMatrix4 pinTransform = SCNMatrix4MakeRotation(M_PI, 0,0,1);
    pinTransform = SCNMatrix4Scale(pinTransform,0.1, 0.125, 0.1);
    pinTransform = SCNMatrix4Rotate(pinTransform,M_PI_2, -1, 0, 0);
    pinTransform = SCNMatrix4Rotate(pinTransform, M_PI_4, 0, 1, 0);
    pinTransform = SCNMatrix4Rotate(pinTransform, -frame.camera.eulerAngles[0], 1, 0, -1);
    pinTransform = SCNMatrix4Translate(pinTransform, 1.0, 0.01, 1.0);

    self.pinNode.transform = pinTransform;//指针的位置
}

demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,502评论 25 709
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,545评论 1 32
  • 几年前在知乎看到一个故事: 从前有个产品经理,一个比较大的项目只写了三页模糊不清的PRD就交给开发,开发当着所有人...
    凌凌西阅读 821评论 0 0
  • 以前的我专注于个人的提高,只顾自己埋头向前,从来不顾和别人的交流。 所以在个人和别人的交流方面显得很欠缺。这方面几...
    智囊团阅读 189评论 0 0

友情链接更多精彩内容