ARKit浅析V1.0

一、ARKit介绍

苹果公司在WWDC2017 上发布了ARKit,开发者可以使用这套框架在iPhone和iPad上创建属于自己的AR体验。

增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实。

需要注意的是,ARKit虽说是iOS11提供的框架,但是并非升级到iOS11都能使用。必须要A9以及以上的处理器才能使用。以下是ARKit 开发环境:

1.Xcode版本:Xcode9及以上

2.iOS系统:iOS11及以上

3.iOS设备:处理器A9及以上(6S机型及以上)

4.MacOS系统:10.12.4及以上(安装Xcode9对Mac系统版本有要求)

二、ARKit工作原理和流程

首先需要说明的是,ARKit并不是一个能够独立运行的框架,其依赖SceneKit框架。简单点说,ARKit框架主要提供相机相关的工作,主要负责捕捉和分析现实世界。而展示虚拟物体部分,则是依赖SceneKit提供的能力。如果没有SceneKit,那ARKit只是一个相机而已。(SceneKit是苹果在iOS8中集成的一套3D引擎框架)

下图是ARKit中主要类的关系图:

上图中,ARSCNView可以认为是一个容器,代表的就是看到的现实世界。其作用有两个:

1、如上图右边部分:管理ARSession,在这里简单认为ARSession是管理ARKit世界的上下文,其管理者相机的属性设置,也负责向ARSCNView输出捕捉到的显示世界。

2、如上图左边部分:显示我们添加进去的AR物体,这里可以是一个3D物体,也可以是一个2D物体。这里从继承关系来看,ARSCNView、SCNScene、SCNNode等类是从SceneKit中继承过来的。

从上图可以简单的看出ARKit的工作原理,ARKit框架提供相机能力,在手机上捕捉并构建现实世界。SceneKit提供模型能力,在手机的“现实世界”中添加虚拟物体。

以下是一段代码,可以简单的展示一个虚拟物体:

1)首先需要为ARSession 配置运行参数,参数其实挺简单。

2)使用SCNScene加载3D模型,然后设置成主场景。

3)上面使用的是简答的设置主场景的方式,还可以通过addChildNode的方式加载

从上述代码中可以看到,使用ARKit显示一个3D的虚拟物体 其实很简单。这得益于苹果对于技术细节的高度封装,开发者只需要关注自己的产品逻辑即可。

三、ARKit API介绍

ARKit框架的API其实并不多。下图就是整个ARKit框架提供的类。下面就这几个主要的类(介绍主要的属性)做一个简单的说明。

1 ARSCNView

之前介绍过,ARKit支持3D和2D场景,ARSCNView是3D的AR场景视图,是从SceneKit框架中的SCNView继承过来的,其内部最重要的属性是

@property (nonatomic, weak, nullable) id delegate;
@property (nonatomic, strong) ARSession *session;

其中session 主要负责管理ARSession,前面介绍过,这个类主要是管理整个ARKit的上下文,可以理解成管理整个AR世界的捕捉和创建

ARSCNViewDelegate 代理则是负责回调虚拟节点创建移除的一些关键事件回调,如下图所示,从名字上就可以看出其作用,这里就不再一一赘述其作用了

2 ARSession

ARSession是一个连接底层与AR视图之间的桥梁。ARSession可以偶去相机的一些关键数据,主要有两种方式:一、通过delegate,可以不断的获知相机位置;二、通过ARSession的CurrentFrame属性来获取;

其内部最重要的属性是:

// 代理
@property (nonatomic, weak) id  delegate;
// 获取当前的相机参数,包括位置等
@property (nonatomic, copy, nullable, readonly) ARFrame *currentFrame;
// 管理会话追踪参数
@property (nonatomic, copy, nullable, readonly) ARSessionConfiguration *configuration;

 最重要的是一些代理方法

//session KVO观察者
@protocol ARSessionObserver <NSObject>
@optional
/**
 session失败
 */
- (void)session:(ARSession *)session didFailWithError:(NSError *)error;
/**
相机改变追踪状态
 */
