前言
前面一节学习ARKit(一)简单的介绍了AR与ARKit的相关概念,下面将深入到ARKit中来了解一下ARKit的工作原理与流程。
在介绍ARKit之前,先了解一下SpriteKit和SceneKit。
SpriteKit
SpriteKit——使用优化的动画系统,物理模拟和事件处理支持创建基于2D游戏。
SpriteKit是一种图形渲染和动画的框架,你可以使用它将任意纹理图像动画化。 SpriteKit提供了一个传统的渲染循环,可以在确定内容和渲染帧之间进行交替。你可以决定框架的内容以及这些内容如何更改。 SpriteKit会使用图形硬件有效地渲染该框架。 SpriteKit针对你的内容使用任意动画或更改内容进行了优化。这种设计使SpriteKit更适合需要灵活处理动画的游戏和应用程序。
SceneKit
SceneKit——使用高级场景描述创建3D游戏并向应用添加3D内容。轻松地添加动画、物理模拟、粒子效果和逼真的物理渲染。
SceneKit将高性能渲染引擎与用于导入、处理和渲染3D素材的描述性API相结合。与Metal和OpenGL的低级API不同,他们需要你精确地实现显示场景的渲染算法,而SceneKit只需要描述场景内容以及你希望执行的动作或动画即可。
两者特点
SpriteKit使用主机设备提供的图形硬件来高帧速率合成2D图片,同时还支持很多不同的内容,比如文本、视频等。SpriteKit支持丰富的渲染结构并接管了所有向OpenGL发出绘画指令的的底层工作,所以你可以将你的重心放在解决高层次的设计问题以及伟大的游戏交互设计上。
SceneKit是用来构建3D场景的框架,且可以与Core Animation和SpriteKit无缝交互。在SceneKit中可以直接引入COLLADA行业标准文件制作好的3D模型或场景。与SpriteKit一样,SceneKit通过场景来显示物体,场景包含在SCNView。场景内同样是以节点的结构来呈现物体。
ARKit框架
ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实。
我们主要介绍一下3D场景的AR的框架与实现。
通俗的讲,AR就是我们摄像头捕捉到现实世界中的图像后,在图像上显示虚拟的3D模型,这就是最简单的增强现实。其过程就是上面的两步:
- 摄像头捕捉现实世界的图像(ARKit实现)
- 在图像上现实虚拟的3D模型(SceneKit实现)
下面展示一下ARKit框架关系图(摘自ARKit从入门到精通(2)-ARKit工作原理及流程介绍)
注释:
图中我们可以看到,ARKit是通过ARScnView来展示3D场景的,这个3D场景是摄像头通过拍摄将现实世界的图像与虚拟的3D模型结合所构成的。ARScnView继承自SceneKit中的SCNView,而SCNView则继承自我们非常熟悉的UIView。
在AR中,ARKit负责将现实世界转换成3D场景,而SceneKit则是在3D场景中添加自己的场景与虚拟3D模型。
ARKit的工作原理
在上图中,我们可以看到ARKit中比较重要的几个类:ARSCNView、ARSession、ARCamera,此外还有ARConfiguration、ARFrame等。
- ARCamera是通过相机来捕捉真实世界的图像,ARScnView则是展示将相机捕捉的画面作为3D场景,它们两个之前是通过ARSession来建立联系的。
- ARSession与iOS中其他的session一样,就是会话的意思。创建一个AR的场景,首先要创建一个AR会话。一个ARSession对象协调ARKit来代表执行的主要过程,这些过程包括从设备的运动感测硬件读取数据,控制设备的内置相机,以及对捕获的相机图像执行图像分析。会话综合了所有这些结果,以建立设备所在的真实世界空间与模拟AR内容的虚拟空间之间的对应关系。
- 运行会话需要会话配置:ARConfiguration类的实例或其子类。
这些类确定ARKit如何跟踪设备相对于现实世界的位置和运动,从而影响您可以创建的AR体验的种类。
ARConfiguration的子类主要有以下三种:
ARWorldTrackingConfiguration:提供高品质的AR体验,使用后置摄像头精确跟踪设备的位置和方向,并允许平面检测和点击测试。
AROrientationTrackingConfiguration:提供使用后置摄像头并仅跟踪设备方向的基本AR体验。
ARFaceTrackingConfiguration:提供使用前置摄像头并跟踪用户脸部的移动和表情的AR体验。 - ARFrame作为ARSession的一部分用来捕获视频图像和位置跟踪信息。ARCamera会连续地捕获视频帧,传到ARSession。对于每一帧,ARKit将图像与设备运动感应硬件所得的数据(数据由ARConfiguration中封装了复杂的算法来计算得出的)一起进行分析,以估计设备在现实世界的位置。ARKit传输跟踪信息和图像参数就是以ARFrame为对象来传输的。
大概的工作流程是这样的:
- 打开应用,开启摄像头,通过ARSCNView来加载AR 3D场景SCNScene
- SCNScene通过ARCamera捕捉场景
- 捕捉场景后,ARCamera会将视频帧传到ARSession,然后再传到ARSCNView展示场景。
- ARSCNView将场景数据交给ARSession。
- ARSession通过管理ARConfiguration实现场景的追踪并返回一个ARFrame。
- 再ARSCNView的场景中添加3D模型(即ARSCNNode)
ARConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置。
在3D坐标系统中,有一个世界坐标系和一个本地坐标系。类似于UIView的Frame和Bounds的区别,这种坐标之间的转换可以说是ARKit中最难的部分。
流程图如下:(摘自ARKit从入门到精通(2)-ARKit工作原理及流程介绍)
下一节学习ARKit(三)