首页 > 解决方案 > 为什么使用 `didRemove [ARAnchor]` 的 `session` 方法从未为 `ARBodyTrackingConfiguration` 调用?

问题描述

ARSessionDelegateARView初始化ARBodyTrackingConfiguration.

session带有didAdd: [ARAnchor]和的方法didUpdate: [ARAnchor]被正确调用。但didRemove: [ARAnchor]永远不会被调用。

根据官方文档,锚点“可能”会自动从会话中删除,具体取决于会话配置。我没有找到这个设置。

有谁知道为什么永远不会调用该session方法didRemove [ARAnchor]以及我需要更改哪个设置才能使其正常工作?

import ARKit
import RealityKit
import UIKit

class AugmentedVideoView: ARView, ARSessionDelegate {
    func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        print("didAdd") // called correctly
    }

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
        print("didUpdate") // called correctly
    }

    func session(_ session: ARSession, didRemove anchors: [ARAnchor]) {
        print("didRemove") // is never called :-(
    }

    required init(frame: CGRect) {
        #if targetEnvironment(simulator)
        super.init(frame: frame)
        handleError("Camera not available in simulator.")
        return

        #else
        super.init(frame: frame,
                   cameraMode: ARView.CameraMode.ar,
                   automaticallyConfigureSession: false)
        self.session.delegate = self

        guard ARBodyTrackingConfiguration.isSupported else {
            handleError("Your device does not support body tracking.")
            return
        }

        let configuration = ARBodyTrackingConfiguration()
        configuration.automaticSkeletonScaleEstimationEnabled = false
        self.session.run(configuration)
        #endif
    }

    @available(*, unavailable)
    dynamic required init?(coder decoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

标签: iosswiftaugmented-realityarkitrealitykit

解决方案


好吧,我想我现在明白了。即使该人不再被检测到,ARKit也只是假设它仍然是最后一次检测到的地方。这适用于,例如,如果人不在视线范围内。如果一个人不在视线范围内,而另一个人被检测到,ARKit则不够聪明,无法将其检测为另一个人。它只是更新旧的锚,假设它是同一个。


推荐阅读