【iOS ARKit】存储与共享

持久化存储与共享体验技术基础

AR数据持久化存储与体验共享是一个庞大的主题,ARKit 提供了目前业内最好的解决方案。为解决数据持久化存储的问题,ARKit 提供了 ARWorldMap 技术;为解决体验共享的问题,ARKit 提供了协作Session (Collaborative Session)技术,通过这两种技术手段将复杂的技术简单化,并给予了开发者良好的支持。在 RealityKit 中,每一个实体对象都包含一个Synchronization 组件用于同步通信,通过内建的同步支持,实现 AR体验共享更便捷。

initialWorldMap 属性

ARKit 借助 ARWorldap 技术实现 AR运行数据的持久化保存,ARWorldap 是将 ARSession 运行的状态信息进行了收集打包,这些状态信息包括设备对物理环境的感知信息、用户操作信息(用户添加的 ARAnchor)及开发者自定义的一些信息。在 ARSession 运行时可以通过 getCurrent WorldMap (completionHlandler:)方法获取这些状态信息,并可以在序列化后保存到文件系统或者数据库等介质中,或者通过网络传输到其他设备上。

为加载保存的 AR应用进程数据,ARWorldTrackingConfiguration 配置类提供了一个 initial WorldMap属性,在 ARSession 运行前力 initialWorldMap 属性设置一个 ARWorldMap,ARSession 通过run(_: Options:)方法运行时将会尝试利用 ARWorldMap 中存储的信息恢复 AR进程。 通过存储和加载 ARWorldMap,解决了 AR体验的持久化和多用户共享的技术问题。

(1)持久化存储 AR 体验。利用 ARWorldMap 可以将使用者的AR进程数据存储起来,并可以在相同的物理环境中恢复该进程,可以通过ARAnchor 恢复所有的虚拟元素,而且这些虚拟元素在物理环境中的位置和方向与之前的状态保持一致。

(2)多用户共享AR体验。可以通过网络将 ARWorldMap 发送到其他用户设备,当这些设备在相同的物理空间环境中时,通过加载ARWorldMap就可以共享这些体验,即所有设备都可以看到放置在物理环境中相同位置的虚拟元素。

给 initialWorldMap 属性赋予一个 ARWorldMap 并启动 ARSesson后,ARSession 会进入 ARCamera.TrackingState. limited (_:)状态,跟踪受限的原因是 ARCamera. TrackingState. Reason. relocalizing,即ARKit尝试进行重定位。如果重定位成功,则状态改变次 ARCamera. TrackingState. normal,即环境匹配成功,应用进程就可以恢复;如果重定位不成功,例如在完全不相同的物理环境中尝试恢复进程,这时ARSession 的状态就会持续保持受限状(ARCamera. TrackingState. Reason. relocalizing。

isCollaborationEnabled 属性

为实时通过网络传输 AR 应用进程数据,ARWorldTrackingConfiguration 配置类提供了一个isCollaborationEnabled 属性,该属性为布尔值类型,用于标识是否通过点对点网络传输 AR 进程数据。

该值默认为 false,在需要时可以将其设置 true,当设置为 true 时,ARKit 会周期性调用 session(-:didOutputCollaborationData:)方法,通过这个方法就可以将 AR 运行时数据(Collaboration Data)共享给其他用户。Collaboration Data 数据包括 ARKit 检测到的物理表面特征信息、当前用户设备的姿态信息、用户添加的 ARAnchor 信息。

通过 Collaboration Data,多个用户之间可以实时地共享 AR 体验数据,包括对 ARAnchor 的操作数据。ARKit 会融合所有参与用户对物理环境的感知数据,从而增强和加快了 ARKit 对环境的探索进程。在使用协作 Session (Collaborative Session)时,开发人员需要负责 Collaboration Data 数据的发送与接收处理,在进行数据发送时,所有传输的数据(ARSession. CollaborationData)都必须序列化,获取并发送数据的典型示例代码如下所示。

复制代码
func saveWorldMap() {
            print("save:\(String(describing: arView))")
            
            self.arView?.session.getCurrentWorldMap(completionHandler: {[weak self] loadWorld, error in
                guard let worldMap = loadWorld else {
                    print("当前无法获取ARWorldMap:\(error!.localizedDescription)")
                    return
                }
               
                do {
                    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
                    self?.multipeerSession?.sendToAllPeers(data, reliably: true)
                    print("ARWorldMap已发送")
                } catch {
                    fatalError("无法序列化ARWorldMap: \(error.localizedDescription)")
                }
            })
        }
相关推荐
光影少年16 分钟前
开发RN项目时,如何调试iOS真机、Android真机?常见调试问题排查?
android·前端·react native·react.js·ios
疯狂的程序猴18 小时前
Flutter应用代码混淆完整指南:Android与iOS平台配置详解
后端·ios
SY.ZHOU19 小时前
移动端架构体系(五):终篇总结
flutter·ios·系统架构·安卓·鸿蒙
Digitally1 天前
如何不用 iTunes 将 iPhone 备份到移动硬盘?
ios·iphone
sysinside1 天前
Cisco Catalyst 9000 IOS XE 26.1.1 GA - 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件
ios·cisco
低保和光头哪个先来1 天前
解决 ios 使用 video 全屏未铺满页面问题
前端·javascript·vue.js·ios·前端框架
报错小能手1 天前
SwiftUI 框架 认识 SwiftUI 视图结构 + 布局
ui·ios·swift
2501_915921431 天前
HTTP和HTTPS协议全面解析:技术原理与安全应用
安全·http·ios·小程序·https·uni-app·iphone
悟空爬虫-彪哥1 天前
VRCFaceTracking安装和iPhone面捕配置教程,有bug
ios·bug·iphone
想个名字想老半天1 天前
uni离线打包实现 ios 支付StoreKit 2,其实没有想象中那么复杂,不需要写原生插件,不需要转 uts
macos·ios·cocoa