ARKit是苹果公司增强现实的开发工具包。它基于机器视觉(苹果Vision框架),通过收集一系列二维数据(图片数据),再结合传感器数据(陀螺仪,加速计,雷达)从中分析出三维坐标数据。 这个过程分为三层:
- 环境跟踪,获取环境的六自由度信息(手机朝向的三维信息 + 手机在环境中坐标的三维信息)
- 环境理解,根据第一步得到的数据分析出有价值的信息,如平面检测,光估计(Light Estimation)
- 渲染,将虚拟物体和环境一起渲染在屏幕上
环境跟踪
环境跟踪就是用户拿着手机在环境中不断走动,比如在自己的房间中走几圈,把房间的每个部分都拍摄了一遍。 上图展示了环境跟踪的过程,跟踪需要新建并运行ARSession,这个类初始化时需要一些配置信息,也就是ARConfiguration类。在跟踪的过程中不断结合AVCaptureSession(视频帧数据)和CMMotionManager(动作传感器信息),生成每秒60帧的ARFrame数据。根据时间轴来表示的话,体现为下图所示:
手机朝向数据可以通过传感器数据分析得到,而环境中的一些点(称为特征点)到手机的距离是通过视差来计算出来的,如下图: 手机在移动过程中移动了一段距离,同一特征点和手机运动过程中经过的两个位置就形成了一个三角形,三角形的底边就是移动距离,两个底角分别都是手机旋转角度。这样另外两条边的长度就可以计算出来了,也就是特征点到手机的距离。
当这样的特征点的六维坐标收集足够多后,就形成了世界地图(World Map)。
当然移动手机的时候有可能走的太快、手机晃动了,就会出现漂移的现象,导致数据不准确,这就需要多走一点距离,直到世界地图生成成功。另外,环境质量也不能太差,比如下图:
上图中右边两张图,一个太暗了,一个直接对着一面白墙,很难采集到正确信息。并且注意环境要是不移动的,比如正在走动的猫,特征点不断移动位置就无法算出距离了。
保证环境跟踪有效完成需要具备三点:
- 不间断的传感器数据
- 纹理清晰的环境
- 环境是静态不移动的
环境理解
平面检测
获得特征点地图后,如果要放置虚拟物体到环境中还需要环境理解,这其中就包括平面检测。平面检测可以检测出与地平面垂直或者平行的平面,如果发现很多特征点在同一个平面上,就会合并在一起。水平平面和垂直平面相交的地方会裁剪。
点击测试(Hit Testing)
检测到平面后也不能直接放置物体,因为平面有可能有多个。这就需要点击测试,点击测试类似发送一条射线,找到与其第一个相交的平面,以放置物体。
光估计(Light Estimation)
光估计根据环境中光的强度来确定虚拟物体的亮度,使得虚拟物体更真实。
渲染
渲染将虚拟物体和相机获取到的图像一起显示出来,主要使用以下框架:
- SceneKit
- SpriteKit
- Metal
- RealityKit
依赖的软件及硬件
- iOS11,A9/iPhone6s(最低支持,具体看Demo文档中标注)
- CoreMotion(加速度计、陀螺仪、计步器、环境相关)
- AVFoundation(摄像头,音频硬件)
- SceneKit/SpriteKit/Metal/RealityKit(渲染)
- Unity/UnReal/Reality Composer等等(3D虚拟物体制作)
新功能介绍
iOS12
-
环境纹理,环境纹理可以让环境中的物体倒映到虚拟物体上。就像环境中真实的杯子,表面光滑能反光的话,能看到周围环境的倒影:
-
图像跟踪,图像跟踪能识别出真实环境中的图片,并可以在这个图片上显示虚拟物体或者播放视频。
-
对象检测,对象检测可以根据特征点集合找到真实环境中的对应物体
-
支持凝视和舌头跟踪
iOS13
-
人物遮挡,人物遮挡可以在虚拟物体处于人的后面时被遮挡,而不是浮在屏幕上
-
肢体跟踪
-
人脸跟踪增强
iOS14
-
地理位置跟踪,地理位置跟踪可以根据世界地图中的特征点识别出真实环境中的位置
-
更精确地放置物体
-
人脸跟踪拓展
iOS15
- 支持录制重放
2.支持APP Clip Code方式使用AR
3.人脸跟踪支持超广摄像头 4.肢体跟踪更精确,支持更远距离
ARKit Demo地址:github.com/Wejua/Demos...