【问题标题】:How to determine that ARObjectAnchor was removed from the scene?如何确定 ARObjectAnchor 已从场景中移除?
【发布时间】:2020-06-11 14:08:24
【问题描述】:

我正在尝试使用 ARKit 来验证玩具的位置。我有一个 ARObject 扫描资源,将玩具放在相机视图中效果很好。换句话说,SCNSceneARSession 中的didAdddidUpdate 在玩具被放置在相机视图后的合理时间内按预期调用。但是当我将玩具从相机视图中移开时,didRemove 不会 not 被调用,SCNSceneARSession 都不会调用。

我确实读过这种行为的宣传,说“好吧,ARKit 不知道它是否真的被移除了,它仍然可能指日可待”,但这是相当不切实际的假设。有关此功能的整个 Apple 文档是“ARKit 可能会自动删除锚点”,但没有说明何时以及为什么。我知道isTracked,但ARObjectAnchor 似乎是唯一不实现ARTrackable 的ARAnchor 子类

我能想到的唯一绝望的黑客是当 didUpdate 停止被调用时的某种模糊超时,因为这是删除对象 AFAIK 的唯一效果。我是否忽略了ARWorldTrackingConfiguration 中的某些内容?请问?

【问题讨论】:

    标签: ios scenekit arkit ios13


    【解决方案1】:

    要按名称查找锚点,请使用 init(name:transform:) 初始化程序给它一个描述性名称:

    let anchor = ARAnchor.init(name: "ObjAnchor", transform: mtx) as! ARObjectAnchor
    
    self.sceneView.session.currentFrame?.anchors.filter { 
         $0.name == "ObjAnchor"
    }
    

    或:

    self.sceneView.session.currentFrame?.anchors.contains { 
        $0.isKind(of: ARObjectAnchor.self)
    }
    

    【讨论】:

    • 感谢您的回答,但我显然被误解了。我已经澄清了第一章。问题不在于找到锚。 ARKit 将其命名为与 arboject 扫描资源相同的名称,这就足够了。问题是当物体从相机视图中物理移除时。除了停止为该锚点发布 didUpdate 之外,ARKit 不会提供有关此类事件的任何信息。
    • 不幸的是,ARFrame.anchors 也不起作用 :( 尽管是框架的一个属性,Apple 文档说“代表在场景中检测到的对象的锚点列表”,这就是它的行为方式。一旦识别出锚对象,它就会永远挂在数组中,尽管它已移出相机视线。我们用浮动标签注释了 ARAnchor 的节点,并且标签保持不变上次识别对象的位置。
    • 有趣的是,如果锚对象被移动但仍停留在相机视图中,则相关对象节点也会移动,尽管经过相当长的时间令人失望。但是当它被完全拉开时,对象节点就永远位于最后一个已知的位置。沿着ARFrame.anchors 中的锚点。我想我会为此烧掉一个 Apple TSI。
    • 你是对的。我正在修改我的答案的更正版本。
    【解决方案2】:

    来自 Apple TSI 的信息解读(如果有人想在他自己的 TSI 中提及此问题,则 ID 为 731233593):

    当对象离开屏幕时,ARObjectAnchors 不一定会被移除。这不是应该依赖的行为。 这适用于AR(SCNView|Session)Delegate.didRemove 回调和ARFrame.anchors 的内容。只有当客户端代码以编程方式删除相关锚时,才会调用回调。尽管明确询问,但我无法更好地解释官方文档行“ARKit 可能会自动删除锚点”。 “你不应该担心为什么会这样。

    didAdddidUpdate 回调上超时是官方方法。 证据是Apple's official project 用于创建对象扫描,文件Controllers/TestRun.swift 方法startNoDetectionTimer。使用 5 秒超时。

    鼓励ARObjectAnchor 实施ARTrackable 的要求填写Feedback Assistant 的增强请求。我个人受到鼓励去研究替代方案,发现 CoreML 出人意料地友好并且更适合我的用例。

    感谢@Andy 把我推到这一步。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多