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 条评论
登录 后参与评论

相关文章

来自专栏针针小站

【Soft】在电脑上也能看电视 – Hello TV UWP

5835
来自专栏编程

C加加游戏编程,大神十年的绝技,正确的入门,这才叫学习

1.《C++ primer》 2.《Windows程序设计》 3.《VC++深入详解》 4.《Windows核心编程》 5.《Effective STL》 6....

2276
来自专栏程序员宝库

程序员遇到 Bug 时的 30 个反应,你是哪一种?

来源:techug.com http://www.techug.com/post/programmer-reaction-with-30-bugs.html 开...

3609
来自专栏姬小光

盲人程序员的编程生涯

首先声明一下,这篇文章虽然在微信平台不是我首发,但确实是小鸡君原创,因为文章写了有两年了,所以 CSDN ,博客园,还有两个公众号 程序员之家,安卓应用频道 等...

913
来自专栏HBStream流媒体与音视频技术

DirectShow捕获+mencoder+ffmpeg+sox 打造小巧的音视频制作、加工软件

2737
来自专栏JAVA技术zhai

一篇文章把本该属于你的源码天赋还给你

"有人阅读过 mybatis 的源码吗 ?就看一个初始化过程就看的已经头晕眼花了,小伙伴们支支招吧!"

1643
来自专栏Thinks

HTML5设计原理(上)

今天我想跟大家谈一谈HTML5的设计。主要分两个方面:一方面,当然了,就是HTML5。我可以站在这儿只讲HTML5,但我并不打算这样做,因为如果你想了解HTML...

371
来自专栏java一日一条

程序员遇到Bug时的30个反应

开发应用程序是一个非常有压力的工作。没有人是完美的,因此在这个行业中,代码中出现bug是相当普遍的现象。面对bug,一些程序员会生气,会沮丧,会心烦意乱,甚至会...

401
来自专栏腾讯大讲堂的专栏

1024丨腾讯第一首程序员之歌【Code代码】

“发布总是在半夜 回滚是永远的愁”。 内存泄漏、深夜发布、需求变更,这些熟悉的词语和场景,相信对于每个程序员朋友来说,都有着独特的记忆和感触,在此谨祝全天下的程...

2734
来自专栏ATYUN订阅号

【学术】厉害了我的哥,国外技术大咖仿造了谷歌的Arts &Culture,找到古代的“你”

当我激动的室友第一次向我展示肖像搜索功能时,我对结果感到很惊讶(也觉得有点受侮辱)。对于那些不熟悉它的人来说,谷歌Arts & Culture的这一功能让你可以...

3294

扫码关注云+社区