Как определить, что ARObjectAnchor был удален со сцены? - PullRequest
3 голосов
/ 27 февраля 2020

Я пытаюсь использовать ARKit для проверки положения игрушки. У меня есть ресурс сканирования ARObject, и размещение игрушки в поле зрения камеры работает довольно хорошо. Другими словами, didAdd и didUpdate из SCNScene и ARSession вызываются, как и ожидалось, в разумное время после того, как игрушка будет помещена в поле зрения камеры. Но когда я отодвигаю игрушку от камеры, didRemove не вызывается , а не , ни для SCNScene, ни для ARSession.

Я читал пропаганду такого поведения Говоря «хорошо, ARKit не может знать, действительно ли он был удален, и он все еще может быть не за горами», но это довольно непрактичное предположение. Вся документация Apple об этой функции: «ARKit может автоматически удалять якоря», но не говорит ни слова о том, когда и почему. Я знаю о isTracked , но ARObjectAnchor кажется единственным подклассом ARAnchor, который не реализует ARTrackable .

Единственный отчаянный хак, о котором я могу думать, это какой-то нечеткого тайм-аута, когда didUpdate перестает вызываться, потому что это единственный эффект удаления объекта AFAIK. Я пропустил что-то в ARWorldTrackingConfiguration? Пожалуйста

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Чтобы найти якорь по имени, дайте ему описательное имя, используя 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)
}

0 голосов
/ 13 марта 2020

Интерпретация информации из Apple TSI (id 731233593, если кто-то хочет сослаться на эту проблему в своем собственном TSI):

ARObjectAnchors не обязательно удаляются, когда объект выходит за пределы экрана. Это не поведение, на которое следует полагаться. Это относится к AR(SCNView|Session)Delegate.didRemove обратным вызовам и к содержимому ARFrame.anchors. Обратные вызовы определенно вызываются, только если клиентский код удаляет соответствующую привязку программным способом. Мне не удалось сжать лучшее объяснение официальной строки do c «ARKit может автоматически удалять якоря», несмотря на явный запрос. « Вам не нужно беспокоиться о том, почему это произошло. »

Синхронизация обратных вызовов didAdd или didUpdate является официальным методом. Доказательства Официальный проект Apple для создания объектов сканирования, файл Controllers/TestRun.swift метод startNoDetectionTimer. Использование тайм-аута 5 секунд.

Требование ARObjectAnchor для реализации ARTrackable рекомендуется заполнить запрос на улучшение в Feedback Assistant . Мне лично было рекомендовано исследовать альтернативы, и я обнаружил, что CoreML неожиданно дружественен и намного лучше подходит для моего варианта использования.

Спасибо @Andy за то, что он меня так сильно выдвинул.

...