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: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 数据结构 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。