arkit(ARKit 简介)
一、ARKit翻译
通过整合iOS设备的摄像头和运动特性,在你的app或者游戏中提供增强现实体验
增强现实( Augmented reality- AR)描述一种将2D或者3D元素通过一个设备的摄像头添加到实时影像当中的用户体验,这种方法使得这些元素毫无违和感的出现在真实世界中。ARKit整合了动作追踪(motion tracking),摄像头场景捕捉(camera scene capture),高级场景处理(advanced scene processing)和为了简化构建一个AR体验任务的便捷显示。你可以使用这些技术通过iOS设备的前置或后置摄像头来创造多种多样的AR体验。
获取用户iOS设备的细节,例如设备在3D空间中的位置和方向,摄像头中的视频数据和曝光值等。
添加AR体验到你的app或者网站最简单的方法
通过使用一个为你处理渲染的界面来创造一个功能齐全的AR体验。
通过追踪表面、图像、物体、人和人脸来增强用户周围的环境
追踪出现在前置摄像头信息流中的人脸
ARKit在摄像头信息流中识别出人的反应
识别物理环境中的图像并追踪其位置和方向
通过扫描器app首次扫描时,可以实时的识别出已知物体
通过与其他设备通信来创造一个共享的AR体验
通过展示锚定的文字来对AR体验进行注释
通过实现你自己的渲染器来创建一个功能完备的AR体验
原文链接:
二、ARKit探索
一、简介:增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。
一个最简单地AR场景实现所需要的技术以及步骤包含如下:
1.多媒体捕捉现实图像:如摄像头
2.三维建模:3D立体模型
3.传感器追踪:主要追踪现实世界动态物体的六轴变化,这六轴分别是X、Y、Z轴位移及旋转。其中位移三轴决定物体的方位和大小,旋转三周决定物体显示的区域。
4.坐标识别及转换:3D模型显示在现实图像中不是单纯的frame坐标点,而是一个三维的矩阵坐标。这基本上也是学习AR最难的部分,好在ARKit帮助我们大大简化了这一过程。
5.除此之外,AR还可以与虚拟物体进行一些交互。
二、AR特点:
1.ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。
2.ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实
一般主流都是基于3D实现AR技术,ARKit不仅支持3D游戏引擎SceneKit还支持2D游戏引擎SpriktKit,这一点出乎笔者意料之外
3.要想显示AR效果,必须要依赖于苹果的游戏引擎框架(3D引擎SceneKit,2D引擎SpriktKit),主要原因是游戏引擎才可以加载物体模型。
虽然ARKit框架中视图对象继承于UIView,但是由于目前ARKit框架本身只包含相机追踪,不能直接加载物体模型,所以只能依赖于游戏引擎加载ARKit
4.误区解读:ARKit虽然是iOS11新出的框架,但并不是所有的iOS11系统都可以使用,而是必须要是处理器A9及以上才能够使用,苹果从iPhone6s开始使用A9处理器,也就是iPhone6及以前的机型无法使用ARKit
5.开发环境介绍
1.Xcode版本:Xcode9及以上
2.iOS系统:iOS11及以上
3.iOS设备:处理器A9及以上(6S机型及以上)
4.MacOS系统:10.12.4及以上(安装Xcode9对Mac系统版本有要求)
ARKit框架中中显示3D虚拟增强现实的视图ARSCNView继承于SceneKit框架中的SCNView,而SCNView又继承于UIKit框架中的UIView。
在一个完整的虚拟增强现实体验中,ARKit框架只负责将真实世界画面转变为一个3D场景,这一个转变的过程主要分为两个环节:由 ARCamera负责捕捉摄像头画面,由ARSession负责搭建3D场景。
ARSCNView与ARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的。
要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration, ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大。
(ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类
ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型)
三、 ARWorldTrackingSessionConfiguration与 ARFrame
ARSession搭建沟通桥梁的参与者主要有两个ARWorldTrackingSessionConfiguration与ARFrame。
ARWorldTrackingSessionConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部实现了一系列非常庞大的算法计算以及调用了你的iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚。
ARWorldTrackingSessionConfiguration里面就是VIO系统
这里文中提到的ARWorldTrackingSessionConfiguration在最新的iOS 11 beta8中已被废弃,因此以下更改为ARWorldTrackingConfiguration
当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理(与前面说的session管理内存相呼应),而相机的位置数据对应的类就是ARFrame
ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它觉得了我们看物体的视野。
四、ARSession获取相机位置数据主要有两种方式
第一种:push。实时不断的获取相机位置,由ARSession主动告知用户。通过实现ARSession的代理-(void)session:(ARSession)session didUpdateFrame:(ARFrame)frame来获取
第二种:pull。用户想要时,主动去获取。ARSession的属性currentFrame来获取
五、ARKit工作完整流程
1.ARSCNView加载场景SCNScene
2.SCNScene启动相机ARCamera开始捕捉场景
3.捕捉场景后ARSCNView开始将场景数据交给Session
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame
5.给ARSCNView的scene添加一个子节点(3D物体模型)。
(ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置)
三、iOS增强现实(ARKit)简单介绍
跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。
场景理解通过学习更多关于环境的属性,以对水平平面进行检测,如地面或桌面;iOS 11.3开始还支持检测垂直平面。这些在场景中平面可用于放置虚拟物体。此外,场景理解还会了解当前环境的光照情况,以提供光照信息用于在虚拟场景中反映真实环境,避免过亮或过暗。
通过ARKit可以很容易地集成你所选的渲染引擎。ARKit可通过SceneKit和SpriteKit渲染。Xcode中还提供了Metal模板,方便快速地开始你的增强现实体验(augmented reality experience)项目。此外,Unity和Unreal也已经集成ARKit完整的功能集到他们主流的游戏引擎中,因此你可以通过这些引擎开始使用ARKit。
AR技术叫做虚拟增强现实技术,也就是在相机捕捉到的现实世界的图像中显示一个虚拟的 3D模型。
这一过程可以分为两个步骤:
下图是一个ARKit与 SceneKit框架的关系图,通过下图可以看出:
ARSCNView与 ARCamera两者之间并没有直接的关系,它们之间是通过AR会话,也就是ARKit框架中非常重量级的一个类ARSession来搭建沟通桥梁的
要想运行一个 ARSession会话,你必须要指定一个称之为会话追踪配置的对象: ARSessionConfiguration, ARSessionConfiguration的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类本身比较简单却作用巨大
ARSessionConfiguration是一个父类,为了更好的看到增强现实的效果,苹果官方建议我们使用它的子类 ARWorldTrackingSessionConfiguration,该类只支持A9芯片之后的机型,也就是iPhone6s之后的机型
ARWorldTrackingConfiguration(会话追踪配置)的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。
它的内部实现了一系列非常庞大的算法计算以及调用了你的 iPhone必要的传感器来检测手机的移动及旋转甚至是翻滚。
当 ARWorldTrackingConfiguration计算出相机在 3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给 ARSession去管理,而相机的位置数据对应的类就是 ARFrame。 ARSession类有一个属性叫做 currentFrame,维护的就是 ARFrame这个对象。
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野
他们三者之间的关系看起来如下图:
ARCamera在 3D世界的位置看起来是这样的:
首先,ARKit利用摄像头拍摄现实场景的画面,然后 SceneKit用来建立虚拟世界。
建立好了以后,ARKit负责将现实世界和虚拟世界的信息融合,并渲染出一个 AR世界。
在渲染的同时,ARKit要负责以下三件事:
由此可见,ARKit主要做的事是:捕捉现实世界信息、将现实和虚拟世界混合渲染、并且时刻处理新的信息或者进行互动。
效果:
ARConfiguration:提供 3DOF追踪
ARWorldTrackingConfiguration:提供 6DOF追踪
对于 3DOF追踪,我们旋转设备时可以看到虚拟的飞机视角有所变化;但当平移时,我们可以看到飞机是随着设备进行移动的。
对于 6DOF追踪,我们旋转设备时可以看到虚拟的飞机视角有所变化(这点与 3DOF追踪没有区别);平移时,我们可以看到飞机的不同位置,例如向上平移看到了飞机的上表面,围着飞机平移可以看到飞机的四周,而 3DOF没有提供这种平移的追踪。
可以通过 [ARWorldTrackingConfiguration isSupported]判断设备是否支持 ARWorldTrackingConfiguration。
Hit-testing是为了获取当前捕捉到的图像中某点击位置有关的信息(包括平面、特征点、ARAnchor等)。
[图片上传失败...(image-ba8a3e-1554264132836)]
当点击屏幕时,ARKit会发射一个射线,假设屏幕平面是三维坐标系中的 xy平面,那么该射线会沿着 z轴方向射向屏幕里面,这就是一次 Hit-testing过程。此次过程会将射线遇到的所有有用信息返回,返回结果以离屏幕距离进行排序,离屏幕最近的排在最前面。
ARHitTestResultTypeFeaturePoint:表示此次 Hit-testing过程希望返回当前图像中 Hit-testing射线经过的 3D特征点。
ARHitTestResultTypeEstimatedHorizontalPlane:表示此次 Hit-testing过程希望返回当前图像中 Hit-testing射线经过的预估平面。预估平面表示 ARKit当前检测到一个可能是平面的信息,但当前尚未确定是平面,所以 ARKit还没有为此预估平面添加 ARPlaneAnchor。
ARHitTestResultTypeEstimatedVerticalPlane:同上,区别仅是预估竖面。
ARHitTestResultTypeExistingPlane:表示此次 Hit-testing过程希望返回当前图像中 Hit-testing射线经过的无限大小的平面。
ARHitTestResultTypeExistingPlaneUsingExtent:表示此次 Hit-testing过程希望返回当前图像中 Hit-testing射线经过的有大小范围的平面。
ARHitTestResultTypeExistingPlaneUsingGeometry:表示此次 Hit-testing过程希望返回当前图像中 Hit-testing射线经过的有大小范围和形状的平面。