ARKit的理解与使用

AR概述
AR的意义:让虚拟世界套与现实世界建立联系,并可以进行互动。
AR的技术实现:通过实时地计算摄影机输出影像的位置及角度,并在内部通过算法识别将场景中的事物,然后在内部模拟的三维座标系中给识别到的事物建立座标,然后在特定的座标上添加相应的图像、视频、3D模型,最终通过手机屏幕合成一个AR效果图展示给用户。

建立一个AR场景的基本步骤为:
1.AR相机打开摄像头实时捕捉周围的图像,并传递到AR会话中。
2.AR会话通过算法识别这些图像,再加上设置的ARWorldTrackingSessionConfiguration追踪策略,然后使用周围的环境和识别到的事物建立一个三维座标。
3.使用传感器持续追踪现实世界动态物体在三维座标中的变化。如X、Y、Z轴位移及旋转,其中位移三轴决定物体的方位和大小,旋转三周决定物体显示的区域。
4.座标识别及转换,系统最终需要把三维座标中的图像转换成二维的图片在手机屏幕上展示:3D模型显示在现实图像中不是单纯的frame座标点,而是一个三维的矩阵座标,这里需要用到三维数学,如:向量,欧拉角,四元数等。
4.另外,AR还可以根据三维座标中事物的动态变化与虚拟物体进行一些交互。
 
ARKit概述及特点
1.ARKit是2017年6月6日,苹果发布iOS11系统所新增框架,它能够帮助我们以最简单快捷的方式实现AR技术功能。
2.ARKit框架提供了两种AR技术,一种是基于3D场景(SceneKit)实现的增强现实,一种是基于2D场景(SpriktKit)实现的增强现实。
3.使用ARKit构建AR场景时,除了ARKit框架还需要依赖于苹果的游戏引擎框架(3D引擎SceneKit,2D引擎SpriktKit),ARKit不是一个独立就能够运行的框架,必须要SceneKit一起用才可以创建AR场景。如果只有ARKit没有SceneKit,那么ARKit只是一个能够输出影像并实时计算摄像机在3D空间中的位置和角度的相机而已。
ARKit框架本身只包含相机追踪,并不能加载3D模型为场景中,这里需要使用游戏引擎的能力进行加载3D模型到三维座标中。
4.iOS端加载3d模型的方式有:苹果ARKit框架,Unity3D,Mental,OpenGL。
 
ARKit工作原理
在相机捕捉到的现实世界的图像中显示一个虚拟的3D模型的步骤可以分为两步:
一:相机捕捉现实世界图像
由ARKit来实现,通过ARKit中的ARCamera去捕捉摄像头的画面,构建3D场景。
二:在图像中显示虚拟3D模型
由SceneKit来实现,添加3D虚拟物体到由ARKit构建的3D场景中。
 
ARKit框架主要负责将真实世界画面转变为一个3D场景。
这分为两个环节:1.由ARCamera负责捕捉摄像头画面,2.由ARSession通过图像识别算法和ARWorldTrackingSessionConfiguration追踪策略负责搭建3D场景。
SceneKit框架主要负责将虚拟物体显示在3D场景中。每一个虚拟的物体都是一个节点SCNNode,多个节点共同构成了一个场景SCNScene,多个场景构成了3D世界。
 
ARScnView,ARSession,ARCamera的关系
ARKit提供两种虚拟增强现实视图,他们分别是3D效果的ARSCNView和2D效果的ARSKView,无论是使用哪一个视图都是用了相机图像作为背景视图,而这一个相机的图像就是由ARKit框架中的相机类ARCamera来捕捉的。
ARSCNView与ARCamera两者之间并没有直接的关系,它们之间是通过AR会话ARSession来搭建沟通桥梁的。

 

要想运行一个ARSession会话,你必须要指定一个称之为会话追踪配置的对象:ARSessionConfiguration,它的主要目的就是负责追踪相机在3D世界中的位置以及一些特征场景的捕捉(例如平面捕捉),这个类很重要。ARSessionConfiguration是一个父类,在开发中通常使用的是它的子类:ARWorldTrackingSessionConfiguration。
 
ARWorldTrackingSessionConfiguration的作用是跟踪设备的方向和位置,以及检测设备摄像头看到的现实世界的表面。它的内部调用图像识别算法并调用必要的传感器来检测手机的移动及旋转甚至是翻滚。当ARWorldTrackingSessionConfiguration计算出相机在3D世界中的位置时,它本身并不持有这个位置数据,而是将其计算出的位置数据交给ARSession去管理,计算出的相机位置数据对应的类是ARFrame。
 
ARSession类一个属性叫做currentFrame,维护的就是ARFrame这个对象。
 
ARCamera只负责捕捉图像,不参与数据的处理。它属于3D场景中的一个环节,每一个3D Scene都会有一个Camera,它决定了我们看物体的视野。

 

