iOS AR研究

iOS AR研究

从技术层面上讲,ARKit通过整合了AVFoundation、CoreMotion、CoreML3个框架,在这个基础上整合扩展而成。
其中,AVFoundation是处理基于时间的多媒体数据框架,如前后摄像头、声音等。
CoreMotion是处理加速计、陀螺仪、LiDAR等传感器数据信息框架,如当前设备的位置、水平旋转、运动速度、现实物体扫描等。
CoreML则是机器学习框架,内部集成大量的算法,如计算机图片处理与人脸识别等。

ARKit能做什么

表列 描述
特征点检测 检测并跟踪从摄像头采集图像中的特征点信息,并利用这些特征点构建对现实啊不理我的理解
平面检测 检测并跟踪现实世界中的平整表面,ARKi支持平面与垂直平面检测
图片检测识别跟踪 检测识别并跟踪预扫描的2D图像,ARKit最大支持同时检测100张图像
3D物体检测跟踪 检测识别并跟踪预扫描的3D物体
光照估计 利用从摄像头图片采集的光照信息估计环境中的光照,并依此调整虚拟物体的光照效果
环境光反射 利用从摄像头图像中采集的信息生成环境光探头,并利用这些图片信息反射真实环境中的物体,以达到更真实的渲染效果
世界地图 支持保存与加载世界空间的空间映射数据 。以便在不同设备之间共享体验。
人脸检测跟踪 检测跟踪摄像头图片中的人脸,ARKit支持同时跟踪3张人脸,ARKit还支持眼动与舌动跟踪,并支持人脸BlendShape功能,可以驱动虚拟人像模型。
射线检测 人设备屏幕发射线虚拟对象或者平面。
人体动作捕捉 检测跟踪摄像头图像中的人形,捕获人形动作,并用人形动作驱动虚拟模型。ARKit支持2D和3D人形捕捉跟踪。
人形遮挡 分享摄像头图像中的人形区域,并能估计人形区域深度,以实现与虚拟物体的深度对比,从两颗实现正确的遮挡关系。
多人协作 多设备音实时通信经共享AR体验
同时开启前后摄像头 允许同时开启设备前后摄像头,并可利用前置摄像头采集到的人脸检测数据驱动后置摄像头中的模型。
3D音效 模拟真实空间中的3D声音传播效果
景深 模拟照相机采集图像信息时的景深效果,实现售点转移
相机噪声 模拟照相机采集图像时出现 的不规则 噪声
运动模糊 模拟摄像机在拍摄运动物体时出现 的模糊拖尾现象
自定义渲染 支持对所有ARKit特性的自定义渲染
场景几何 使用LiDAR实时捕获场景深度信息并转化为场景几何网格
场景深度 使用LiDAR实时捕获场景深度信息
视频纹理 采用视频图像作为纹理,可以实现视频播放,动态纹理功能
地理位置锚点 利用GPS与地图在特定的地理位置上放置虚拟物体

ARKit有两种配置模式

名称 描述
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的会话中,ARKit启动后会自动进行检测环境,我使用的是ARWorldTrackingConfiguration[.sceneDepth, .smoothedSceneDepth]的配置进行会话,通过ARSCNView来进行显示。
在ARKit的会话中可以得到didAdd:[ARAnchor]didUpdate:[ARAnchor]didUpdate:ARFramedidRemove:[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 世界地图获取状态,是一个枚举值:notAvailablelimitedextendingmapped
segmentationBuffer 一个表示capturedImage分段内容的缓冲区。
estimatedDepthData 表示执行的分割的估计深度值的缓冲区。
detectedBody 在当前帧中检测到的物体。是ARBody2D数据结构,包含了一个ARSkeleton2D数据类型的skeleton
geoTrackingStatus 地理跟踪的状态。
sceneDepth 深度数据。是ARDepthData数据结构,包含了depthMap一个像素缓冲区,包含每个像素的深度数据(以米为单位)、confidenceMap一个像素缓冲区,包含' depthMap '中每个深度值的置信级别。
smoothedSceneDepth 场景深度数据,平滑的时间一致性。是ARDepthData数据结构

你可能感兴趣的:(ios)