ARKit浅析V1.0

2018-01-04 15:25:21 浏览数 (1)

一、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继承过来的,其内部最重要的属性是

代码语言:javascript复制
@property (nonatomic, weak, nullable) id delegate;
@property (nonatomic, strong) ARSession *session;

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

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

2 ARSession

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

其内部最重要的属性是:

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

 最重要的是一些代理方法

代码语言:javascript复制
//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 人点赞