ARKit框架工作流程如下:
1.ARSCNView加载场景SCNScene。
2.SCNScene启动相机ARCamera开始捕捉场景。
3.捕捉场景后ARSCNView开始将场景数据交给Session。
4.Session通过管理ARSessionConfiguration实现场景的追踪并且返回一个ARFrame。
5.给ARSCNView的scene添加一个子节点(3D物体模型)。
ARSessionConfiguration捕捉相机3D位置的意义就在于能够在添加3D物体模型的时候计算出3D物体模型相对于相机的真实的矩阵位置。
 
ARKit自定义实现主要逻辑
新建ARSCNViewController继承自UIViewController, 添加相关属性。
//AR容器视图:展示3D界面,内部会自动创建screen场景和ARCarmer摄像头
ARSCNView *arSCNView;
//AR会话:AR的开启和关闭
ARSession *arSession;
//AR世界追踪配置
ARConfiguration *arConfiguration;
创建流程
1.创建ARSession
_arSession = [ARSession new];
2.根据ARSession创建ARSCNView (AR容器视图)
_arSCNView = [[ARSCNView alloc] initWithFrame:self.view.bounds];
_arSCNView.session = self.arSession;
_arSCNView.automaticallyUpdatesLighting = YES;
3.创建ARConfiguration
ARWorldTrackingConfiguration *wtConfiguration = [ARWorldTrackingConfiguration new];
//平面追踪
wtConfiguration.planeDetection = ARPlaneDetectionHorizontal;
//灯光自适应
wtConfiguration.lightEstimationEnabled = YES;
_arConfiguration = wtConfiguration;
 
使用方式
通过调用arSession的run方法启动AR
[self.view addSubview:self.arSCNView];
//启动AR会话,ARCarmer开始启动
[self.arSession runWithConfiguration:self.arConfiguration];
 
ARKit的重要类
ARAnchor
ARAnchor表示一个物体在3D空间的位置和方向。
ARFrame主要是追踪相机当前的状态,表示的是AR相机的位置和方向以及追踪相机的时间,还可以捕捉相机的帧图片。
 
ARFrame
ARWorldTrackingSessionConfiguration通过调用图像识别算法和调用手机传感器,最终计算出相机在3D世界中的位置的某一个时刻的数据,就是一个ARFrame数据。
ARFrame中提供了一个座标探测方法。
- (NSArray<ARHitTestResult *> *)hitTest:(CGPoint)point types:(ARHitTestResultType)types;
这个方法的回调结果是一个ARHitTestResult类,这个类主要用于虚拟增强现实技术(AR技术)中现实世界与3D场景中虚拟物体的交互。 比如我们在相机中移动。拖拽3D虚拟物体,都可以通过这个类来获取ARKit所捕捉的结果。
 
ARSession
ARSession是一个连接底层与AR视图之间的桥梁,其实ARSCNView内部所有的代理方法都是由ARSession来提供的。
ARSession下面连接了ARCamera和ARWorldTrankingSessionConfiguration。用于从相机采集场景,从设备检测相机的位置和朝向,最终构建出3D场景。
 
ARCamera
ARCamera是一个相机,它是连接虚拟场景与现实场景之间的枢纽。在ARKit中,它是捕捉现实图像的相机,在SceneKit中它又是3D虚拟世界中的相机,它是我们看3D世界的眼睛。
一般我们无需去创建一个相机,因为当我们初始化一个AR视图时,他会为我们默认创建一个相机,而且这个相机就是摄像头的位置,同时也是3D世界中的原点所在(x=0,y=0,z=0)。
 
ARScnView
ARScnView是一个AR视图容器,用于展示AR效果图。
ARSCNView继承于SceneKit框架中的SCNView,而SCNView又继承于UIKit框架中的UIView。
 
SCNScence
SCNScene为游戏中的场景,它是游戏元素(地图,灯光,人物的游戏元素)存在的地方,游戏逻辑也是靠挂载在游戏元素上面的脚本进行执行。
 
SCNNode
SCNNode节点,它是场景中游戏元素的抽象表示,一个大型的游戏场景结构就是由无数个小的节点组成,它有自己的位置和自身座标系统,我们可以把几何模型,灯光,摄像机的游戏中的真实元素,吸附到SCNNode 节点上。
 
SCNAction
SCNAction 主要负责改变节点的属性,比如我们要让一个地球围绕太阳旋转,一个气球从一个地方移动另外一个地方。
 
SCNGeometry
SCNGeometry 就是呈现三维模型的类,我们模型具体长什么样子,是个正方体还是长方体,都是它说了算。
 
SCNMaterial
SCNMaterial渲染器, 定义模型的外观,好比一个球体,它渲染出来是红色,还是绿色,会不会发光等.
 
 
 
Demo地址:
https://github.com/zhfei/ARBaseKnowledge 
 
参考文章:
https://www.jianshu.com/p/0492c7122d2f
https://toutiao.io/posts/1fxej0/preview
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章