ARKit 3.0:同一应用中人物遮挡与动作捕捉共存问题咨询
解决ARKit同时实现人物遮挡与动作捕捉的问题
嗨,这个问题其实戳中了ARKit的核心限制——iOS设备上根本没法同时运行多个ARSession实例,这就是你遇到问题的根源!
为什么双Session方案行不通?
ARKit运行时会独占设备的摄像头、运动传感器、LiDAR(如果有的话)等核心硬件资源,同一时间只能有一个ARSession获得这些资源的使用权。你创建的第二个ARSession其实根本没真正启动起来,自然只会触发第一个Session的代理回调,深度数据也因为第二个Session没正常工作而拿不到。
正确的解决方案:单Session同时开启两个功能
其实ARKit早就支持在同一个ARWorldTrackingConfiguration里同时开启人物遮挡(带深度)和身体追踪了,不用搞两个ARView和Session。具体步骤如下:
- 创建
ARWorldTrackingConfiguration实例,同时开启两个关键配置:
let config = ARWorldTrackingConfiguration() // 开启带深度的人物遮挡(需要LiDAR设备支持) config.frameSemantics.insert(.personSegmentationWithDepth) // 开启身体追踪(需要A12仿生及以上芯片) config.bodyTrackingEnabled = true
- 将这个配置运行在单个
ARSession上:
arView.session.run(config)
- 同时处理两种数据的代理回调:
在ARSessionDelegate的方法里,你可以同时获取身体追踪的ARBodyAnchor和带深度的帧数据:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { for anchor in anchors { if let bodyAnchor = anchor as? ARBodyAnchor { // 处理动作捕捉数据 print("身体追踪锚点更新:\(bodyAnchor.transform)") } } } func session(_ session: ARSession, didUpdate frame: ARFrame) { // 处理带深度的帧数据,用于人物遮挡渲染 if let depthMap = frame.sceneDepth?.depthMap { print("获取到深度数据:\(depthMap)") } }
注意事项
- 设备要求:
personSegmentationWithDepth需要带LiDAR的设备(iPhone 12 Pro/Pro Max、iPhone 13系列及以上,iPad Pro 2020及以上);如果设备没有LiDAR,可以改用personSegmentation(不带深度的人物遮挡)。- 身体追踪需要A12仿生及以上芯片的iOS设备(iPhone XS及以上,iPad Pro 2018及以上)。
- 确保你的项目部署目标是iOS 13.0及以上,因为
bodyTrackingEnabled是iOS 13才加入的属性。
这样用单Session的方案,就能同时实现你要的人物遮挡和动作捕捉功能啦!
内容的提问来源于stack exchange,提问作者YanivH
相关产品推荐
相关产品推荐

