Ios 如何确定ARObjectAnchor已从场景中移除?
我试图用ARKit来验证玩具的位置。我有一个ARObject扫描资源,将玩具放在相机视图中效果很好。换句话说,Ios 如何确定ARObjectAnchor已从场景中移除?,ios,scenekit,arkit,ios13,Ios,Scenekit,Arkit,Ios13,我试图用ARKit来验证玩具的位置。我有一个ARObject扫描资源,将玩具放在相机视图中效果很好。换句话说,SCNScene和ARSession的diddadd和diddupdate在玩具放置在相机视图后的合理时间内按预期调用。但是当我将玩具从相机视图移开时,didRemove不会被调用,无论是对于SCNScene还是对于ARSession 我确实读过关于这种行为的宣传,说“好吧,它不知道它是否真的被移除了,它可能还只是指日可待”,但这是一个相当不切实际的假设。关于这个功能的整个苹果文档都是“
SCNScene
和ARSession
的diddadd
和diddupdate
在玩具放置在相机视图后的合理时间内按预期调用。但是当我将玩具从相机视图移开时,didRemove
不会被调用,无论是对于SCNScene
还是对于ARSession
我确实读过关于这种行为的宣传,说“好吧,它不知道它是否真的被移除了,它可能还只是指日可待”,但这是一个相当不切实际的假设。关于这个功能的整个苹果文档都是“ARKit可能会自动删除锚”,但没有说明何时以及为什么。我知道,但是ARObjectAnchor
似乎是唯一一个没有实现ARTrackable的ARAnchor子类
我能想到的唯一一个绝望的黑客是当
didUpdate
停止被调用时的模糊超时,因为这是在aik中删除对象的唯一效果。我是否忽略了ARWorldTrackingConfiguration
中的某些内容?请?要按名称查找锚点,请使用init(名称:transform:)
初始化器为锚点指定一个描述性名称:
let anchor = ARAnchor.init(name: "ObjAnchor", transform: mtx) as! ARObjectAnchor
self.sceneView.session.currentFrame?.anchors.filter {
$0.name == "ObjAnchor"
}
或:
苹果TSI的信息解释(如果有人想在自己的TSI中提及此问题,则id 731233593): 当对象离开屏幕时,不一定会删除对象定位点。这不是一种应该依赖的行为。这适用于
AR(SCNView | Session)委托。didrove
回调和ARFrame.anchors的内容。只有当客户机代码以编程方式删除相关的锚时,才会调用回调。尽管有明确的要求,我还是无法对官方文档行“ARKit可能会自动删除锚”做出更好的解释。“你不必担心为什么会发生这种事。”
在didAdd
或didUpdate
回调上超时是一种官方方法。证据用于创建对象扫描、文件Controllers/TestRun.swift
方法startNoDetectionTimer
。使用5秒超时
鼓励ARObjectAnchor
实施ARTrackable
的需求在以下时间填写增强请求:。我个人被鼓励调查替代方案,发现CoreML出人意料地友好,更适合我的用例
谢谢@Andy把我推到这一步。谢谢你的回答,但我显然被误解了。我已经澄清了第一章。问题不在于找到锚。ARKit将其命名为与Arbject扫描资源相同的名称,这就足够了。问题是当对象从摄影机视图中物理删除时。ARKit没有提供任何关于此类事件的信息,只是停止为该锚发布didUpdate。不幸的是,ARFrame.anchors
也不起作用:(尽管是帧的属性,苹果文档称“代表场景中检测到的对象的锚列表”这就是它的实际行为。一旦锚定对象被识别,它将永远挂在数组中,尽管它被移出了摄影机的视线。我们用浮动标签注释了ARAnchor的节点,标签将保留在上次识别对象的位置。有趣的是,如果锚定对象被移动但仍保留在摄影机视图中,则重新定位levant对象节点也会移动,虽然经过了令人失望的长时间。但当它被完全拉走后,对象节点永远只会停留在最后一个已知的位置。沿着ARFrame.anchors中的锚点。我想我会在这个问题上烧掉一个苹果TSI。你是对的。我正在研究我答案的正确版本。
self.sceneView.session.currentFrame?.anchors.contains {
$0.isKind(of: ARObjectAnchor.self)
}