You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARKit 3.0:同一应用中人物遮挡与动作捕捉共存问题咨询

解决ARKit同时实现人物遮挡与动作捕捉的问题

嗨,这个问题其实戳中了ARKit的核心限制——iOS设备上根本没法同时运行多个ARSession实例,这就是你遇到问题的根源!

为什么双Session方案行不通?

ARKit运行时会独占设备的摄像头、运动传感器、LiDAR(如果有的话)等核心硬件资源,同一时间只能有一个ARSession获得这些资源的使用权。你创建的第二个ARSession其实根本没真正启动起来,自然只会触发第一个Session的代理回调,深度数据也因为第二个Session没正常工作而拿不到。

正确的解决方案:单Session同时开启两个功能

其实ARKit早就支持在同一个ARWorldTrackingConfiguration里同时开启人物遮挡(带深度)和身体追踪了,不用搞两个ARView和Session。具体步骤如下:

  1. 创建ARWorldTrackingConfiguration实例,同时开启两个关键配置:
let config = ARWorldTrackingConfiguration()

// 开启带深度的人物遮挡(需要LiDAR设备支持)
config.frameSemantics.insert(.personSegmentationWithDepth)
// 开启身体追踪(需要A12仿生及以上芯片)
config.bodyTrackingEnabled = true
  1. 将这个配置运行在单个ARSession上:
arView.session.run(config)
  1. 同时处理两种数据的代理回调:
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:30:10