从技术层面上讲,ARKit 通过整合了 AVFoundation、CoreMotion、CoreML3 个框架,在这个根底上整合扩大而成。其中,AVFoundation 是解决基于工夫的多媒体数据框架,如前后摄像头、声音等。CoreMotion 是解决减速计、陀螺仪、LiDAR 等传感器数据信息框架,如以后设施的地位、程度旋转、静止速度、事实物体扫描等。CoreML 则是机器学习框架,外部集成大量的算法,如计算机图片解决与人脸识别等。
表列 |
形容 |
特色点检测 |
检测并跟踪从摄像头采集图像中的特色点信息,并利用这些特色点构建对事实啊不理我的了解 |
立体检测 |
检测并跟踪事实世界中的平坦外表,ARKi 反对立体与垂直立体检测 |
图片检测辨认跟踪 |
检测辨认并跟踪预扫描的 2D 图像,ARKit 最大反对同时检测 100 张图像 |
3D 物体检测跟踪 |
检测辨认并跟踪预扫描的 3D 物体 |
光照预计 |
利用从摄像头图片采集的光照信息估计环境中的光照,并依此调整虚构物体的光照成果 |
环境光反射 |
利用从摄像头图像中采集的信息生成环境光探头,并利用这些图片信息反射实在环境中的物体,以达到更实在的渲染成果 |
世界地图 |
反对保留与加载世界空间的空间映射数据。以便在不同设施之间共享体验。 |
人脸检测跟踪 |
检测跟踪摄像头图片中的人脸,ARKit 反对同时跟踪 3 张人脸,ARKit 还反对眼动与舌动跟踪,并反对人脸 BlendShape 性能,能够驱动虚拟人像模型。 |
射线检测 |
人设施屏幕发射线虚构对象或者立体。 |
人体动作捕获 |
检测跟踪摄像头图像中的人形,捕捉人形动作,并用人形动作驱动虚构模型。ARKit 反对 2D 和 3D 人形捕获跟踪。 |
人形遮挡 |
分享摄像头图像中的人形区域,并能预计人形区域深度,以实现与虚构物体的深度比照,从两颗实现正确的遮挡关系。 |
多人合作 |
多设施音实时通信经共享 AR 体验 |
同时开启前后摄像头 |
容许同时开启设施前后摄像头,并可利用前置摄像头采集到的人脸检测数据驱动后置摄像头中的模型。 |
3D 音效 |
模仿实在空间中的 3D 声音流传成果 |
景深 |
模仿照相机采集图像信息时的景深成果,实现售点转移 |
相机噪声 |
模仿照相机采集图像时呈现 的不规则 噪声 |
静止含糊 |
模仿摄像机在拍摄静止物体时呈现 的含糊拖尾景象 |
自定义渲染 |
反对对所有 ARKit 个性的自定义渲染 |
场景几何 |
应用 LiDAR 实时捕捉场景深度信息并转化为场景几何网格 |
场景深度 |
应用 LiDAR 实时捕捉场景深度信息 |
视频纹理 |
采纳视频图像作为纹理,能够实现视频播放,动静纹理性能 |
地理位置锚点 |
利用 GPS 与地图在特定的地理位置上搁置虚构物体 |
名称 |
形容 |
ARWorldTrackingConfiguration |
应用后置摄像以 6DOF 的模式开启静止跟踪 |
ARFaceTrackingConfiguration |
应用设施的前置摄像头检测跟踪人脸 |
ARKit 的三大根底能力:
名称 |
形容 |
ARSession |
一个 AR 程序只有有一个 ARSession,ARKit 所有的会话都建设在 ARSession 根底之上 |
ARAnchor |
锚点,在 ARKit 的世界中,所有虚构物体都是由锚点组成。通过摄像头捕捉的图像中,计算出以后场景的锚点地位信息、深度等信息 |
ARFrame |
AR 帧,是摄像头获取到的一帧图像,ARKit 背景渲染都是由这个图像帧实现。信息包含:光照、锚点数量、世界地图状态、以后场景的参数、点云、旋转、工夫、视矩阵等信息。 |
ARKit 自身并不间接提供渲染性能,AR 场景渲染能够抉择第三方框架进行渲染,苹果目前提供的渲染框架有:SceneKit、SpriteKit、Metal 或自定义渲染框架。
苹果尽管提供了多个第三渲染框架,但这些渲染框架并不是为 AR 利用开而设计的。如:
SceneKit 设计解决 3D 渲染、SpriteKit 设计解决 2D 渲染、Metal 则是更底层的图形 API。
在 2019 年,苹果公司应用 Swift 语言全新开发了 RealityKit 渲染框架,其重点解决的问题是在事实环境中的虚构元素 PBR 渲染及精准的行为模仿,包含物理仿真、环境反射、环境光预计等。也就是说 RealityKit 是专为实在环境中虚构元素做渲染而设计的,次要目标是为了使虚构物体在事实世界中营造更强的真实感。
在 ARKit 的会话中,ARKit 启动后会主动进行检测环境,我应用的是 ARWorldTrackingConfiguration
和[.sceneDepth, .smoothedSceneDepth]
的配置进行会话,通过 ARSCNView
来进行显示。
在 ARKit 的会话中能够失去 didAdd:[ARAnchor]
、didUpdate:[ARAnchor]
、didUpdate:ARFrame
、didRemove:[ARAnchor]
等多实时数据。
我通过 didUpdate:ARFrame
获取以后帧,代码我就不贴上来了,我列一下我目前获取到的数据,这个数据结构蕴含以下信息
名称 |
形容 |
timestamp |
以后帧的工夫截 |
capturedImage |
以后帧,是 CVPixelBuffer 数据结构,能够转成 CGImage 或 UIImage,再转成 PNG 或 JPG 图片 |
cameraGrainTexture |
属于 MTLTexture 类型数据 |
cameraGrainIntensity |
属于 Float 类型数据 |
capturedDepthData |
帧捕捉到的深度数据。属于 AVDepthData 类型数据 |
capturedDepthDataTimestamp |
标识深度数据的工夫戳。 |
camera |
属于 ARCamera 类型数据 |
anchors |
以后帧的场景中的锚点,是一个数组[ARAnchor] |
lightEstimate |
用来捕获框架图像的相机。是 ARLightEstimate 数据结构,蕴含ambientIntensity (照明的环境强度。),ambientColorTemperature (照明的环境色温。) |
rawFeaturePoints |
场景中绝对于帧原点的特色点,俗称点云。是 ARPointCloud 数据结构,蕴含了 points (组成点云的三维点。)、identifiers 惟一标识 |
worldMappingStatus |
世界地图获取状态,是一个枚举值:notAvailable 、limited 、extending 、mapped |
segmentationBuffer |
一个示意 capturedImage 分段内容的缓冲区。 |
estimatedDepthData |
示意执行的宰割的预计深度值的缓冲区。 |
detectedBody |
在以后帧中检测到的物体。是 ARBody2D 数据结构,蕴含了一个 ARSkeleton2D 数据类型的skeleton |
geoTrackingStatus |
天文跟踪的状态。 |
sceneDepth |
深度数据。是 ARDepthData 数据结构,蕴含了 depthMap 一个像素缓冲区,蕴含每个像素的深度数据 (以米为单位)、confidenceMap 一个像素缓冲区,蕴含 ’ depthMap ‘ 中每个深度值的相信级别。 |
smoothedSceneDepth |
场景深度数据,平滑的工夫一致性。是 ARDepthData 数据结构 |