注:此篇文章是ARKit(一)的拓展和深入
主要是拷贝别人的文档,勿喷!!!
一、是什么?
ARKit:ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。
SceneKit:基于3D场景(SceneKit)实现的增强现实,SceneKit是基于OpenGL构建的。
SpriteKit:基于2D场景(SpriktKit)实现的增强现实
Metal:iOS8中,支持GPU加速的3D绘图API。Metal和OpenGL ES类似,也是一个底层API,负责和3D绘图硬件交互。可惜的是,Metal不是跨平台的。
二、ARKit与SceneKit的关系
ARKit
并不是一个独立就能够运行的框架,而是必须要SceneKit
一起用才可以,换一句话说,如果只有<ARKit>
,而没有<SceneKit>
,那么ARKit
和一般的相机没有任何区别-
AR技术叫做虚拟增强现实,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型。这一过程可以分为两个步骤:
- 一:相机捕捉现实世界图像 -- 由
ARKit
来实现 - 二:在图像中显示虚拟3D模型 -- 由
SceneKit
来实现
- 一:相机捕捉现实世界图像 -- 由
-
下图是一个<ARKit>与<SceneKit>框架关系图,可以得出:
-
1.
<ARKit>
框架中中显示3D虚拟增强现实的视图ARSCNView
继承于<SceneKit>
框架中的SCNView
,而SCNView
又继承于<UIKit>
框架中的UIView
-
UIView
的作用是将视图显示在iOS设备的window中,SCNView
的作用是显示一个3D场景,ARScnView
的作用也是显示一个3D场景,只不过这个3D场景是由摄像头捕捉到的现实世界图像构成的
-
-
2.
ARSCNView
只是一个视图容器,它的作用是管理一个ARSession
,笔者称之为AR会话。- ARSession的作用及原理将在本篇下一小节介绍
3.在一个完整的虚拟增强现实体验中,<ARKit>框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由
ARCamera
负责捕捉摄像头画面,由ARSession
负责搭建3D场景。4.在一个完整的虚拟增强现实体验中,将虚拟物体现实在3D场景中是由
<SceneKit>
框架来完成中:每一个虚拟的物体都是一个节点SCNNode
,每一个节点构成了一个场景SCNScene
,无数个场景构成了3D世界-
5.综上所述,
ARKit
捕捉3D现实世界使用的是自身的功能,这个功能是在iOS11新增的。而ARKit
在3D现实场景中添加虚拟物体使用的是父类SCNView
的功能,这个功能早在iOS8时就已经添加(SceneKit
是iOS8新增)- 今后在介绍使用
ARSCNView
时将不再累述这一关系,可以简单的理解为:ARSCNView所有跟场景和虚拟物体相关的属性及方法都是自己父类SCNView的
- 今后在介绍使用
-
三、ARKit工作原理
3.1、ARSCNView与ARSession
- 1.
ARKit
提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView
(基于SceneKit
)和2D效果的ARSKView
(基于SpriteKit
),无论是使用哪一个视图都是用了相机图像作为背景视图(这里可以参考iOS自定义相机中的预览图层),而这一个相机的图像就是由<ARKit>
框架中的相机类ARCamera
来捕捉的。
-
2.
ARSCNView
与ARCamera
两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit
框架中非常重量级的一个类ARSession
来搭建沟通桥梁的- 在iOS框架中,凡是带
session
或者context
后缀的,这种类一般自己不干活,作用一般都是两个:- 1.管理其他类,帮助他们搭建沟通桥梁,好处就是解耦
- 2.负责帮助我们管理复杂环境下的内存
-
context与session
不同之处是:一般与硬件打交道,例如摄像头捕捉ARSession
,网卡的调用NSURLSession
等使用的都是session
后缀。没有硬件参与,一般用context
,如绘图上下文,自定义转场上下文等
- 在iOS框架中,凡是带
-
3.要想运行一个
ARSession
会话,你必须要指定一个称之为会话追踪配置
的对象:ARSessionConfiguration
,ARSessionConfiguration
的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大-
ARSessionConfiguration
是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类ARWorldTrackingSessionConfiguration
,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型
-
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
,它觉得了我们看物体的视野它们三者之间的关系看起来如下图:
ARCamera
在3D世界的位置看起来是这样的
四、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中最难的部分
-
附带
1.Xcode版本:Xcode9及以上
2.iOS系统:iOS11及以上
3.iOS设备:处理器A9及以上(6S机型及以上)
4.MacOS系统:10.12.4及以上(安装Xcode9对Mac系统版本有要求)
参考文章:
1、ARKit从入门到精通(2)-ARKit工作原理及流程介绍