05-ARKit工作原理及流程介绍

5.1-写在前面的话###

初次接触ARKit
ARKit并不是一个独立就能够运行的框架,而是必须要和SceneKit/SpriteKit等引擎框架一起使用才可以,换一句话说,如果只有ARKit,而没有SceneKit/SpriteKit,那么ARKit和一般的相机没有任何区别

相机捕捉到的2D界面如果转化为3D世界的矩阵非常难以理解
ARKit最难的部分在于3D坐标的矩阵转换

5.2-ARKit与SceneKit的关系###

1.AR技术叫做虚拟增强现实,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型。这一过程可以分为两个步骤:
(1):相机捕捉现实世界图像由ARKit来实现
(2):在图像中显示虚拟3D模型由SceneKit来实现,虚拟2D模型由SpriteKit来实现

2.下图是一个框架关系图,通过下图可以看出继承:子类拥有父类所有的属性及方法

(1)框架中中显示3D虚拟增强现实的视图ARSCNView继承于框架中的SCNView,而SCNView又继承于框架中的UIView。
UIView的作用是将视图显示在iOS设备的window中,SCNView的作用是显示一个3D场景,ARScnView的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的。

(2)ARSCNView只是一个视图容器,它的作用是管理一个ARSession,可称之为AR会话。
(3).在一个完整的虚拟增强现实体验中,框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景。
(4).在一个完整的虚拟增强现实体验中,将虚拟物体显示在3D场景中是由框架来完成中:每一个虚拟的物体都是一个节点SCNNode,每一个节点构成了一个场景SCNScene,无数个场景构成了3D世界。
(5).综上所述,ARKit捕捉3D现实世界使用的是自身的功能,这个功能是在iOS11新增的。而ARKit在3D现实场景中添加虚拟物体使用的是父类SCNView的功能,这个功能早在iOS8时就已经添加(SceneKit是iOS8新增)可以简单的理解为:ARSCNView所有跟场景和虚拟物体相关的属性及方法都是自己父类SCNView的。

05-ARKit工作原理及流程介绍_第1张图片

5.3-ARKit工作原理###

5.3.1-ARSCNView与ARSession####

1.ARKit提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView和2D效果的ARSKView
无论是使用哪一个视图都是用了相机图像作为背景视图(这里可以参考ios自定义相机中的预览图层),而这一个相机的图像就是由框架中的相机类ARCamera来捕捉的。

2.ARSCNView与ARCamera
两者之间并没有直接的关系,它们之间是通过AR会话(ARSession)来搭建沟通桥梁的。
在iOS框架中,凡是带session或者context后缀的,这种类一般自己不干活,作用一般都是两个:
1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦
2.负责帮助我们管理复杂环境下的内存context与session不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession,网卡的调用NSURLSession等使用的都是session后缀。没有硬件参与,一般用context,如绘图上下文,自定义转场上下文等

3.要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration。
ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型。

05-ARKit工作原理及流程介绍_第2张图片

5.3.2-ARWorldTrackingSessionConfiguration与ARFrame####

1.ARSession搭建沟通桥梁的参与者主要有两个ARWorldTrackingSessionConfiguration与ARFrame

2.ARWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚。我们无需关心内部实现,ARKit框架帮助我们封装的非常完美,只需调用一两个属性即可。

3.当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame。

ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象

4.ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。

它们三者之间的关系看起来如下图:

05-ARKit工作原理及流程介绍_第3张图片

ARCamera在3D世界的位置看起来是这样的

05-ARKit工作原理及流程介绍_第4张图片

5.4-ARKit工作完整流程####

ARKit框架工作流程可以参考下图:
1.ARSCNView加载场景SCNScene
2.SCNScene启动相机ARCamera开始捕捉场景
3.捕捉场景后ARSCNView开始将场景数据交给Session
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
5.给ARSCNView的scene添加一个子节点(3D物体模型)ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分

05-ARKit工作原理及流程介绍_第5张图片

如下个人感觉说明的更清楚!
05-ARKit工作原理及流程介绍_第6张图片
image.png

上图原文链接: http://www.tuicool.com/articles/iYFZvqi

你可能感兴趣的:(05-ARKit工作原理及流程介绍)