- (void)session:(ARSession *)session cameraDidChangeTrackingState:(ARCamera *)camera;
/**
 session意外断开(如果开启ARSession之后,APP退到后台就有可能导致会话断开)
 */
- (void)sessionWasInterrupted:(ARSession *)session;
/**
session会话断开恢复(短时间退到后台再进入APP会自动恢复)
 */
- (void)sessionInterruptionEnded:(ARSession *)session;
@end
#pragma mark - ARSessionDelegate
@protocol ARSessionDelegate <ARSessionObserver>
@optional
/**
 相机当前状态(ARFrame:空间位置,图像帧等)更新
 */
- (void)session:(ARSession *)session didUpdateFrame:(ARFrame *)frame;
/**
添加锚点
 */
- (void)session:(ARSession *)session didAddAnchors:(NSArray*)anchors;
/**
刷新锚点
 */
- (void)session:(ARSession *)session didUpdateAnchors:(NSArray*)anchors;
/**
移除锚点
 */
- (void)session:(ARSession *)session didRemoveAnchors:(NSArray*)anchors;
@end

 3 ARSessionConfiguration

ARSessionConfiguration会话追踪配置,主要就是追踪相机的配置

4 ARAnchor

ARAnchor表示一个物体在3D空间的位置和方向。

5 ARCamera

记录相机的一些参数。一般情况下,我们并不需要设置这个类,系统会帮我们配置好

6 ARFrame

ARFrame主要是追踪相机当前的状态,这个状态不仅仅只是位置,还有图像帧及时间等参数

7 ARHitTestResult

点击回调结果,这个类主要用于虚拟增强现实技术(AR技术)中现实世界与3D场景中虚拟物体的交互。 比如我们在相机中移动。拖拽3D虚拟物体,都可以通过这个类来获取ARKit

所捕捉的结果

上文主要参考官方文档和网络博客:http://blog.csdn.net/u013263917/article/details/72903174

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Renderbus云渲染农场

好用的3dsmax插件分享

3ds max本身已经是一款非常强大的三维动画渲染和制作软件了,但为了提高CG输出质量并加快工作流程,还是有不错的插件可以用作3ds max本地工具的替代品,还...

2241
来自专栏数据结构与算法

BZOJ1191: [HNOI2006]超级英雄Hero(二分图匹配)

现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的

982
来自专栏星汉技术

计算机基础(一)

2277
来自专栏木制robot技术杂谈

利用爬虫和树莓派3打造自己的语音天气闹钟

前言 前不久又一次一个人在他乡过了生日,悄悄买了一台树莓派3送给自己做生日礼物。终于算是实现了大学以来一直的一个小愿望。买回来之后当然不能让他落灰,于是就利用自...

1.3K10
来自专栏牛客网

2017年终总结:秋招心路历程+安卓/java知识总结Android 知识点总结Java知识点总结

一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值...

4398
来自专栏phodal

全栈工程师的百宝箱:图形工具篇

为了防止我下次钱包丢失,我正在努力打造一个智能(带GPS、蓝牙)的钱包,所以最近文章会少一点。 在上一篇《全栈工程师的百宝箱:黑魔法之文档篇》我们介绍了一些文档...

20310
来自专栏hightopo

基于HTML5技术的电力3D监控应用(三)

1213
来自专栏知晓程序

这款小程序,想要和你一起「虚度时光」

一个人在家的时候,从来不敢在下午睡觉,因为,等你醒来,你就会发现屋内漆黑一片,屋外点点灯光,好像被世界抛弃了一样,孤独在那一刻表现的淋漓尽致。

521
来自专栏轮子工厂

Linux系统的前世今生

上世纪六十年代,人们还在用批处理计算机,也就是一次性给一批任务到计算机,然后等待结果,中途不能和计算机进行交互,而且准备作业需要耗费大量时间。于是1965年,贝...

782
来自专栏儿童编程

《爱溜达的小黄猫》——儿童学编程Scratch2”运动(Motion)“部分

Scratch2非常容易上手,无论对儿童还是零基础的成年人来说,都非常有趣。操作起来就像搭积木一样简单有趣。也许你印象里的编程是满屏代码,不知所云。而这里,编写...

2685

扫码关注云+社区